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

时间:2013-09-09 12:23:17

标签: c++ c++11 iterator

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);

value1保证与value2的值相同吗? (当然,提供任何类型的*it都可以实现理智的相等比较语义)

2 个答案:

答案 0 :(得分:9)

  

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值的任何副本都不再需要可解除引用或位于==的域中。

答案 1 :(得分:0)

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