输入迭代器和只读前向迭代器有什么区别?
因为后者是只读的,它们显然不能满足输出迭代器的要求。并且,正因为如此,它们实际上是具有额外保证(如果有的话)的输入迭代器。问题是,什么额外的保证?
我的猜测是前向迭代器是多遍的,而输入迭代器不是,对吗?
输入迭代器和只读前向迭代器有什么区别?
因为后者是只读的,它们显然不能满足输出迭代器的要求。并且,正因为如此,它们实际上是具有额外保证(如果有的话)的输入迭代器。问题是,什么额外的保证?
我的猜测是前向迭代器是多遍的,而输入迭代器不是,对吗?
是的,输入迭代器是一次性迭代器。您只能对它们进行一次迭代,而前向迭代器是多遍的。
从§24.2.3 [input.iterators] p2 (the table)
, 的前置/后置条件列++r
:
pre:
r
是可取消引用的。
post:r
是可取消引用的或者r
是过去的。
post: 之前值 of 的任何副本r
不再需要是可解引用的或在==
.
最后一个后置条件意味着 for不需要a == b
是。
同一条款,第 3 段:++a == ++b
true
[注意:对于输入迭代器,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
。