迭代器类别

简介: 迭代器类别 输入迭代器 输入迭代器:可以读取序列中的元素。一个输入迭代器必须支持 用于比较两个迭代器的相等和不相等运算符(==、!=) 用于推进迭代器的前置和后置递增运算(++) 用于读取元素的解引用运算符(*);解引用只会出现在赋值运算符的右侧 箭头运算符(->),等价于(*it).member,即,解引用迭代器,并提取对象的成员 输入迭代器只用于顺序访问。

迭代器类别

输入迭代器

输入迭代器:可以读取序列中的元素。一个输入迭代器必须支持

  • 用于比较两个迭代器的相等和不相等运算符(==、!=)
  • 用于推进迭代器的前置和后置递增运算(++)
  • 用于读取元素的解引用运算符(*);解引用只会出现在赋值运算符的右侧
  • 箭头运算符(->),等价于(*it).member,即,解引用迭代器,并提取对象的成员

输入迭代器只用于顺序访问。对于一个输入迭代器,*it++保证是有效的,但递增它可能导致所有其他指向流的迭代器失效。其结果就是,不能保证输入迭代器的状态可以保存下来并用来访问元素。因此,输入迭代器只能用于单遍扫描算法。算法find和accumulate要求输入迭代器;而istream_iterator是一种输入迭代器。

输出迭代器

输出迭代器:可以看做输入迭代器功能上的补集——只写而不读元素。输出迭代器必须支持

  • 用于推进迭代器的前置和后置递增运算(++)
  • 解引用运算符(*),只能出现在赋值运算符的左侧(向一个已经解引用的输出迭代器赋值,就是将值写入它所指向的元素)

我们只能向一个输出迭代器赋值一次。类似输入迭代器,输出迭代器只能用于单遍扫描算法。用作目的位置的迭代器通常都是输出迭代器。例如,copy函数的第三个参数就是输出迭代器。ostream_iterator类型也是输出迭代器。

前向迭代器

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

双向迭代器

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

随机迭代器

随机访问迭代器:提供在常量时间内访问序列中的任意元素的能力。此类迭代器支持双向迭代器的所有功能,此外还支持如下的操作:

  • 用于比较两个迭代器相对位置的关系运算符(<、<=、>和>=)
  • 迭代器和一个整数值的加减运算(+、+=、-和-=),计算结果是迭代器在序列中前进(或后退)给定整数个元素后的位置
  • 用于两个迭代器上的减法运算符(-)得到两个迭代器的距离
  • 下标运算符(iter[n],与*(iter[n])等价

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

相关文章
|
6月前
|
算法 编译器 C语言
【C++ 迭代器的空类类型 】深入理解C++迭代器类别与空类标签的奥秘
【C++ 迭代器的空类类型 】深入理解C++迭代器类别与空类标签的奥秘
62 0
|
3月前
|
存储 搜索推荐 Java
|
5月前
|
编译器 C++
C++ 反向迭代器的设计与实现
C++ 反向迭代器的设计与实现
|
12月前
|
存储 C++ 容器
|
6月前
|
算法 数据处理 C语言
【C++迭代器深度解析】C++迭代器类型之间的继承关系与反向迭代器的独特性
【C++迭代器深度解析】C++迭代器类型之间的继承关系与反向迭代器的独特性
95 0
|
6月前
|
并行计算 算法 安全
【C++ 迭代器 】C++ 迭代器标签的使用场景
【C++ 迭代器 】C++ 迭代器标签的使用场景
79 0
【面向对象的三大特征以及迭代器生成器】
【面向对象的三大特征以及迭代器生成器】
34 0
|
存储 C++
反向迭代器和正向迭代器
反向迭代器和正向迭代器 1. 正向迭代器 1.1 list结构 先来看list(双向带头链表):从结构到框架到代码
80 0
python实现将给定列表划分为元素和大致相等的两个子列表
python实现将给定列表划分为元素和大致相等的两个子列表