输入迭代器和只读前向迭代器有什么区别?
由于后者是只读的,它们显然不能满足输出迭代器的要求。因此,它们实际上是具有额外保证(如果有的话)的输入迭代器。问题在于,这些额外保证是什么?
我猜测前向迭代器是多通道的,而输入迭代器则不是,我对吗?
输入迭代器和只读前向迭代器有什么区别?
由于后者是只读的,它们显然不能满足输出迭代器的要求。因此,它们实际上是具有额外保证(如果有的话)的输入迭代器。问题在于,这些额外保证是什么?
我猜测前向迭代器是多通道的,而输入迭代器则不是,我对吗?
是的,输入迭代器是单向迭代器。您只能对它们进行一次迭代,而前向迭代器则是多次迭代。
引用自§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
的两个可解引用迭代器a
和b
如果满足多次访问保证,则:
a == b
意味着++a == ++b
,并且X
是指针类型,或者表达式(void)++X(a), *a
等同于表达式*a
。