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

13

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

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

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

1个回答

23

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

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

前提条件:r可以被解引用。
后置条件:r可以被解引用,或者r在尾端之后。
后置条件:上一个r的值的任何副本不再需要被解引用或处于==的域中。

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

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

引自§24.2.5 [forward.iterators]

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

  • [...]
  • X类型的对象提供下面描述的多次访问保证。

p3 类型X的两个可解引用迭代器ab如果满足多次访问保证,则:

  • a == b意味着++a == ++b,并且
  • X是指针类型,或者表达式(void)++X(a), *a等同于表达式*a

5
典型的例子可能是流迭代器(单遍、输入迭代器)和单向链表(多遍正向迭代器)。 - jalf
哦,顺便说一下,请接受我的点赞。+1 - jalf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接