输入迭代器和只读前向迭代器之间有什么区别?输入迭代器和只读前向迭代器之间有什么区别?
由于后者是只读的,它们显然不满足输出迭代器的要求。而且,正因为如此,它们才是有效的输入迭代器,并有额外的保证(如果有的话)。问题是,还有什么额外的保证?
我的猜测是,前向迭代器是多遍且输入迭代器不是,我说得对吗?
输入迭代器和只读前向迭代器之间有什么区别?输入迭代器和只读前向迭代器之间有什么区别?
由于后者是只读的,它们显然不满足输出迭代器的要求。而且,正因为如此,它们才是有效的输入迭代器,并有额外的保证(如果有的话)。问题是,还有什么额外的保证?
我的猜测是,前向迭代器是多遍且输入迭代器不是,我说得对吗?
是的,输入迭代器是一次迭代器。你只能遍历它们一次,而前向迭代器是多遍的。
从§24.2.3 [input.iterators] p2 (the table)
,的++r
前置/后置条件柱:
预:
r
是提领。
post:r
是可解引用的或r
已过时。
后:以前值r
的任何副本不再需要可解引用或位于==
的域中。
最后一个后置条件意味着对a == b
,++a == ++b
是不是要true
需要。
相同子句,第3段:
[注:对于输入迭代,一个== b并不意味着++一个== ++ b。 (相等并不保证置换属性或引用透明度。)输入迭代器上的算法不应该尝试两次通过相同的迭代器。他们应该是单传算法。 [...]通过
istream_iterator
类模板,这些算法可以与istreams一起用作输入数据的来源。 末端音符]
§24.2.5 [forward.iterators]
从
P1一个类或指针类型
X
满足如果
- [...]
- 对象的正向迭代的要求类型为
X
提供了多道保证,如下所述。P3两个提领迭代器和
X
类型说明B提供多遍保证如果:
a == b
意味着++a == ++b
和X
是指针类型或表达(void)++X(a), *a
相当于到表达式*a
。
所以典型的例子可能是一个流迭代器(单通,输入迭代器),和一个单向链表(多道前向迭代器) – jalf 2012-01-15 11:06:12
哦,顺便说一下,有一个upboat。 +1 – jalf 2012-01-15 12:24:03