对InputIterator语义/概念要求的困惑

Cha*_*l72 6 c++ iterator c++11

C++ InputIterator是Iterator概念中最受限制的类型之一.它只能保证支持解除引用,相等比较,预增量和后增量(以及后增量和取消引用)

因为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);
Run Code Online (Sandbox Code Playgroud)

value1保证是相同的值value2?(当然,提供任何类型的*it产生都实现了理智的平等比较语义)

Mik*_*our 9

value1保证是相同的值value2

是.事实上,你也可以复制的迭代器,以及拷贝是保证给予同样的结果,直到你递增迭代器之一:

auto it2 = it;
auto value3 = *it2;
assert(value3 == value1);

++it2;
auto value4 = *it; // ERROR: might not be dereferencable any more
Run Code Online (Sandbox Code Playgroud)

这由*aC++ 11表107(输入迭代器要求)中的要求指定:

如果a == b(a,b)是在域==*a相当于*b.

之后++r:

之前的任何值的副本r都不再需要可解除引用或属于其中==.

  • 事实上,最后一个引用是非常重要的,因为*"如果取消引用运算符,运算符*,每次取消引用时都保证返回相同的值,前提是你永远不会增加迭代器."*只保留了很长时间因为你没有增加任何可能的迭代器副本. (2认同)