c++ - 对 InputIterator 语义/概念要求的混淆

标签 c++ c++11 iterator

C++ InputIterator 是迭代器概念中最有限的类型之一。它只保证支持解引用、相等比较、前自增和后自增(以及后自增和解引用)

因为 InputIterator 对象经常迭代任意流,您甚至不能确定对同一输入迭代两次会产生相同的值。

不过,我很困惑,如果取消引用运算符 operator * 每次取消引用时都能保证返回相同的值,前提是您从不递增迭代器。

例如,假设std::begin(some_input_stream)返回一个满足InputIterator概念要求的对象,而不等于到或超过结束位置:

auto it = std::begin(some_input_stream);
auto value1 = *it;
auto value2 = *it;
assert(value1 == value2);

是否保证 value1value2 的值相同? (当然,前提是 *it 产生的任何类型都实现了合理的相等比较语义)

最佳答案

Is value1 guaranteed to be the same value as 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 要求指定:

If a == b and (a,b) is in the domain of == then *a is equivalent to *b.

并且,在 ++r 之后:

Any copies of the previous value of r are no longer required either to be dereferenceable or to be in the domain of ==.

关于c++ - 对 InputIterator 语义/概念要求的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18698140/

相关文章:

c++ - 来自 IP 摄像机的 MJPEG 视频速度太快

c++ - C++ 中另一个带有闭包的抽象类问题

c++ - 基于范围的 for 如何适用于普通数组?

c++ - 这是对 std::array 未定义行为的使用吗?

css - 为什么有 std::vector 的迭代器

c++ - 如何防止 qmake 在此 "moc"构建方案中创建额外的 'out of source' 文件夹?

java - Java和C++进程之间的通信

c++ - 为什么我不能拥有指向与成员变量具有相同类型指针的对象的指针?

c++ - 类模板 "std::iterator"的参数列表丢失

c++ - 如何在不递增(递减)迭代器的情况下获取 std::list 中的下一个(上一个)元素?