C++ ISO标准中的多遍保证是什么?

13

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

从草案中得知:

如果类型为X的两个可解引用迭代器a和b满足以下条件,则它们提供多遍保证:
- a == b意味着++a == ++b
- X是指针类型或表达式(void)++X(a), *a等价于表达式*a。

[注意:要求a == b意味着++a == ++b(这对于输入和输出迭代器不成立),并且消除了通过可变迭代器进行赋值次数限制的限制(这适用于输出迭代器),允许使用带前向迭代器的多遍单向算法。 —注]

有人能以更简单的术语重新解释一下吗?我知道前向迭代器是多遍的,但我不明白如何根据C++标准的要求实现这一点。


2
+1,因为我认为即使它没有涉及特定的编程问题,它也适合这个社区,而且读 C++ 标准确实很困难。 - LihO
1个回答

18
术语已经说明了一切,我认为:您可以多次通过序列并记住序列中的位置。 只要序列不改变,从特定位置(迭代器)开始,您将按相同顺序遍历相同对象,无论您想要多少次。 但是,您只能向前移动,没有办法向后移动。 这种序列的典型示例是单链表。
引用从句基本上是说,如果您有两个相等的迭代器并且每个迭代器都递增,则它们会到达相同的位置,并且它们再次相等:
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无效和/或更改它所引用的值。

相比之下,单次遍历序列(按标准术语进行输入和输出迭代)只能被遍历一次:尝试多次遍历序列将不起作用。这类序列的典型示例是从键盘输入和输出到控制台:读取后,无法再次获取相同的字符,发送后也无法撤消字符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接