【发布时间】:2012-02-10 18:00:38
【问题描述】:
输入迭代器和只读前向迭代器有什么区别?
由于后者是只读的,它们显然不能满足输出迭代器的要求。并且,正因为如此,它们实际上是具有额外保证(如果有的话)的输入迭代器。问题是,有哪些额外的保证?
我的猜测是,前向迭代器是多通道的,而输入迭代器不是,对吗?
【问题讨论】:
标签: c++ iterator c++-standard-library
输入迭代器和只读前向迭代器有什么区别?
由于后者是只读的,它们显然不能满足输出迭代器的要求。并且,正因为如此,它们实际上是具有额外保证(如果有的话)的输入迭代器。问题是,有哪些额外的保证?
我的猜测是,前向迭代器是多通道的,而输入迭代器不是,对吗?
【问题讨论】:
标签: c++ iterator c++-standard-library
是的,输入迭代器是一次性迭代器。您只能对它们进行一次迭代,而前向迭代器是多遍的。
来自§24.2.3 [input.iterators] p2 (the table),++r 的前置/后置列:
pre:
r是可取消引用的。
post:r是可解引用的或r是过去的。
post:r的先前值的任何副本不再需要可解引用或在域中的==。
最后一个后置条件意味着对于a == b,++a == ++b 不需要是true。
相同的条款,第 3 段:
[ 注意: 对于输入迭代器,a == b 并不意味着 ++a == ++b。 (相等性不保证替换属性或引用透明性。)输入迭代器的算法不应该尝试通过同一个迭代器两次。它们应该是单程算法。 [...] 这些算法可以通过
istream_iterator类模板与 istreams 一起用作输入数据的来源。 ——尾注 ]
来自§24.2.5 [forward.iterators]
p1 一个类或指针类型
X满足前向迭代器if的要求
- [...]
X类型的对象提供多次通过保证,如下所述。p3
X类型的两个可解引用迭代器 a 和 b 提供 多次通过保证,如果:
a == b暗示++a == ++b和X是指针类型或表达式(void)++X(a), *a等价于表达式*a。
【讨论】: