【问题标题】:Are c++ forward/bidi/random iterators always output iterators?c++ 前向/双向/随机迭代器是否总是输出迭代器?
【发布时间】:2012-10-27 07:58:15
【问题描述】:

我在 STL 上看到许多文本(例如 http://www.cplusplus.com/reference/std/iterator/)暗示前向迭代器(以及扩展的 Bidi 和随机迭代器)必须同时满足输入和输出迭代器的要求。这对我来说似乎很奇怪,因为 const 迭代器显然是迭代器,但同样明显不是输出迭代器。

这种理解的真相是什么?是我不懂输出迭代器的概念,还是输出迭代器不属于迭代器的扩展需求顺序? (这个想法有更好的/官方名称吗?我的意思是随机迭代器也是双向迭代器,也是转发器......)

【问题讨论】:

    标签: c++ stl iterator


    【解决方案1】:

    C++03 说 (24.1/4):

    除了它的类别,前向、双向或随机访问 迭代器也可以是可变的或恒定的,这取决于是否 表达式 *i 的结果表现为参考或参考 为常数。常量迭代器不满足要求 输出迭代器,以及表达式 *i 的结果(对于常量 迭代器 i) 不能在左值为的表达式中使用 必填。

    cplusplus.com 选择不提。标准中的措辞令人困惑,因为它声明“前向迭代器满足输入和输出迭代器的所有要求”,并且与下一段中的一些前向迭代器不满足输出迭代器的要求相矛盾。

    C++11 简化了一点(24.2.1/3-4):

    前向迭代器满足输入迭代器的所有要求,并且 可以在指定输入迭代器时使用;双向 迭代器还满足前向迭代器的所有要求,并且 可以在指定前向迭代器时使用;随机访问 迭代器也满足双向迭代器的所有要求 并且可以在指定双向迭代器时使用。

    进一步满足输出迭代器要求的迭代器 称为可变迭代器。不可变的迭代器被称为 常量迭代器。

    【讨论】:

      【解决方案2】:

      是和不是。还有另一个适用于迭代器的限定条件: 他们是否允许改变序列。这个资格是 正交于正向、双向等。形式上,一个非变异 前向迭代器也必须是非变异输出迭代器。的 当然,非变异输出迭代器并没有多大意义, 一旦你从输出迭代器中删除了变异操作符, 剩下的不多,但更容易指定和描述 以这种方式迭代器,将变异/非变异视为 正交特性。

      【讨论】:

        猜你喜欢
        • 2012-12-13
        • 2011-07-09
        • 2020-04-23
        • 2017-09-02
        • 2014-01-20
        • 2016-01-10
        • 2019-01-17
        • 1970-01-01
        • 2019-12-06
        相关资源
        最近更新 更多