什么是每个C++ ISO标准的多次通过保证?

new*_*int 9 c++ iterator stl

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

来自草案:

两个可解除引用的迭代器ab类型X提供了多次通过保证,如果:
- a == bimplies ++a == ++b
- X是指针类型或表达式(void)++X(a), *a等价于表达式*a.

[注意:a == b暗示的要求++a == ++b(对于输入和输出迭代器不是这样)以及通过可变迭代器(适用于输出迭代器)去除对赋值数量的限制允许使用多遍 -具有前向迭代器的定向算法. - 尾注]

有人可以用更简单的术语重新解读这个吗?我知道Forward迭代器是多遍的,但我不明白这是如何根据C++标准要求完成的.

Die*_*ühl 15

这些术语说明了一切,我想:你可以多次通过序列并记住序列中的位置.只要序列没有改变,从特定位置(迭代器)开始,您将按照相同的顺序遍历相同的对象.但是,你只能前进,没有办法向后移动.像这样的序列的规范示例是单链表.

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

if (it1 == it2) {
    ++it1;
    ++it2;
    assert(it1 == it2); // has to hold for multi-pass sequences
}
Run Code Online (Sandbox Code Playgroud)

有些奇怪的表达式++X(a), *a基本上是为了使迭代器独立于a,++X(a), *a并且等效的要求*a基本上意味着使用独立迭代器对序列进行迭代并不会改变a引用的内容.这与输入迭代器不同,其中输入迭代器++InIt(a), *a不一定等同于*a第一个表达式可以改变位置,可能使其a所指的值无效和/或改变它.

相比之下,单程序列(标准术语中的输入和输出迭代)只能遍历一次:尝试多次遍历序列将无法正常工作.这样的序列的规范示例是从键盘输入并输出到控制台:一旦读取,您将无法再次返回相同的字符,一旦发送,您无法撤消字符.