C++初阶学习第十弹——探索STL奥秘(五)——深入讲解vector的迭代器失效问题

vector(上):C++初阶学习第八弹——探索STL奥秘(三)——深入刨析vector的使用-CSDN博客

vector(中):C++初阶学习第九弹——探索STL奥秘(四)——vector的深层挖掘和模拟实现-CSDN博客

目录

一、vector的迭代器失效问题的本质

二、vector迭代器失效的原因

1、引起底层空间改变的操作

2、进行指定元素删除的时候—erase

3、在其他编译环境下的失效情况

4、string的迭代器失效

三、vector迭代器失效的解决方法

四、总结


前言:

在前面我们已经学习了vector的使用和其模拟实现,相信也帮助我们了解了vector这个容器的基本规则,但其实在我们讲解的过程中,有一些知识点我们还没提到,今天,我们就专门来讲一下vector在使用和模拟实现的过程中一个容易出错的知识点——迭代器失效问题

一、vector的迭代器失效问题的本质

迭代器的作用就是能让我们忽略变量的类型,方便我们访问,其本质其实还是指针,类如对于vector的类型的,++后往后访问其实也是将指针改为指向下一个数据的指针,迭代器失效就是迭代器底层使用的指针指向的空间被释放了,这样再使用这个迭代器就会造成程序崩溃,这就是迭代器失效(迭代器失效也与编译环境有一定关系)

二、vector迭代器失效的原因

vector容器可能会发生迭代器失效的操作有以下几种

1、引起底层空间改变的操作

比如resize、reserve、insert、assign、push_back等

例如:

#include<iostream>
#include<vector>
using namespace std;int main()
{vector<int> v{ 1,2,3,4,5,6 };auto it = v.begin();while (it != v.end()){cout << *it << " ";++it;}cout << endl;return 0;
}
对于这样一个程序,我们定义了一个v,并用迭代器来实现全部访问,运行结果如下:
在这个程序中,我们记录下了v的begin迭代器,并一步步向后走,从而实现遍历,但我们知道vector的本质上与顺序表是类似的, 它是在内存上找一段能放下当前数据的空间,但是当我们进行扩容等操作的时候的时候,可能原空间下就不够用了,就需要找一个新的位置开辟空间并且销毁旧空间,这个时候迭代器指向的位置就会发生变化,而it还记录的原来begin指向原来的那段空间,所以就会导致程序崩溃,出现迭代器失效的现象
例如(错误示范):
#include<iostream>
#include<vector>
using namespace std;int main()
{vector<int> v{ 1,2,3,4,5,6 };auto it = v.begin();v.resize(100, 8);            //这里会扩容while (it != v.end()){cout << *it << " ";++it;}cout << endl;return 0;
}

运行结果:

2、进行指定元素删除的时候—erase

当进行指定位置删除时,最终返回的是删除元素的位置,当我们访问这个位置的时候,如果删除元素后面还有值,那么就会往前挪,我们就能访问到元素,但是当删除位置pos位于最后一个元素时,删除后我们访问就会访问到begin(),就会越界

代码实例:

#include <iostream>
using namespace std;
#include <vector>
int main()
{int a[] = { 1, 2, 3, 4 };vector<int> v(a, a + sizeof(a) / sizeof(int));// 使用find查找3所在位置的iteratorvector<int>::iterator pos = find(v.begin(), v.end(), 3);// 删除pos位置的数据,导致pos迭代器失效。v.erase(pos);cout << *pos << endl; // 此处会导致非法访问return 0;
}

运行结果:

3、在其他编译环境下的失效情况

这一点并不是很重要,在上面我们也提到了vector的迭代器失效也与编译器环境有关,这里有关指的是报错情况及运行上,例如在Linux下,g++对于迭代器失效的检查就没有那么严格,一般迭代器失效也能运行,只不过运行结果会出错,并不会直接中断,总之,迭代器失效一定会导致错误,我们在平时使用迭代器的时候一定要注意这个问题

4、string的迭代器失效

string在内存中的存储情况有一点类似vector,也是在内存上先开辟空间,所以也会出现上面的哪些情况,出现迭代器失效的问题,具体原因与上面一样,下面我们给出一个例子观察一下

代码实例:

#include <iostream>
#include <string>
using namespace std;int main()
{string s("hello");auto it = s.begin();// 放开之后代码会崩溃,因为resize到20会string会进行扩容// 扩容之后,it指向之前旧空间已经被释放了,该迭代器就失效了// 后序打印时,再访问it指向的空间程序就会崩溃//s.resize(20, '!');while (it != s.end()){cout << *it;++it;}cout << endl;it = s.begin();while (it != s.end()){it = s.erase(it);// 按照下面方式写,运行时程序会崩溃,因为erase(it)之后// it位置的迭代器就失效了// s.erase(it);++it;}
}

运行结果:

三、vector迭代器失效的解决方法

解决方法非常简单:在使用前重新赋值即可

例如1中的:

#include<iostream>
#include<vector>
using namespace std;int main()
{vector<int> v{ 1,2,3,4,5,6 };auto it = v.begin();v.resize(100, 8);        //这里会扩容it = v.begin();          //使用前重新赋值while (it != v.end()){cout << *it << " ";++it;}cout << endl;return 0;
}

运行结果:

四、总结

以上就是vector迭代器失效的问题,这个问题还是挺容易出现的,稍不留意就可能会出错,我们平时使用迭代器的时候要注意这点

感谢各位大佬观看,创作不易,还请各位大佬点赞支持!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/13567.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

反序列化漏洞(JBoss、apache log4、apache Shiro、JWT)Weblogic未授权访问、代码执行、任意上传

1.1什么是反序列化 就是把一个对象变成可以传输的字符串&#xff0c;目的就是为了方便传输。假设&#xff0c;我们写了一个class&#xff0c;这个class里面存有一些变量。当这个class被实例化了之后&#xff0c;在使用过程中里面的一些变量值发生了改变。以后在某些时候还会用到…

CentOS-9配置静态IP地址

查看配置命令nmcli CentOS 9 使用 nmcli 命令行工具进行网络配置。以下是配置静态 IP 地址的步骤和示例代码&#xff1a;相对以前centos7之类的&#xff0c;9版本的默认的网络是NetworkManager&#xff0c;网络配置也有较大改变 nmcli con show用vim进行编辑配文件 cd /etc/…

JavaScript基础(九)

冒泡排序 用例子比较好理解: var arry[7,2,6,3,4,1,8]; //拿出第一位数7和后面依次比较&#xff0c;遇到大的8就换位&#xff0c;8再与后面依次比较&#xff0c;没有能和8换位的数&#xff0c;再从下一位2依次与下面的数比较。 console.log(排列之前&#xff1a;arry); for (…

开源大模型与闭源大模型:技术哲学的较量

目录 前言一、 开源大模型的优势1. 社区支持与合作1.1 全球协作网络1.2 快速迭代与创新1.3 共享最佳实践 2. 透明性与可信赖性2.1 审计与验证2.2 减少偏见与错误2.3 安全性提升 3. 低成本与易访问性3.1 降低研发成本3.2 易于定制化3.3 教育资源丰富 4. 促进标准化5. 推动技术进…

自养号测评是什么?亚马逊产品评价的全新策略

1、什么是亚马逊测评&#xff1a; 亚马逊测评&#xff0c;简而言之&#xff0c;是基于亚马逊购物平台的一种特定活动。他的核心在于模拟国外消费者的购物行为&#xff0c;并在完成购买后&#xff0c;对所获得的产品进行真实、中肯的评价。这种测评不仅为消费者提供了购物参考&…

微软开发者大会,Copilot Agents发布,掀起新一轮生产力革命!

把AI融入生产力工具的未来会是什么样&#xff1f;微软今天给出了蓝图。 今天凌晨&#xff0c;微软召开了Microsoft Build 2024 开发者大会&#xff0c;同前两天的Google I/O开发者大会一样&#xff0c;本次大会的核心词还是“AI”&#xff0c;其中最主要的内容是最新的Copilot…

成都爱尔胡建斌院长提醒近视超过600度,记得每年检查眼底!

高度近视是指近视度数在600度及以上的一种屈光不正的状态。 近视的眼睛必定是变形的。在正常情况下&#xff0c;人的眼球类似球体&#xff0c;但随着近视加深&#xff0c;眼轴变长&#xff0c;眼球体积逐渐增大&#xff0c;整个眼球从圆球型向椭圆球形发展&#xff0c;而眼球壁…

Linux:top命令的每一列的具体含义

Linux&#xff1a;top命令的每一列的具体含义 文章目录 Linux&#xff1a;top命令的每一列的具体含义图片显示top命令的概念语法显示字段的含义顶部字段第二行第三行第四行第五行每列字段的含义 图片显示 top命令的概念 top命令上一个常用的Linux命令行工具&#xff0c;用于实…

php部分特性漏洞学习

php部分函数漏洞学习 简单总结一些我遇到的ctf中的php的一些函数或特性的漏洞&#xff0c;我刷题还是太少了&#xff0c;所以很多例子来自ctfshow&#xff0c;以后遇到相关赛题再更新 1.MD5和其他hash 弱类型比较 php中&#xff0c;有两中判断相等的符号&#xff0c;和&…

位运算符

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 位运算符是把数字看作二进制数来进行计算的&#xff0c;因此&#xff0c;需要先将要执行运算的数据转换为二进制&#xff0c;然后才能进行执行运算。…

[建堆堆排序的时间复杂度推导]向上建堆向下建堆堆排序的时间复杂度分析推导

&#x1f496;&#x1f496;&#x1f496;欢迎来到我的博客&#xff0c;我是anmory&#x1f496;&#x1f496;&#x1f496; 又和大家见面了 欢迎来到动画详解数据结构系列 作为一个程序员你不能不掌握的知识 先来自我推荐一波 个人网站欢迎访问以及捐款 推荐阅读 如何低成本搭…

hypermesh二次开发tcl脚本

hypermesh二次开发tcl脚本 1、tcl读csv文件,得到list,再转成二维数组2、tcl写csv文件3、hypermesh tcl根据读入的节点坐标建节点, 再显示节点号4、hypermesh tcl根据节点号建节点set5、hypermesh tcl根据节点set读取节点号&#xff0c;再根据节点号读取节点坐标&#xff0c;再将…

深度学习之Pytorch框架垃圾分类智能识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 随着城市化进程的加快和人们环保意识的提高&#xff0c;垃圾分类已成为城市管理的重要一环。然而&am…

成本管控:如何利用 SOLIDWORKS Costing 高效估算成本?

现在全球材料短缺、生活成本上升以及能源价格上涨而导致的成本上升问题突显。 生产产品需要的成本以及如何让产品的成本下降就成为很多的企业越来越关注的问题。 SOLIDWORKS Costing是集成到 SOLIDWORKS Professional 和 Premium 中的一款允许用户和制造商估算产品生产成本的工…

判定字符是否唯一

题目链接 判定字符是否唯一 题目描述 注意点 0 < len(s) < 100s[i]仅包含小写字母 解答思路 首先想到的是使用数组存储字母是否出现过&#xff0c;如果多次出现则直接返回false为了不适用额外的数据结构&#xff0c;可以使用位运算判定字符是否唯一&#xff0c;思路…

Wpf 使用 Prism 实战开发Day22

客户端添加IDialogService 弹窗服务 在首页点击添加备忘录或待办事项按钮的时候&#xff0c;希望有一个弹窗&#xff0c;进行相对应的内容添加操作。 一.在Views文件夹中&#xff0c;再创建一个Dialog 文件夹&#xff0c;用于放置备忘录和待办事项的弹窗界面。 1.1 备忘录&…

Python 全栈体系【四阶】(五十二)

第五章 深度学习 十二、光学字符识别&#xff08;OCR&#xff09; 2. 文字检测技术 2.1 CTPN&#xff08;2016&#xff09; 2.1.1 概述 CTPN全称Detecting Text in Natural Image with Connectionist Text Proposal Network&#xff08;基于连接文本提议网络的自然图像文本…

是德科技 DSOS104A MSOS104A示波器

产品 带宽 通道数 最大存储器深度 DSOS104A 高清晰度示波器 1 GHz 4 个模拟通道 800 Mpts MSOS104A 高清晰度示波器 1 GHz 4 个模拟通道和 16 个数字通道 800 Mpts 商品介绍 …

JavaEE-文件IO1

文章目录 一、什么是文件IO?1.1 IO1.2 文件1.2.1 路径1.2.2 文件分类 二、使用Java针对文件系统进行操作 一、什么是文件IO? 1.1 IO IO分别代表Input和Output即输入和输出。比如我的电脑可以从网络上下载文件&#xff0c;也可以通过网络上传文件或者我把我的内存中的数据保…

Vue 离线地图实现

效果图&#xff1a; 一、获取市的地图数据 DataV.geoAtlas 获取市地图数据 点击地图缩放至想要的市区域&#xff0c;通过右侧的链接打开网址&#xff0c;复制json数据。 二、获取镇地图数据 选择你想要的镇数据&#xff0c;点击下载 选择级别&#xff08;清晰度&#xff09…