STL中迭代器的介绍及分类

STL中迭代器的介绍及分类

  要访问顺序容器和关联容器中的元素,需要通过“迭代器(iterator)”进行。迭代器是一个变量,相当于容器和操纵容器的算法之间的中介。迭代器可以指向容器中的某个元素,通过迭代器就可以读写它指向的元素。从这一点上看,迭代器和指针类似。

一、按定义分类

迭代器按照定义方式分成以下四种
a. 正向迭代器,定义方法如下:
  容器类名::iterator 迭代器名;
b.常量正向迭代器,定义方法如下:
  容器类名::const_iterator 迭代器名;
c.反向迭代器,定义方法如下:
  容器类名::reverse_iterator 迭代器名;
d.常量反向迭代器,定义方法如下:
  容器类名::const_reverse_iterator 迭代器名;

用法:
  通过迭代器可以读取它指向的元素,*迭代器名就表示迭代器指向的元素。通过非常量迭代器还能修改其指向的元素。
  迭代器都可以进行++操作。反向迭代器和正向迭代器的区别在于:对正向迭代器进行++操作时,迭代器会指向容器中的后一个元素;而对反向迭代器进行++操作时,迭代器会指向容器中的前一个元素。

二、按功能分类

  不同容器的迭代器,其功能强弱有所不同。容器的迭代器的功能强弱,决定了该容器是否支持 STL 中的某种算法。例如,排序算法需要通过随机访问迭代器来访问容器中的元素,因此有的容器就不支持排序算法。
  常用的迭代器按功能强弱分为输入、输出、前向、双向、随机访问、反向五种,如下所列:
input_iterator
  提供读功能的向前移动迭代器,它们可被进行增加(++),比较与解引用()。
output_iterator
  提供写功能的向前移动迭代器,它们可被进行增加(++),比较与解引用(
)。
forward_iterator
  可向前移动的,同时具有读写功能的迭代器。同时具有input和output迭代器的功能,并可对迭代器的值进行储存。
bidirectional_iterator
  双向迭代器,同时提供读写功能,同forward迭代器,但可用来进行增加(++)或减少(–)操作。
random_access_iterator
  随机访问迭代器,提供随机读写功能.是功能最强大的迭代器, 具有双向迭代器的全部功能,同时实现指针般的算术与比较运算。
reverse_iterator
  如同随机迭代器或双向迭代器,但其移动是反向的。(Either a random iterator or a bidirectional iterator that moves in reverse direction.)(我不太理解它的行为)

下面着重介绍前向、双向、随机访问迭代器的区别:
a.前向迭代器
  假设 p 是一个前向迭代器,则 p 支持以下操作:++p,p++,*p。此外,两个正向迭代器可以互相赋值,还可以用==和!=运算符进行比较。
b.双向迭代器
  双向迭代器具有前向迭代器的全部功能。除此之外,若 p 是一个双向迭代器,则–p和p–都是有定义的。–p使得 p 朝和++p相反的方向移动。
c.随机访问迭代器
  随机访问迭代器具有双向迭代器的全部功能。若 p 是一个随机访问迭代器,i 是一个整型变量或常量,则 p 还支持以下操作:
  p+=i:使得 p 往后移动 i 个元素。
  p-=i:使得 p 往前移动 i 个元素。
  p+i:返回 p 后面第 i 个元素的迭代器。
  p-i:返回 p 前面第 i 个元素的迭代器。
  p[i]:返回 p 后面第 i 个元素的引用。
  此外,两个随机访问迭代器 p1、p2 还可以用 <、>、<=、>= 运算符进行比较。p1<p2的含义是:p1 经过若干次(至少一次)++操作后,就会等于 p2。其他比较方式的含义与此类似。
  对于两个随机访问迭代器 p1、p2,表达式p2-p1也是有定义的,其返回值是 p2 所指向元素和 p1 所指向元素的序号之差(也可以说是 p2 和 p1 之间的元素个数加一)。

下面列举了不同容器的迭代器的功能:

容器迭代器功能
vector随机访问
deque随机访问
list双向
set/multiset双向
map/multimap双向
stack不支持迭代器
queue不支持迭代器
priority_queue不支持迭代器

  要注意的是,在 C++ 中,数组也是容器。数组的迭代器就是指针,而且是随机访问迭代器。例如,对于数组 int a[10],int * 类型的指针就是其迭代器。则 a、a+1、a+2 都是 a 的迭代器。

三、迭代器操作相关函数

列举如下:

begin(); //返回指向第一个元素的iterator指针
end(); //返回指向最后一个元素再后面一个的iterator指针
rbegin(); //返回指向最后一个元素的reverse_iterator指针
rend(); //返回指向第一个元素再前面一个的reverse_iterator指针
cbegin(); //返回指向第一个元素的const_iterator指针
cend(); //返回指向最后一个元素再后面一个的const_iterator指针
crbegin(); //返回指向最后一个元素的const_reverse_iterator指针
crend(); //返回指向第一个元素再前面一个的const_reverse_iterator指针

四、迭代器的辅助函数

STL 中有用于操作迭代器的三个函数模板,它们是:

//要使用下列函数,需要包含头文件algorithm
advance(p, n); //使迭代器 p 向前或向后移动 n 个元素。
distance(p, q); //计算两个迭代器之间的距离,即迭代器 p 经过多少次 + + 操作后和迭代器 q 相等。如果调用时 p 已经指向 q 的后面,则这个函数会陷入死循环。
iter_swap(p, q); //用于交换两个迭代器 p、q 指向的值。
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

使君杭千秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值