13

输入迭代器和只读前向迭代器有什么区别?

因为后者是只读的,它们显然不能满足输出迭代器的要求。并且,正因为如此,它们实际上是具有额外保证(如果有的话)的输入迭代器。问题是,什么额外的保证?

我的猜测是前向迭代器是多遍的,而输入迭代器不是,对吗?

4

1 回答 1

23

是的,输入迭代器是一次性迭代器。您只能对它们进行一次迭代,而前向迭代器是多遍的。

§24.2.3 [input.iterators] p2 (the table), 的前置/后置条件列++r

pre:r是可取消引用的。
post:r是可取消引用的或者r是过去的。
post: 之前值 of 的任何副本r不再需要是可解引用的或在==.

最后一个后置条件意味着 for不需要a == b是。 同一条款,第 3 段:++a == ++btrue

[注意:对于输入迭代器,a == b并不意味着++a == ++b。(相等性不保证替换属性或引用透明性。)输入迭代器的算法永远不应该尝试通过同一个迭代器两次。它们应该是单通道算法。istream_iterator[...] 这些算法可以通过类模板与 istreams 一起用作输入数据的来源。——尾注]

§24.2.5 [forward.iterators]

p1 一个类或指针类型X满足前向迭代器的要求,如果

  • [...]
  • 类型的对象X提供多次通过保证,如下所述。

p3 两个可解引用的迭代器 a 和 b 类型X提供多遍保证,如果:

  • a == b暗示++a == ++b
  • X是指针类型或表达式(void)++X(a), *a等价于表达式*a
于 2012-01-15T10:58:27.363 回答