C++迭代器

一、定义和初始化

要访问顺序容器和关联容器中的元素,需要通过“迭代器(iterator)”进行。迭代器是一个变量,相当于容器和操纵容器的算法之间的中介。迭代器可以指向容器中的某个元素,通过迭代器就可以读写它指向的元素。从这一点上看,迭代器和指针类似。
迭代器实际是一种泛型编程。泛型编程旨在使用同样的函数去处理数组、链表或其他容器。

迭代器按照定义方式分成以下四种。

  1. 正向迭代器,定义方法如下:

容器类名::iterator 迭代器名;

  1. 常量正向迭代器,定义方法如下:

容器类名::const_iterator 迭代器名;

  1. 反向迭代器,定义方法如下:

容器类名::reverse_iterator 迭代器名;

  1. 常量反向迭代器,定义方法如下:

容器类名::const_reverse_iterator 迭代器名;

二、迭代器的用法

迭代器支持以下操作:
(1)解引用,能够访问它引用的值
(2)将一个迭代器赋给另一个
(3)将一个迭代器与另一个迭代器比较(等于、不等于)
(4)遍历所有的元素。对正向迭代器进行++操作时,迭代器会指向容器中的后一个元素;而对反向迭代器进行++操作时,迭代器会指向容器中的前一个元素。

另外,STL 中有用于操作迭代器的三个函数模板,它们是:

advance(p, n):使迭代器 p 向前或向后移动 n 个元素。
distance(p, q):计算两个迭代器之间的距离,即迭代器 p
经过多少次 + + 操作后和迭代器 q 相等。如果调用时 p 已经指向 q 的后面,则这个函数会陷入死循环。
iter_swap(p, q):用于交换两个迭代器 p、q 指向的值。

三、迭代器类型

常用的迭代器按功能强弱分为输入、输出、正向、双向、随机访问五种,这里只介绍常用的三种。
常见的find函数需要一个输入迭代器

InputIterator find(InputIterator first, InputIterator last ,const T& value);

sort函数需要一个随机访问迭代器

void sort(RandomAccessIterator first, RandomAccessIterator last)

3.1 输入迭代器

容器的信息被视为输入,就像来自键盘的信息对于程序来说是输入一样。输入迭代器可被程序用来读取容器中的信息。简单来说,就是只读。
另外,输入迭代器是单向迭代器,可以递增,但是不能倒退,而且在第二次遍历容器时,不能保证结果是相同的,也不能保证还能访问。

3.2 输出迭代器

信息只能从程序传输到容器的迭代器,也就是只能修改容器解引用的值,但是不能读。

3.3 正向迭代器

正向迭代器只使用++符号来遍历容器,所以每次只能向前移动1位,然而,与输入输出迭代器不同的是,它总是按相应的顺序遍历一系列值,且正向迭代器递增后,仍可以对前面的迭代器解引用,并获得相同的值。
正向迭代器支持读、写操作。
假设 p 是一个正向迭代器,则 p 支持以下操作:++p,p++,*p。此外,两个正向迭代器可以互相赋值,还可以用==和!=运算符进行比较。

3.4 双向迭代器

双向迭代器。双向迭代器具有正向迭代器的全部功能。除此之外,若 p 是一个双向迭代器,则–p和p–都是有定义的。–p使得 p 朝和++p相反的方向移动。

3.5 随机访问迭代器。

随机访问迭代器具有双向迭代器的全部功能,还添加了随机访问的功能。若 p 是一个随机访问迭代器,i 是一个整型变量或常量,则 p 还支持以下操作:
p+=i:使得 p 往后移动 i 个元素。
p-=i:使得 p 往前移动 i 个元素。
p+i:返回 p 后面第 i 个元素的迭代器。
p-i:返回 p 前面第 i 个元素的迭代器。
p[i]:返回 p 后面第 i 个元素的引用。

不同容器对于迭代器的支持程度不同。
在这里插入图片描述

3.6 其他

每种容器还定义了一种名为const_iterator的类型。该类型的迭代器只能读取容器中的元素,不能用于改变其值。之前的例子中,普通的迭代器可以对容器中的元素进行解引用并修改,而const_iterator类型的迭代器只能用于读不能进行重写。例如可以进行如下操作:

for(vector<int>::const_iterator iter=ivec.begin();iter!=ivec.end();++iter)
     cout<<*iter<<endl;       //合法,读取容器中元素值

for(vector<int>::const_iterator iter=ivec.begin();iter!=ivec.end();++iter)
    *iter=0;        //不合法,不能进行写操作

const_iterator和const iterator是不一样的,后者对迭代器进行声明时,必须对迭代器进行初始化,并且一旦初始化后就不能修改其值。这有点像常量指针和指针常量的关系。例如:

vector<int>    ivec(10);
const    vector<int>::iterator    iter=ivec.begin();
*iter=0;    //合法,可以改变其指向的元素的值
++iter;    //不合法,无法改变其指向的位置
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值