对输入迭代器语义/概念要求的混淆
Confusion over InputIterator semantics/concept requirements
C++ InputIterator
是迭代器概念中最有限的类型之一。 仅保证支持取消引用、相等比较、前递增和后递增(以及后递增和取消引用)
由于InputIterator
对象经常循环访问任意流,因此您甚至无法确定对同一输入进行两次迭代将产生相同的值。
但是,我很困惑,如果取消引用运算符 operator *
保证每次取消引用时都返回相同的值,前提是您永远不会递增迭代器。
例如,假设 std::begin(some_input_stream)
返回一个满足InputIterator
概念要求的对象,并且it
不等于或超过结束位置:
auto it = std::begin(some_input_stream);
auto value1 = *it;
auto value2 = *it;
assert(value1 == value2);
value1
保证与value2
相同的值吗? (当然,前提是无论产生什么类型*it
都实现了理智的相等比较语义)
value1
保证与value2
值相同吗?
是的。实际上,您也可以复制迭代器,并且该副本保证提供相同的结果,直到您递增其中一个迭代器:
auto it2 = it;
auto value3 = *it2;
assert(value3 == value1);
++it2;
auto value4 = *it; // ERROR: might not be dereferencable any more
这由 C++11 表 107(输入迭代器要求)中的*a
要求指定:
如果
a == b
和(a,b)
在==
域中,则*a
等效于*b
。
并且,在++r
之后:
不再需要以前值
r
的任何副本可取消引用或位于==
的域中。
我相信
它一定有效。对InputIterator
提出的要求有效地强制实现缓存上次读取的值,然后由 operator*
返回。
相关文章:
- 如何从高性能的输入迭代器返回变体?
- 如何实现构造函数,使其仅接受使用 typeid 的输入迭代器?
- 输入迭代器是否可以仅在赋值的右侧符号上取消引用?
- 输入迭代器的相等性比较
- 取消引用的输入迭代器的地址?istream_iterator的情况
- 为什么输入迭代器在递增后会使自身失效?
- 从 std::copy 和 std::copy_n 中提取输入迭代器
- 输入迭代器 - 星号和后缀运算符
- 输入迭代器可以重复读取,而输出迭代器只能写入一次
- 使用输入迭代器再次遍历容器
- 创建不存储value_type的输入迭代器
- 输入迭代器的示例`end()`实际上表示一个past-end-end
- 输入迭代器必须具有常量解引用运算符吗
- shared_ptr的输入迭代器
- C++Spirit Boost:将输入迭代器转换为前向迭代器
- 递增可变输入迭代器是否会使旧迭代器值失效
- <algorithm>在同一输入迭代器范围内并排运行两个
- 运算符 -> 不适用于自定义输入迭代器
- 从输入迭代器获取最后一项
- 异常规范和标准输入迭代器