6

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产生什么类型都实现了合理的相等比较语义)

4

2 回答 2

9

保证与的value1值相同?value2

是的。事实上,您也可以复制迭代器,并且该副本保证会给出相同的结果,直到您增加其中一个迭代器:

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

++it2;
auto value4 = *it; // ERROR: might not be dereferencable any more

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

如果a == b(a,b)==then的域中*a等价于*b

并且,之后++r

之前的值的任何副本r不再需要是可解引用的或在 的域中==

于 2013-09-09T12:28:44.663 回答
0

我相信它必须有效。提出的要求InputIterator有效地强制实现缓存最后读取的值,然后由operator*.

于 2013-09-09T12:28:44.147 回答