3

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

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

4

2 回答 2

8

C++03 说 (24.1/4):

除了其类别之外,前向、双向或随机访问迭代器也可以是可变的或恒定的,具体取决于表达式 *i 的结果是作为引用还是作为对常量的引用。常量迭代器不满足输出迭代器的要求,并且表达式 *i(对于常量迭代器 i)的结果不能用于需要左值的表达式中。

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

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

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

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

于 2012-11-07T09:32:45.390 回答
0

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

于 2012-11-07T09:35:58.727 回答