c ++ forward / bidi / random迭代器总是输出迭代器吗?

时间:2012-11-07 09:27:30

标签: c++ stl iterator

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

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

2 个答案:

答案 0 :(得分:8)

C ++ 03说(24.1 / 4):

  

除了类别,还包括转发,双向或随机访问   迭代器也可以是可变的或不变的,具体取决于是否   表达式*的结果表现为引用或引用   一个常数。常量迭代器不满足要求   输出迭代器,以及表达式* i的结果(对于常量   迭代器i)不能在左值的表达式中使用   必需的。

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

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

  

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

     

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

答案 1 :(得分:0)

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