输入迭代器和只读前向迭代器有什么区别?
因为后者是只读的,所以它们显然不满足输出迭代器的要求。而且,正因为如此,它们才能有效地输入迭代器并提供额外的保证(如果有的话)。问题是,有什么额外保证?
我的猜测是前向迭代器是多遍的,输入迭代器不是,我是对的吗?
答案 0 :(得分:21)
是的,输入迭代器是一次通过迭代器。你只能迭代它们一次,而前向迭代器是多遍的。
来自§24.2.3 [input.iterators] p2 (the table)
,++r
的前/后条件列:
pre:
r
是可解除引用的 帖子:r
可以取消引用或r
是过去的结尾 发布:不再需要将r
之前值的任何副本设置为可解除引用或位于==
的域中。
最后一个后置条件意味着对于a == b
,++a == ++b
不一定是true
。
同一条,第3款:
[注意:对于输入迭代器, a == b 并不意味着 ++ a == ++ b 。 (Equality不保证替换属性或引用透明性。)输入迭代器上的算法绝不应该尝试两次通过相同的迭代器。它们应该是单通算法。 [...]这些算法可以通过
istream_iterator
类模板与istream一起用作输入数据的来源。 -end note ]
来自§24.2.5 [forward.iterators]
p1类或指针类型
X
满足前向迭代器的要求
- [...]
X
类型的对象提供多次通过保证,如下所述。p3如果符合以下条件,则
X
类型的两个可解除引用的迭代器a和b提供多次通过保证:
a == b
隐含++a == ++b
和X
是指针类型,或者表达式(void)++X(a), *a
等同于表达式*a
。