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 指向的值。

STL中迭代器的介绍及分类相关推荐

  1. STL中迭代器的作用,有指针为何还要迭代器

    请你来说一下STL中迭代器的作用,有指针为何还要迭代器 参考回答: 1.迭代器 Iterator(迭代器)模式又称Cursor(游标)模式,用于提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴 ...

  2. C++---STL中迭代器失效的总结

    我们在使用STL底层给我们提供的一些容器的时候,当我们给一个容器中增加(insert)或删除(erase),最有可能出现迭代器失效. 什么是迭代器失效 在对容器进行操作的时候,由于一些操作,使得元素保 ...

  3. C++ STL中哈希表 hash_map介绍

    0 为什么需要hash_map 用过map吧?map提供一个很常用的功能,那就是提供key-value的存储和查找功能.例如,我要记录一个人名和相应的存储,而且随时增加,要快速查找和修改: 岳不群-华 ...

  4. 【C++】STL中 list 反向迭代器的模拟实现

    在上篇文章实现了 list 后,我们实现了其对应的迭代器,但是对于 list,还有一个反向迭代器我们呢没有实现,但是反向迭代器不仅仅可以在 list 中使用,在 vector 中我们进行适配,同样也可 ...

  5. STL中的模板类map的介绍

    STL中的模板类map的介绍 佟强 2008.11.5 map的元素是由key和value两个分量组成的对偶(key,value).key是键,value是与键key相关联的映射值.元素的键key是唯 ...

  6. 关于STL中的map和hash_map

    在网上看到有关STL中hash_map的文章,以及一些其他关于STL map和hash_map的资料,总结笔记如下:     1.STL的map底层是用红黑树实现的,查找时间复杂度是log(n):   ...

  7. STL中list类的自己简单实现

    前面写了STL中关于string类和vector类的简单实现,要想成体系学习的小伙伴可以看一看(48条消息) STL中vector类的自我简单实现_芜湖开冲-的博客-CSDN博客https://blo ...

  8. C++STL中的unique函数解析

    一.总述 unique函数属于STL中比较常用函数,它的功能是元素去重.即"删除"序列中所有相邻的重复元素(只保留一个).此处的删除,并不是真的删除,而是指重复元素的位置被不重复的 ...

  9. [C++ STL] 各容器简单介绍

    [C++ STL] 各容器简单介绍 目录 一.什么是STL? 二.容器(Containers) 2.1 vector 2.2 deque 2.3 list 2.4 set 2.5 map 2.6 容器 ...

  10. STL中list用法详解

    本文转载自百度文库.作者如下.其中下面的count, count_if等函数的使用有些陈旧,如在编译时遇到问题,请百度. 标准模板库(STL)介绍 作者:Scott Field 本文以List容器为例 ...

最新文章

  1. 预留在PP模块里面的作用
  2. 平面最接近点对问题(分治)
  3. LeNet试验(一) 搭建pytorch版模型及运行
  4. android宿舍管理系统源码,基于android操作系统的手机宿舍管理系统使用手册
  5. wegame饥荒一直登录中_经历网游和单机发行的左右摇摆后,Wegame决定“我全都要”...
  6. pytorch 对抗样本_【天池大赛】通用目标检测的对抗攻击方法一览
  7. java操作ElasticSearch(es)进行增删查改操作
  8. Cocos2d-x——导入Cocostudio资源
  9. String的创建和常量池的关系,intern()相关问题
  10. Codechef Black Nodes in Subgraphs(树型背包)
  11. 鸿蒙升级之前APP没有,升级鸿蒙2.0之后,没有原生的日历app了
  12. linux 水印软件下载,水印美图滤镜相机
  13. 怎样更改itunes备份位置_iTunes备份路径怎么改?教你无脑修改iPhone备份文件路径...
  14. 双人对战的球类游戏ios源码项目
  15. 妇产科护理学复习重点
  16. Spring启动,constructor,@PostConstruct,afterPropertiesSet,onApplicationEvent执行顺序 原创 2016年09月29日 11:39:2
  17. BT源代码学习心得(十五):客户端源代码分析(下载过程中的块选取策略)
  18. AOR4 原始对偶方法
  19. 电商新系统如何应对峰值
  20. Android 给地震监视器添加Notification

热门文章

  1. 阿里巴巴图片滚动代码html,阿里旺铺装修代码的fx.roll滚动特效组件使用详解及HTML代码示例...
  2. 数仓系列 | Flink 窗口的应用与实现
  3. java 神经网络算法_70行Java代码实现深度神经网络算法分享
  4. 严格对角占优矩阵特征值_MIT—线性代数笔记21 特征值和特征向量
  5. chown: `mysql#039;: invalid user_centos无法正常启动,报chown: invalid user:'root:root'
  6. java为什么要设计包装类_Java 为什么需要包装类
  7. ug区域轮廓铣没有重叠距离_UG编程轮廓铣的切削参数“清理几何体”,360°无死角扫除!...
  8. mysql indexkey提取,MySQL元数据获取基础笔记day06
  9. java json jquery_JQuery提交JSON string数据
  10. pythonATM,购物车项目实战3-视图函数