STL容器迭代器的理解
迭代器
迭代器模式:就是提供一种方式,不用暴露出容器内部结构,就可以通过迭代器来访问容器内部元素。
迭代器:迭代器是类模板,表现的像一个指针,一个可以对其执行类似于指针的操作(如:解引用operator*()和递增operator++())的对象,但是又不同与指针,我们可以理解为指针的一层封装。
1.定义以及初始化
每一种容器都提供了自己的迭代器,我们以vector为例:
vector<int>::iterator iter; //定义一个名为iter的迭代器变量
2.迭代器范围
一个迭代器范围由一对迭代器组成,两个迭代器分别指向同一个容器中的元素或者尾元素之后的位置,通常被称为begin和end,他们表示了容器中元素的一个范围。
vector<int>v1;
vector<int>::iterator iter1=v1.begin();//将iter1迭代器初始化为指向v1的第一个元素
vector<int>::iterator iter2=v1.end();//将iter2迭代器初始化为指向v1的最后一个元素的下一个位置
- 如果begin和end相等,则范围为空。
- 如果begin和end不等,则至少包含一个元素,且begin指向该范围的第一个元素
- 我们可以对begin递增若干次,使begin==end
3.通过迭代器来遍历容器元素
vector<int>v;for (int i = 0; i < 10; ++i){v.push_back(i);}vector<int>::iterator it=v.begin();for (; it < v.end(); ++it){cout << *it << " ";}
4.迭代器失效
经过学习STL容器,我们都知道,容器一般都会支持insert以及erase,但是经过这两个操作在一定程度上会导致迭代器失效的问题。
- vector
- 在经过push_back操作后,会使end返回的迭代器失效
- 在进行insert和erase之后,会使当前位置的迭代器以及之后的所有迭代器失效
- 当进行push_back后,如果capacity发生变化,则会使所有的迭代器失效
- List、map、set
- 作为空间不连续的容器,在进行insert和erase之后,只会使当前迭代器失效
- deque
- 在首部或者尾部插入元素都不会使任何迭代器失效
- 在其头部或尾部删除元素只会使当前迭代器失效
- 在其任何节点删除和插入都会使所有迭代器失效
5.如何解决迭代器失效?
经过翻看《STL源码剖析》之后,经过erase之后,都会返回下一个有效位置的迭代器,因此我们可以通过
iter=v1.erase(iter)来获取下一个有效迭代器
STL容器迭代器的理解相关推荐
- c++ stl 容器 迭代器 stl用法示例
1.基本概念 1.1容器概述 顺序容器 vector, deque,list 关联容器 set, multiset, map, multimap 容器适配器 stack, queue, priorit ...
- STL 容器迭代器失效总结
总结常见的序列容器(vector.deque.list)和关联容器(set.multiset.map.multimap)的迭代器失效问题. 原迭代器指的是进行操作之前保存的迭代器,包括begin(). ...
- C++ 笔记(19)— 标准模板库(STL容器、STL迭代器、STL算法、STL容器特点、STL字符串类)
C++ 标准库可以分为两部分: 标准函数库: 这个库是由通用的.独立的.不属于任何类的函数组成的.函数库继承自 C 语言. 面向对象类库: 这个库是类及其相关函数的集合. C++ 标准库包含了所有的 ...
- STL 容器和迭代器连载6_顺序容器的操作3
2019独角兽企业重金招聘Python工程师标准>>> /*- ========================================================== ...
- C++语言基础 —— STL —— 容器与迭代器
[概述] STL 是指 C++ 标准模板库,是 C++ 语言标准中的重要组成部分,其以模板类和模版函数的形式提供了各种数据结构与算法的精巧实现,如果能充分使用 STL,可以在代码空间.执行时间.编码效 ...
- STL 容器和迭代器连载8_访问顺序容器的元素
2019独角兽企业重金招聘Python工程师标准>>> /*- ========================================================== ...
- C++中STL容器利用迭代器删除元素小结
C++中STL容器利用迭代器删除元素小结 在STL容器中删除元素,容易导致迭代器失效,故应该清楚明白其用法,现在总结一下. 转载自:https://blog.csdn.net/yf_li123/art ...
- 杂记1:正向反向迭代器,不同stl容器的lower_bound的使用(set,map,vector,arr,pair),数字转字符串
感觉自己记性真的不行,很多之前用过,查过的知识点都忘掉了,开个博客记一下吧. 文章目录 迭代器 lower_bound,upper_bound 可以忽略,我暂时没发现用处 这个比较有用:不同容器的lo ...
- STL——1、各类容器迭代器失效总结
一. 种类: 标准STL序列容器:vector.string.deque和list. 标准STL关联容器:set.multiset.map和multimap. 非标准序列容器slist和rope:sl ...
最新文章
- aws python sdk send sns_AWS:boto3订阅SNS时的空SQS队列
- Linux Shell -- 无网不利
- python请求post无返回结果_Python请求POST返回不完整的内容
- Asterisk权威指南/第五章 用户设备配置
- python数字类型floatcomplexint_浅谈python 四种数值类型(int,long,float,complex)
- 高等数学基础 - 高等数学主要内容
- 微信小程序按钮Button使用详解
- ObjectDataSource自定义分页
- 【LOJ10050】The XOR Largest Pair(字典树)
- youphp学习整理
- MyBatis 的 4 个妙用,别再踩坑了!
- Oracle的安装及导入.dmp文件教程
- 常用的卷积神经网络-1-卷积和通道
- CCNP-EBGP环回口建立邻居之间启用IGP的效果
- 使用DecimalFormat进行数字的格式化
- html下拉框 js选中,js实现select下拉框选择
- hadoop案例测试——pi值、wordcount函数,hadoop不支持本地库问题
- spring cloudAlibaba面试题
- Win10桌面图标设置:计算机 回收站 控制面板 添加/隐藏
- SV学习笔记—数据类型
热门文章
- IntelliJ Idea及其同系列产品解决网页查看源码Html排版样式乱了
- change charset of existed MySQL db
- 枚举的定义和使用,位域相关知识
- [uboot] (第一章)uboot流程——概述
- 接口测试之Postman使用全指南(原来使用 Postman测试API接口如此简单)
- 【allegro 17.4软件操作保姆级教程三】布局操作基础二
- 2021年全球与中国汽车ABS和ESC行业市场规模及发展前景分析
- 用手机打开word图表位置很乱_word排版技巧:论文图表目录制作步骤
- 基于安卓/android/微信小程序的学生考勤签到APP-#计算机毕业设计
- Perforce: Can’t clobber writable file Perforce