是否可以编写符合标准的随机访问(或至少前向)整数迭代器
Is it possible to write standard conforming random access (or at least forward) Integer Iterator?
假设我们有一个函数f
,它取整数并返回一个单调增加的值。我们想要找到极小的CCD_ 2使得CCD_。为了简单起见,假设答案在[l;r)
范围内。显然,我们可以编写自己的二进制搜索实现,但我们希望使用现有的实现(std::patition_point
)。
如此天真的实现将(可能)奏效:
// f;
std::vector<int> v(r - l);
std::iota(v.begin(), v.end(), l);
answer = l + partition_point(v.begin(), v.end(), [&](int x) {
return f(x) <= C;
}) - v.begin();
显而易见的问题是,我们必须存储所有的数字,这需要大量的内存,也需要时间来填充阵列
下一个逻辑思想是以这种方式将整数包装到迭代器:
struct IntIterator: std::iterator<std::random_access_iterator_tag, int> {
int current;
IntIterator(int i) : current(i) {}
int operator*() const { return current; }
IntIterator& operator++() { ++current; return *this; }
IntIterator& operator+=(size_t n) { current += (int)n; return *this; }
IntIterator operator+(size_t n) const { return current+(int)n; }
size_t operator-(IntIterator that) const { return size_t(current - that.current); }
// others operators to conform
};
answer = partition_point(IntIterator{l}, IntIterator{r}, [&](int x) {
return f(x) <= C;
});
这将适用于我的编译器(标准库),但不符合随机访问迭代器,因为
- 运算符*应返回
std::iterator_traits<IntIterator>::reference
如果我们将
std::iterator_traits<IntIterator>::reference
更改为int(例如,将模板参数更改为std::iterator
),它将无法满足前向迭代器的要求如果X是可变迭代器,则
reference
是对T的引用;如果X是常量迭代器,reference
是常量T的引用,如果我们将
operator*
的返回类型更改为[const ]T&
,它将无法满足前向迭代器的另一个要求如果a和b都是可解引用的,则
a == b
当且仅当*a
和*b
绑定到同一对象。
所以我不明白如何使它符合要求,并质疑它是否可能。
缓存映射将index映射到(count,value),其中count是该索引处的迭代器数。
迭代器会记住它是否调用了*
。
调用*
时,如果缺少该值,则会填充该值。不管怎样,计数都会递增,然后返回对值的引用。
当迭代器被破坏或迭代器移动(++
)时,如果调用了*
,则计数会递减。
如果计数减为零,则删除该条目。
这将缓存同一索引的所有有效迭代器在其集体重叠生存期内的值。
如果
x
0是可变迭代器,则reference
是对T
的引用;如果X
是常量迭代器,则reference
是对const T
的引用
我认为你不应该把这个要求看得太重。标准库包含一个容器(std::vector<bool>
),其const_iterator
和iterator
不能满足此要求。我知道有一种观点认为"std::vector<bool>
不是容器",但我更倾向于认为引用的要求限制性太强,而不是完全同意这种观点。
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 如何在c++迭代器类型中包装std::chrono
- 集合上的输出迭代器:assign和increment迭代器
- Boost Spirit,获取迭代器内部语义动作
- 对于set上的循环-获取next元素迭代器
- 为什么output_editor Concept不需要output_e迭代器标记
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 使用迭代器时如何访问对象在向量中的位置?
- 跟随整数索引列表的自定义类迭代器
- 我可以将迭代器递增一个整数吗?
- 迭代器和无符号整数的重载 + 运算符
- 元编程构造,它返回枚举的基础类型和迭代器的整数
- 将矢量迭代器与整数进行比较
- 减去迭代器和整数
- C :带有整数指数作为迭代器的圆形缓冲区
- C++整数类的范围 - 可供选择的迭代器类型
- C++从迭代器中获取整数形式的索引值
- 是否可以编写符合标准的随机访问(或至少前向)整数迭代器