对输入迭代器语义/概念要求的混淆

Confusion over InputIterator semantics/concept requirements

本文关键字:输入 迭代器 语义      更新时间:2023-10-16

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* 返回。