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

时间:2013-10-06 19:40:31

标签: c++ stl iterator

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

来自草稿:

如果符合以下情况,则两个类型为a的可解除引用的迭代器bX会提供多次通过保证:
- a == b隐含++a == ++b
- X是指针类型,或者表达式(void)++X(a), *a等同于表达式*a

[注意:a == b暗示++a == ++b的要求(对于输入和输出迭代器不是这样)并且通过可变迭代器去除对赋值数量的限制(适用)输出迭代器)允许使用带前向迭代器的多通道单向算法。 - 后注]

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

1 个答案:

答案 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>

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