【问题标题】:What is multi-pass guarantee per C++ ISO standard?每个 C++ ISO 标准的多遍保证是什么?
【发布时间】:2013-10-06 19:40:31
【问题描述】:

阅读 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++ 标准要求完成的。

【问题讨论】:

  • +1 因为我发现它适合这个社区,即使它没有解决特定的编程问题,而且确实可能​​很难阅读 C++ 标准。

标签: c++ stl iterator


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2010-10-13
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 2015-03-13
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多