C++标准库 第七章 STL迭代器
2021/12/3 14:06:58
本文主要是介绍C++标准库 第七章 STL迭代器,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
迭代器
- 能力:行进和存取的能力
Input迭代器
- 一次一个向前读取元素,按此顺序一个一个返回元素
- 例子:从标准输入装置(键盘) 读取数据,同一个数据不会被读取两次,流水一样,指向的是逻辑位置
- 使用前置式递增运算符 ++x 替代后置式递增运算符x++,前者不需要返回旧的数值,不需要花费一个对象来保存旧的数值
- Input无递减运算操作符号
Output输出迭代器
- 和input迭代器相反,作用是将元素数值一个一个写入。不可以使用输出迭代器对同一序列进行两次遍历写入、
- operator* 只有在赋值语句的左手边才会有效
- 输出迭代器没有比较操作,无法检测 输出迭代器是否有效,或者写入数据是否成功
- 例子:inserters用于将元素插入到容器内的一种迭代器,对其赋予一个新的数值,就会将其安插在容器内部,元素之前不会被覆盖
Forward (前向)迭代器
- forward前向迭代器是 input(全部功能)和output(部分功能)迭代器的结合。
- 区别于输出迭代器,前向迭代器可以多次指向同一群集中的同一个元素,并可以多次处理同一个元素
// Ok for output iterators // Error for forward iterators while(true){ *pos = foo(); ++pos; } // Ok for forward iterators // Error for output iterators while(pos != coll.end()){ *pos = foo(); ++pos; }
- forward迭代器提领数据之前需要确保数据有效,如果使用while(true),就会出现错误,因为forward会访问 end()对应的元素,引发错误
- 输出迭代器不可以使用 这个循环 while(pos != coll.end()) ,因为其没有定义operator!=
Bidirectional
Random Access (随机存取)迭代器
- 需要提供迭代器的算数运算,类似于指针的算数运算,也就是加减某一个特定的偏移量,能处理距离问题,使用诸如 < >等相互关系运算符进行比较
- 支持随机存取迭代器的对象和型别:可随机存取的容器(vector\deque)、strings(字符串、string、wstring)、一般的array(指针)
- 只有是随机存取迭代器才可以使用operator < 作为循环的结束与否的判断条件
- 代码一定要严谨:比如(coll.end()-1)如果群集为空,便会访问到begin()之前的数据,出现错误;
- 下面的代码可能出现问题,vector迭代器可能被实例化为一般的指针,考虑到C++不允许你修改任何基本型别的暂时值(包括指针),但是struct和class可以,因此使用辅助对象
- strings迭代器也常会被实例化为一般的字符指针
迭代器相关的辅助函数
- advance() 、distance() 适用于random access迭代器,前进后退以及处理迭代器之间的距离
- iter_swap适用于迭代器的数值交换
迭代器配接器
- 逆向模式、安插模式、流模式
逆向模式
- 重新定义递增和递减运算,行为倒置
Insert迭代器
- 将赋值新值转化为安插新值
Input stream
缺省调用,后面三个数值均使用默认值
这篇关于C++标准库 第七章 STL迭代器的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-25【机器学习(二)】分类和回归任务-决策树(Decision Tree,DT)算法-Sentosa_DSML社区版
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享