C++迭代器

1. 迭代器

       理解迭代器是理解STL(Standard Template Library)的关键所在。模板使得算法独立于存储的数据类型,而迭代器使得算法独立于使用的容器类型。因此,它们都是STL通用方法的重要组成部分。

迭代器应该具备的一些简单特征:

  • 应该能够对迭代器执行解除引用的操作,以便能够访问它引用的值。即如果p是一个迭代器,则应该对*p进行定义。
  • 应该能够将一个迭代器赋值给另一个。即如果p和q都是迭代器,则应该对表达式p=q进行定义。
  • 应该能够将一个迭代器与另一个进行比较,看他们是否相等。即如果p和q都是迭代器,则应该对p==q和p!=q进行定义。
  • 应该能够使用迭代器遍历容器中的所有元素,这可以通过为迭代器p定义p++和++p来实现。

2. 迭代器类型

      不同的算法对迭代器的要求也不同。例如,查找算法需要定义++运算符,以便迭代器能够遍历整个容器;它要求能够读取数据,但不要求能够写数据(只查看不修改)。而排序算办法要求能够随机访问,以便能够交换不相邻的元素。如果iter是一个迭代器,则可以通过定义+运算符来实现随机访问,这样就可以使用像iter+10这样的表达式了。另外,排序算法还要求能够读写数据。

       STL定义了5种迭代器,并根据所需要的迭代器类型对算法进行了描述。分别是输入迭代器、输出迭代器、正向迭代器、双向迭代器和随机访问迭代器。

2.1 输入迭代器

       术语“输入”是从程序的角度出发的,即来自容器的信息被视为输入,就像来自键盘的信息对程序来说是输入一样。因此,输入迭代器可被程序用来读取容器中的信息。具体地说,对输入迭代器解除引用将使程序能够读取容器中的值,但不一定能够让程序修改容器中的值。因此,需要输入迭代器的算法将不会修改容器中的值。

       输入迭代器必须能够访问容器中的所有值,这是通过支持++运算符(前缀格式和后缀格式)来实现的。如果将输入迭代器设置为指向容器中的第一个元素,并不断将其递增,直到到达超尾位置,则它将依次指向容器中的每一个元素。注意,并不能保证输入迭代器第二次遍历容器时,顺序不变。另外,输入迭代器递增后,也不能保证其先前的值仍然可以被解除引用。基于输入迭代器的任何算法都应当是单通行的,不依赖于前一次遍历时的迭代器值,也不依赖与本次遍历中前面的迭代器值。

       注意,输入迭代器是单向迭代器,可以跌增,但不能倒退。

2.2 输出迭代器

       STL使用术语“输出”来指用于将信息从程序传输给容器的迭代器,因此程序的输出就是容器的输入。输出迭代器与输入迭代器相似,只是解除引让程序能够修改容器值,而不能读取。也许你会奇怪,能够写,却不能读。发送到显示器上的输出就是如戏,cout可以修改发送到显示器的字符流,却不能读取屏幕上的内容。STL足够通用,其容器可以表示输出设备,因此容器也可能如此。另外,若果算法不用读取作容器的内容就可以修改它(如通过生成要存储的新值),则没有理由要求它使用能够读取内容的迭代器。

       简而言之,对于单通行、只读算法,可以使用输入迭代器;而对于单通行、只写算法,则可以使用输出迭代器。

2.3 正向迭代器

       与输入迭代器和输出迭代器相似,正向迭代器只使用++运算符来遍历容器,所以它每次沿容器向前移动一个元素;然而,与输入迭代器和输出迭代器不同的是,它总是按相同的顺序遍历一系列值。另外,将正向迭代器递增后,仍然可以对前面的迭代器值解除引用(如果保存了它),并可以得到相同的值。这些特征使得多次通行算法成为可能。

       正向迭代器既可以使得能够读取和修改数据,也可以使得只能读取数据。

       int * pirw;              //读写迭代器

      const int  *pirw;    //只读迭代器

2.4双向迭代器

       假设算法需要能够双向遍历容器,情况将如何呢?例如,reverse函数可以交换第一个元素和最后一个元素、将指向第一个元素的指针加1、将指向第二个元素的指针减1,并重复这种处理过程。双向迭代器具有正向迭代器的所有特性,同时支持两种(前缀和后缀)递减运算。

2.5 随机访问迭代器

       有些算法(如标准排序和二分检索)要求能够直接跳到容器中的任何一个元素,这叫随机访问,需要随机访问迭代器。随机访问迭代器具有双向迭代器的所有特性,同时添加了支持随机访问的操作(如指正增加运算)和用于对元素进行排序的关系运算符。

 

       迭代器形成了一个层次结构。长相迭代器具有输入和输出迭代器的全部功能,同时还有自己的功能;双向迭代器具有正向迭代器的所有功能,同时还有自己的功能;随机访问迭代器具有双向迭代器的所有功能,同时还有自己的功能。

       在编写算法时,应尽可能得使用要求最低的迭代器,并让她适用于容器的最大区间。矢量迭代器是随机访问迭代器,它允许使用基于任何迭代器类型的算法。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值