阅读工作草案N3337-1,编程语言C ++标准,24.2.5转发迭代器,第806页。
来自草稿:
如果符合以下情况,则两个类型为a
的可解除引用的迭代器b
和X
会提供多次通过保证:
- a == b
隐含++a == ++b
和
- X
是指针类型,或者表达式(void)++X(a), *a
等同于表达式*a
。
[注意:a == b
暗示++a == ++b
的要求(对于输入和输出迭代器不是这样)并且通过可变迭代器去除对赋值数量的限制(适用)输出迭代器)允许使用带前向迭代器的多通道单向算法。
- 后注]
有人可以用更简单的术语重新解读这个吗?我知道Forward迭代器是多遍的,但我不明白这是如何根据C ++标准要求完成的。
答案 0 :(得分:13)
这些术语说明了一切,我想:你可以多次通过序列并记住序列中的位置。只要序列没有改变,从特定位置(迭代器)开始,您将按照相同的顺序遍历相同的对象。但是,你只能前进,没有办法向后移动。像这样的序列的规范示例是单链表。
引用的子句基本上说,如果你有两个迭代器比较相等并且你递增它们中的每一个,你就到达相同的位置并且它们再次相等:
if (it1 == it2) {
++it1;
++it2;
assert(it1 == it2); // has to hold for multi-pass sequences
}
有点奇怪的表达式++X(a), *a
基本上是为了推进独立于a
的迭代器,并且++X(a), *a
等同于*a
的要求基本上意味着对序列的迭代器使用独立迭代器不会更改a
引用的内容。这与输入迭代器不同,其中++InIt(a), *a
不一定等同于*a
,因为第一个表达式可以改变位置,可能使a
无效和/或更改它所引用的值。 / p>
相比之下,单程序列(标准术语中的输入和输出迭代)只能遍历一次:尝试多次遍历序列将无法正常工作。像这样的序列的规范示例是从键盘输入并输出到控制台:一旦读取,您再也无法取回相同的字符,一旦发送,您就无法撤消字符。