13.5.2 迭代器类型
不同的算法对迭代器的要求不同,为此STL定义了5种迭代器,即随机访问迭代器(RandomAccessIterator)、双向迭代器(BidirectionalIterator)、前向迭代器(ForwardIterator)、输入迭代器(InputIterator)和输出迭代器(OutputIterator),其层次结构如图13.1所示。
按图13.1所示的箭头方向,迭代器实现的功能越来越少,对其使用限制越来越多,下面分别对5种类型进行介绍。
1.输入迭代器
可以被用来读取容器中的元素但是不保证支持向容器的写入操作,“输入”是相对于程序而言的,换言之不能使用输入迭代器修改容器对象中元素的值。
图 13.1 迭代器层次结构图
输入迭代器实现了下述必备功能。
❑两个iterator的相等和不相等测试。
❑前置++和后置++递增iterator指向下一个元素,以实现容器中元素的遍历。
❑通过解引用操作符operator*读取一个元素。
2.输出迭代器
输出迭代器可被认为是与输入迭代器功能相反的迭代器,可用其向容器中写入元素(修改元素的值),但不能读取容器中的元素。
3.前向迭代器
与输入迭代器和输出迭代器一样,前向迭代器只使用++来遍历容器,这也是命名“前向”的由来。前向迭代器既可以读取数据,也可以修改数据。如果使用const来修饰前向迭代器对象,则该迭代器对象只能用来读取数据。
前向迭代器可以看成是输入迭代器和输出迭代器双向功能的集成。
4.双向迭代器
双向迭代器可以从两个方向对一个容器进行读写。除了同前向迭代器能够实现的功能外,双向迭代器还支持前后缀的递减操作。
5.随机访问迭代器
只有随机访问迭代器能够支持随机访问,能够直接跳到容器中的任何一个元素处,对其进行读写操作。除了能够实现双向迭代器的功能外,随机访问迭代器还添加了支持随机访问的操作(重载了[]操作符)和用于对元素进行排序的关系操作符,如表13.6所示,其中,o1和o2是迭代器变量,v1和v2是o1和o2的值,n为整数。
注意
迭代器增减时,只有当表达式仍在容器区间内时才合法。