C++阶段性学习总结3

常用的迭代器按功能强弱分为输入迭代器、输出迭代器、前向迭代器、双向迭代器、随机访问迭代器 5 种。常用的就是后三种,输入迭代器和输出迭代器比较特殊,它们不是把数组或容器当做操作对象,而是把输入流/输出流作为操作对象。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAaG9seV9qaWFu,size_10,color_FFFFFF,t_70,g_se,x_16watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAaG9seV9qaWFu,size_15,color_FFFFFF,t_70,g_se,x_16

string类也是随机访问迭代器。

输入迭代器(input iterator)
输入迭代器可以读取序列中的元素
输入迭代器必须支持:
用于比较两个迭代器的相等和不相等运算符(==、!=)
用于推进迭代器的前置和后置递增运算(++)
用于读取元素的解引用运算符(*);解引用只会出现在赋值运算符的右侧
箭头运算符(->)等价于(*it).member,即,解引用迭代器,并提取对象的成员
特点:
输入迭代器只用于顺序访问
对于一个输入迭代器,*it++保证是有效的,但递增它可能导致所有其他指向流的迭代器失效。其结果就是,不能保证输入迭代器的状态可以保存下来并用来访问元素。因此,输入迭代器只能用于单遍扫描算法
例如,算法find和accumlate要求输入迭代器,而istream_iterator是一种输入迭代器


输出迭代器(output iterator)
输出迭代器可以看做输入迭代器功能上的补集——只可以写而不可以读取元素
输出迭代器必须支持:
用于推进迭代器的前置和后置递增运算(++)
解引用运算符(*),只出现在赋值运算符的左侧(向一个已经解引用的输出迭代器赋值,僵尸将值写入它所指的元素)
特点:
我们只能向一个输出迭代器赋值一次
类似输入迭代器,输出迭代器只能用于单遍扫描算法。用作目的位置的迭代器通常都是输出迭代器
例如,copy算法的第三个参数就是输出迭代器,ostream_iterator类型也是输出迭代器


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


双向迭代器(binirectional iterator)
可以正向/反向读写序列中的元素
特点:
除了支持所有前向迭代器的操作之外,双向迭代器还支持前置和后置递减 运算符(--)
例如,算法reverse要求双向迭代器,除了forward_list容器之外,其他标准库都提供符合双向迭代器要求的迭代器


随机访问迭代器(random-access iterator)
提供在常量时间内访问序列中任意元素的能力,此类迭代器支持双向迭代器的所有功能
另外还支持:
用于比较两个迭代器相对位置的关系运算符(<、<=、>、>=)
迭代器和一个整数值的加减运算(+、+=、-、-=),计算结果是迭代器在序列中前进(或后退)给定整数个元素后的位置
用于两个迭代器上的减法运算符(-),得到两个迭代器的距离
下标运算符(iter[n]),与*(iter[n])等价

例如,算法sort要求随机访问迭代器。array、deque、string、vector的迭代器都是随机访问迭代器,用于访问内置数组元素的指针也是

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值