11

阅读 N3337-1 工作草案,C++ 编程语言标准,24.2.5 前向迭代器,第 806 页。

从草稿:

两个可取消引用的迭代器ab的类型在以下情况下X提供多遍保证:
a == b暗示++a == ++b并且
X是指针类型或表达式(void)++X(a), *a等价于表达式*a

[注意:a == b隐含的要求++a == ++b(对于输入和输出迭代器不正确)以及通过可变迭代器(适用于输出迭代器)取消对赋值数量的限制允许使用多遍单具有前向迭代器的定向算法。——尾注]

有人可以用更简单的术语重新解释这一点吗?我知道前向迭代器是多遍的,但我不明白这是如何按照 C++ 标准要求完成的。

4

1 回答 1

16

我认为这些术语说明了一切:您可以多次通过序列并记住序列中的位置。只要序列不改变,从特定位置(迭代器)开始,您就会以相同的顺序尽可能频繁地遍历相同的对象。但是,你只能前进,没有办法后退。像这样的序列的典型示例是单链表。

引用的子句基本上是说,如果你有两个比较相等的迭代器并且你递增它们中的每一个,你会到达相同的位置并且它们再次比较相等:

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和/或更改它所指的值。

相比之下,单遍序列(标准术语中的输入和输出迭代)只能遍历一次:尝试多次遍历序列不一定会奏效。此类序列的典型示例是从键盘输入并输出到控制台:一旦读取,您将无法再次取回相同的字符,一旦发送,您将无法撤消字符。

于 2013-10-06T19:45:23.490 回答