C++的五类迭代器


前言:
根据算法所要求迭代器的操作,可将迭代器分为5个 迭代器类别
在这里插入图片描述
类似容器, 迭代器也定义了一组公共操作。一些操作所有迭代器都支持,另外一些只有特定类别的迭代器才支持。例如,ostream_iterator只支持递增、解引用和赋值。vector、string和deque的迭代器除了这些操作外,还支持递减、算法运算和关系运算。

C++标准指明了泛型和数值算法和每个迭代器参数的最小类别。对于向一个算法传递错误类别的迭代器的问题,很多编译器不会给出任何警告或提示。
学习课本:cpp primer

1、输入迭代器:可以读取序列中的元素

一个输入迭代器必须支持的操作:

1)用于比较两个迭代器的相等和不相等运算符(==、!=)

2)用于推进迭代器的前置和后置递增运算符(++)

3)用于读取元素的解引用运算符(*);解引用只会出现在赋值运算符的右侧(即val= *iter;)

4)箭头运算符(->),等价于(*it).member,即解引用迭代器,并提取对象的成员

输入迭代器只用于顺序访问。对于一个输入迭代器,*it++保证是有效的,但递增它可能导致所有其他指向流的迭代器失效。即,不能保证输入迭代器的状态可以保存下来,也不能保证用这个输入迭代器来访问元素。因此,输入迭代器只能用于单遍扫描算法。

总结一句话:输入迭代器主要用于读取容器的值。


2、输出迭代器:可以看成输入迭代器的补集——只写而不读取元素

一个输出迭代器必须支持:

1)用于推进迭代器的前置和后置递增运算符(++)

2)解引用运算符(*),只出现在赋值运算符的左侧(向一个已经解引用的输出迭代器赋值,就是将值写入它所指向的元素( *iter=val;)

我们只能向一个输出迭代器赋值一次类似输入迭代器,输出迭代器只能用于单遍扫描算法。用作目的位置的迭代器通常是输出迭代器。ostream_iterator类型就是输出迭代器。

总结一句话:输出迭代器主要利用一个容器的输入迭代器,将值写入到输出迭代器所指向的另一个容器中去。


3、前向迭代器:可以读写元素

前向迭代器只能在序列中沿一个方向移动。前向迭代器支持所有输入和输出迭代器的操作,而且可以多次读写同一个元素。因此,我们可以保存前向迭代器的状态,使用前向迭代器的算法可以序列进行多遍扫描。算法replace要求前向迭代器,forward_list上的迭代器也是前向迭代器。


4、双向迭代器:可以正向/反向读写序列中的元素

除了支持前向迭代器的操作之外,双向迭代器还支持前置和后置递减运算符(–)。算法reverse要求双向迭代器,除了forword_list之外,其他标准库都提供符合双向迭代器要求的迭代器。


5、随机访问迭代器:提供在常数时间内访问任意元素的能力

此类迭代器支持双向迭代器的所有功能,还支持下表的所有操作。
在这里插入图片描述
1)用于比较两个迭代器相对位置的关系运算符(<、<=、>和>=)

2)迭代器和一个整数值的加减运算(+,+=,-和-=),计算结果是迭代器在序列中前进或后退给定的整数个元素后的位置

3)用于两个迭代器上的减法运算符(-),得到两个迭代器的距离

4)下标运算符(iter[n])与*( *iter[n])等价
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值