首页 > 编程笔记

C++迭代器汇总(5种)

通过迭代器既可分离容器与算法,又可连接容器与算法。从容器的角度看,只需提供适当的迭代器,就可以遍历容器中的数据,而不必关心数据将用于何种操作;从算法的角度看,只需要通过迭代器操作数据,不必关心是什么类型的容器。

容器设计者只需要专注于容器的设计,算法设计者只需要专注于算法的设计,这样就可以很好地实现数据结构与算法的分离。

STL提供了五种基本的迭代器:输入迭代器、输出迭代器、前向迭代器、双向迭代器和随机迭代器。本文将针对这五种迭代器进行讲解。

输入迭代器与输出迭代器

输入迭代器和输出迭代器是最基本、要求最低的迭代器,几乎所有的迭代器都具备这两个迭代器的功能。

1) 输入迭代器

输入迭代器(Input Iterator)只能一次一个地向后读取元素,并按此顺序传回元素值。输入迭代器支持对序列进行不可重复的单向遍历。

表1 输入迭代器支持的操作
方法 含义
*itr 读取实际元素
itr->member 读取实际元素的成员
++itr 向前前进一个单位,传回新的位置
itr++ 向前前进一个单位,传回旧的位置
itr1==itr/itr!=itr2 判断迭代器是否相等
itr1 =itr2 迭代器赋值
拷贝构造 复制迭代器

输入迭代器只能读取元素一次,迭代器移动到下一个位置后,不能保证之前的迭代器还有效,即执行−−itr不能保证还能读取到原来的元素。

如果有两个输入迭代器 itr1 和 itr2,且有 itr1==itr2,但这并不保证 ++itr1==++itr2,更不能保证 *(++itr1)==*(++itr2)。因此,使用输入迭代器读入的序列不能保证是可重复的。

2) 输出迭代器

输出迭代器(Output Iterator)与输入迭代器相反,其作用是将元素逐个写入容器。

输出迭代器也支持对序列进行单向遍历,当把迭代器移到下一个位置后,也不能保证之前的迭代器是有效的。

表2 输出迭代器支持的操作含义
方法 含义
*itr=val 将元素写入迭代器位置
++itr 向前前进一个单位,传回新的位置
itr++ 向前前进一个单位,传回旧的位置
itr1=itr2 迭代器赋值
拷贝构造 复制迭代器

前向迭代器

前向迭代器(Forward Iterator)是输入迭代器和输出迭代器的集合,具有输入迭代器和输出迭代器的全部功能。

前向迭代器支持对序列进行可重复的单向遍历,可以多次解析一个迭代器指定的位置,因此可以对一个值进行多次读写。

前向迭代器去掉了输入迭代器与输出迭代器的一些不确定性,例如,如果有两个前向迭代器 itr1 和 itr2,且有 itr1==itr2,那么 ++itr1==++itr2 一定是成立的。前后两次使用相等的前向迭代器读取同一个序列,只要序列的值在这个过程中没有被改写,就一定会得到相同的结果。

双向迭代器与随机访问迭代器

双向迭代器(Bidirectional Iterator)是在前向迭代器的基础上增加了一个反向操作,即双向迭代器既可以前进,又可以后退,因此它比前向迭代器新增一个功能,可以进行自减操作,如itr−−或者−−itr

随机访问迭代器(Random Iterator)是在双向迭代器的基础上又支持直接将迭代器向前或向后移动 n 个元素,而且还支持比较运算的操作。因此,随机访问迭代器的功能几乎和指针一样。

表3 随机访问迭代器支持的操作含义
方法 含义
itr[n] 获取索引位置为 n 的元素
itr+=n
itr-=n
向前或者向后跳 n 个元素的位置
itr+n 返回 itr 后第 n 个元素的位置
n+itr 返回 itr 后第 n 个元素的位重
itr-n 返回 itr 之前第 n 个元素的位置
itr1-itr2 返回 itr1 与 itr2 之间的距离
itr1<itr2
itr1>=itr2
判断 itr1 是否在 itr2 之前

优秀文章