
迭代器(转载有删改)
发布日期:2021-05-08 02:10:26
浏览次数:22
分类:精选文章
本文共 1618 字,大约阅读时间需要 5 分钟。
原网址:
1.迭代器的使用
为了提高C++编程的效率,STL中提供了许多容器,包括vector、list、map、set等。 有些容器例如vector可以通过脚标[ ]索引的方式访问容器里面的数据,但是大部分的容器不能使用这种方式,例如list、map、set。(注:可以得出一个做题结论:全用迭代器尽量少出bug) STL中每种容器在实现的时候设计了一个内嵌的iterator类,不同的容器有自己专属的迭代器,使用迭代器来访问容器中的数据。 除此之外,通过迭代器,可以将容器和通用算法结合在一起,只要给予算法不同的迭代器,就可以对不同容器执行相同的操作,例如find查找函数。 迭代器对指针的一些基本操作如*、->、++、==、!=、=进行了重载,使其具有了遍历复杂数据结构的能力,其遍历机制取决于所遍历的数据结构,所有迭代的使用和指针的使用非常相似。通过begin,end函数获取容器的头部和尾部迭代器,end 迭代器不包含在容器之内,当begin和end返回的迭代器相同时表示容器为空。2.迭代器的种类
根据迭代器所支持的操作,可以把迭代器分为5类。-
输入迭代器:是只读迭代器,在每个被遍历的位置上只能读取一次。例如上面find函数参数就是输入迭代器。
-
输出迭代器:是只写迭代器,在每个被遍历的位置上只能被写一次。
-
前向迭代器:兼具输入和输出迭代器的能力,但是它可以对同一个位置重复进行读和写。但它不支持operator–,所以只能向前移动。
-
双向迭代器:很像前向迭代器,只是它向后移动和向前移动同样容易。
-
随机访问迭代器:有双向迭代器的所有功能。而且,它还提供了“迭代器算术”,即在一步内可以向前或向后跳跃任意位置, 包含指针的所有操作,可进行随机访问,随意移动指定的步数。支持前面四种Iterator的所有操作,并另外支持it + n、it - n、it += n、 it -= n、it1 - it2和it[n]等操作。
STL每种容器类型都定义了 const_iterator,只能读取容器的值,不能修改所指向容器范围内元素的值。记住:vector、string、deque随机存取迭代器;list、set、map、mutiset、multimap双向迭代器。
3.迭代器失效
容器的插入insert和erase操作可能导致迭代器失效,对于erase操作不要使用操作之前的迭代器,因为erase的那个迭代器一定失效了,正确的做法是返回删除操作时候的那个迭代器。
#includeusing namespace std;int main(int argc, const char *argv[]) { int arr[5] = { 1, 2, 3, 4, 5 }; vector iVec(arr, arr + 5); //定义容器vector //迭代器失效// for (vector ::iterator it = iVec.begin(); it != iVec.end();) {// iVec.erase(it);// } //返回erase操作之后的迭代器 for (vector ::iterator it = iVec.begin();it != iVec.end();) { it = iVec.erase(it); } return 0;}
各容器支持迭代器的类别
每种容器类型都定义了自己的迭代器类型,如vector:vector< int>:: iterator iter; //定义一个名为iter的变量,数据类型是由vector< int>定义的iterator 类型。常用迭代器类型如下:
发表评论
最新留言
不错!
[***.144.177.141]2025年04月20日 07时02分40秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
java基础-java与c#接口不同点
2021-05-13
Java并发工具篇
2021-05-13
第三方支付(支付宝)
2021-05-13
nginx基本配置
2021-05-13
京喜小程序体验评分优化实践
2021-05-13
ASP.NET的运行原理与运行机制
2021-05-13
DIV+CSS兼容IE6、IE7、Firefox方法探究
2021-05-13
加速IE的Javascript的方法
2021-05-13
vs2010下载地址
2021-05-13
VS新建类自动添加版本注释
2021-05-13
C#中文转换成拼音
2021-05-13
C#批量上传图片
2021-05-13
【亚马逊运营】有关滞销库存的处理方法之站外清库存法!
2021-05-13
解决TomCat中文乱码和InteliJ IDEA中文乱码问题
2021-05-13
pyhon中安装win32com模块
2021-05-13
C++错误笔记
2021-05-13
解决 MySQL 8.0 客户端连接 caching_sha2_password 问题
2021-05-13
GZIP压缩和解压缩不删除原始文件
2021-05-13
【无线通信模块】GPRS DTU不稳定和容易掉线原因
2021-05-13