vactor中迭代器失效问题
目录
- 什么是迭代器失效
- 导致迭代器失效的操作
- VS和g++环境下对与迭代器失效的态度
什么是迭代器失效
迭代器的底层其实就是一个指针,或者对指针进行了封装
vector的迭代器就是一个指针T*
一个迭代器指向某一个空间,此时这块空间被释放了,这个迭代器仍指向原来的那个空间,这个就叫迭代器的失效
如果继续使用已经失效的迭代器,程序可能会崩溃

导致迭代器失效的操作
引起底层空间发生变化的操作,都很有可能引起迭代器失效
迭代器失效,主要都是由insert和erase导致的
下面我们看一个insert导致迭代器失效的情况
我们首先定义一个vector<int>对象和一个迭代器
void test6()
{vector<int> v{ 1,2,3,4,5,6 };auto it = v.begin();
}
此时v的size()的值和capacity()的值都为6,如果再向v中插入数据,就需要扩容。
void test6()
{vector<int> v{ 1,2,3,4,5,6 };auto it = v.begin();v.insert(it, 0);//此处会扩容
}
v.insert(it, 0)会导致扩容,扩容其实就是另开辟一块更大空间,原空间销毁,所以此时迭代器it已经失效了,因为后面没有再使用it,所以暂时不会报错。


此处如果再使用已经失效的迭代器it,就会报错
void test6()
{vector<int> v{ 1,2,3,4,5,6 };auto it = v.begin();v.insert(it, 0);//此处会扩容v.insert(it, 0);
}

所以想要迭代器不失效,就要为迭代器重新赋值
insert函数在库中的定义为:
iterator insert (iterator position, const value_type& val)
可以看到它的返回值是iterator类型的,这其实返回了一个处理后不失效的迭代器,是指向第一个新插入元素的迭代器。
void test6()
{vector<int> v{ 1,2,3,4,5,6 };auto it = v.begin();it = v.insert(it, 0);//此处会扩容v.insert(it, 10);//不会报错
}
下面看一下erase导致失效的情况:
其实大多数情况下,使用erase并不会导致迭代器
void test7()
{vector<int> v{ 1,2,3,4,5,6 };auto it = v.begin()+3;v.erase(it);
}
这里迭代器it指向的是4,v.erase(it)删除4后,后面的元素会向前补上来,没有导致底层空间的改变,理论上讲迭代器不应该会失效

如果pos刚好是最后一个元素,删完之后pos刚好是end的位置,而end位置是没有元素的,那么pos就失效了

以及,如果vector中如果只有一个元素,迭代器恰好指向这个元素,那么erase后,迭代就会失效
可以看出,erase虽然有的情况会导致迭代器失效,有点情况不会导致迭代器失效,但是在VS环境下就认为:删除vector中任意位置上元素时,vs就认为该位置迭代器失效了。
其实与vector类似,string在插入+扩容操作+erase之后,迭代器也会失效
VS和g++环境下对与迭代器失效的态度
- VS环境下,对于迭代器失效十分严格,只要有迭代器失效的情况,编译器就会报错;只要删除vector中任意位置上元素时,就认为该位置迭代器失效了,报错
- 但是linux上的g++编译器对迭代器失效的检测并不是非常严格,处理也没有vs下极端。
- 扩容之后,迭代器已经失效了,程序虽然可以运行,但是运行结果已经不对了
- erase删除任意位置代码后,linux下如果迭代器没有失效,程序还是会运行
- erase删除的迭代器如果是最后一个元素,删除之后it已经超过end,如果++it还是会报错的
- 所以迭代器失效后,代码并不一定会崩溃,但是运行结果肯定不对,如果it不在begin和end范围内,肯定会崩溃的
相关文章:
vactor中迭代器失效问题
目录 什么是迭代器失效导致迭代器失效的操作VS和g环境下对与迭代器失效的态度 什么是迭代器失效 迭代器的底层其实就是一个指针,或者对指针进行了封装 vector的迭代器就是一个指针T* 一个迭代器指向某一个空间,此时这块空间被释放了,这个迭…...
电子商务防火墙的作用
1.作为网络安全的屏障 只有经过精心选择的应用协议才能通过防火墙,可使网络环境变得更安全。如 防火墙可以禁止 NFS 协议进出受保护的网络,这样外部的攻击者就不可能利用这些 脆弱的协议来攻击内部网络。防火墙同时可以保护网络免受基于路由的攻击&am…...
「UG/NX」Block UI 选择特征SelectFeature
✨博客主页何曾参静谧的博客📌文章专栏「UG/NX」BlockUI集合📚全部专栏「UG/NX」NX二次开发「UG/NX」BlockUI集合「VS」Visual Studio「QT」QT5程序设计「C/C+&#...
【数据分享】2006-2021年我国城市级别的节约用水相关指标(免费获取\20多项指标)
《中国城市建设统计年鉴》中细致地统计了我国城市市政公用设施建设与发展情况,在之前的文章中,我们分享过基于2006-2021年《中国城市建设统计年鉴》整理的2006—2021年我国城市级别的市政设施水平相关指标、2006-2021年我国城市级别的各类建设用地面积数…...
Azure不可变Blob存储
文章目录 Azure不可变Blob存储介绍Azure不可变性策略实战演练 Azure不可变Blob存储介绍 不可变的存储是一种用于存储业务关键型 Blob 数据的存储方式。与可变存储相反,不可变存储的特点是一旦数据被写入后,便无法再对其进行修改或删除。这种存储方式提供…...
No mapping found for HTTP request with URI
参考: 参考地址 说明 ssm老项目,接过来别人的项目 临时建了一个Controller方便测试用的,结果访问掉不通,报: No mapping found for HTTP request with URIxxxx 这样的错误 解决办法 看了下web,xml配置 在 webmvc-config.xml 配置文件里面添加了几行配置 说明: com.iph.h…...
视频转云存的痛点
现在整个运营商体系里面,有大量的视频转云存储的需求,但是视频云存储有一个比较大的痛点,就是成本! 成本一:存储成本; 我们以1000路2M视频转云存,存储时间为90天为例(B端存储时间有…...
3D医学教学虚拟仿真系统:身临其境感受人体结构和功能
3D医学教学虚拟仿真系统是一种基于虚拟现实技术的教学工具,它可以帮助学生更好地理解和掌握医学知识。这种课件通常包括人体解剖学、生理学、病理学等方面的教学内容,通过三维立体的图像和动画展示,让学生更加直观地了解人体结构和功能。 与传…...
【.net】本地调试运行只能用localhost的问题
【.net】本地调试运行只能用localhost的问题 解决方案 找到到项目目录下 隐藏文件夹 .vs /项目名称/config/applicationhost.config <bindings><binding protocol"http" bindingInformation"*:1738:localhost" /></bindings> 再加一条你…...
营销数字化|企业级 AIGC 工具的「iPhone 时刻」
2007 年,乔布斯发布了第一款 iPhone,从此彻底改变了手机行业的市场走向。iPhone 成功的背后,一个很重要的原因是:它让用户以更简单、更符合直觉的方式来使用手机。 如今,AIGC 工具也在等待它的「iPhone 时刻」…...
Zookeeper集群单节点启动成功但未同步其他节点数据
首先排查节点启动是否正常: 在zookeeper的bin目录下执行:sh zkServer.sh status 判断当前节点数据leader 还是follower 节点都启动正常,但某一个zookeeper集群节点(下面简称“异常节点”)不同步其他节点数据…...
回归预测 | MATLAB实现TSO-LSSVM金枪鱼群算法优化最小二乘支持向量机多输入单输出回归预测(多指标,多图)
回归预测 | MATLAB实现TSO-LSSVM金枪鱼群算法优化最小二乘支持向量机多输入单输出回归预测(多指标,多图) 目录 回归预测 | MATLAB实现TSO-LSSVM金枪鱼群算法优化最小二乘支持向量机多输入单输出回归预测(多指标,多图&a…...
第5步---MySQL的DQL查询语句
第5步---MySQL的DQL查询语句 DQL 数据库查询语言 1.基本的查询语句 1.完整得查询得语句 简化版的查询语句 select * from 表名 where 条件; 2.创建用于测试的表 1.创建测试数据 -- DQL -- 创建测试表 DROP TABLE IF EXISTS product; CREATE TABLE IF NOT EXISTS product( pi…...
ChatGpt开源项目完美运行配置-ChatGml2
(以下所有软件均可免费在网盘获取。) 任务描述 本节任务是安装和配置chatgpt项目所需的软件以及chatgpt项目所需要的python库包,同时编写python代码来完成chatgpt项目的人机对话功能。 实验工具 显卡GTX1070(专用内存需要大于等…...
微服务-GateWay(网关)
所谓网关是什么意思? 相当于就是你们小区家的保安,进出小区都得获得保安的同意,守护你们小区的生命财产健康,网关也是如此,对每个请求都严格把关,将合法的或者是获得权限的请求进入服务器 网关的功能&…...
基于X86六轮差速移动机器人运动控制器设计与实现(一)软件与硬件架构
本文研究的六轮差速移动机器人 (Six-Wheeled Differential Mobile Robot , SWDMR) 为了满足资源站到资源站点对点的物资运输,对机器人的跨越障碍能力 有较高的要求。对比传统的四轮移动机器人,六轮移动机器人能够提供更强的驱动 力&#…...
单片机之从C语言基础到专家编程 - 4 C语言基础 - 4.9 变量与常量
基本数据类型可以作为变量与常量使用,顾名思义,变量运行时可以改变其值,常量运行时不会改变其值。 常量分为整型常量、浮点型常量、字符常量、字符串常量和符号常量。 通常用#define来定义一个标识符来表示一个常量 用type name 常量来定义一个变量,…...
如何在 3dmax 中渲染? 3dmax渲染教程
3D Max是一款专业的3D计算机设计软件,用于创建3D动画、游戏、模型、图像等,在视频游戏开发商、电影和电视工作室的工作中发挥着重要作用。渲染是 3D max 建模的一个非常重要的部分。在渲染中,通过设置渲染选项的一些参数,我们可以…...
linux部署项目, 报数据库连接不上错误
问题描述: sprinboot项目, 本地连线上数据库可以使用, springboot项目中java包的版本是8.0, 线上数据库是5.7, 但在将项目部署到服务器上的时候发现项目启动报错, 于是寻找问题, 发现是useSSLtrue导致的 出问题前的链接地址: url: jdbc:mysql://localhost:3306/ja…...
现有的vue3+ts+vite项目集成electron
效果图 什么时Electron Electron是使用JavaScript,HTML和CSS构建跨平台的桌面应用程序框架。 Electron兼容Mac、Windows和Linux,可以构建出三个平台的应用程序。 现有的vue3项目集成Electron 安装依赖 原来有一个vue3+ts+vite+pnpm的项目,其中sub-modules是子项目,web是…...
3步构建智能无人机防御系统:从威胁识别到实时追踪的实践指南
3步构建智能无人机防御系统:从威胁识别到实时追踪的实践指南 【免费下载链接】Anti-UAV 🔥🔥Official Repository for Anti-UAV🔥🔥 项目地址: https://gitcode.com/gh_mirrors/an/Anti-UAV 一、安全威胁&#…...
从Debezium到Flink RowData:手把手解析Flink CDC 2.3如何优雅处理MySQL的UPDATE事件
从Debezium到Flink RowData:深入解析Flink CDC 2.3处理MySQL UPDATE事件的机制 在实时数据处理的领域中,变更数据捕获(CDC)技术已经成为构建数据管道的核心组件。当MySQL数据库中的一条记录被更新时,如何准确捕获这一变更并将其高效地传递到下…...
WarcraftHelper:魔兽争霸3现代兼容性解决方案,让你的经典游戏焕发新生
WarcraftHelper:魔兽争霸3现代兼容性解决方案,让你的经典游戏焕发新生 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 魔兽争霸…...
OpenClaw对接Qwen3-VL:30B:飞书智能助手配置
OpenClaw对接Qwen3-VL:30B:飞书智能助手配置 1. 为什么选择这个组合? 去年我在团队内部尝试搭建一个能处理图片和文本的智能助手时,遇到了三个痛点:一是商业API调用成本太高,二是数据安全性无法保证,三是…...
开源键盘固件终极配置指南:轻松自定义你的机械键盘
开源键盘固件终极配置指南:轻松自定义你的机械键盘 【免费下载链接】vial-qmk QMK fork with Vial-specific features. 项目地址: https://gitcode.com/gh_mirrors/vi/vial-qmk 想要完全掌控你的机械键盘,打造独一无二的输入体验吗?Vi…...
单光子雪崩二极管(SPAD):原理、极高增益机制与微光探测解析
摘要 单光子雪崩二极管(Single-Photon Avalanche Diode, SPAD)是当前量子通信、激光雷达(LiDAR)、生物荧光成像及弱光探测领域的核心器件。其最显著的特征在于能够探测单个光子级别的极微弱光信号。本文将从器件物理层面深入剖析SPAD如何通过工作在“盖革模式”(Geiger M…...
Ryujinx开源项目:跨平台Switch游戏模拟解决方案
Ryujinx开源项目:跨平台Switch游戏模拟解决方案 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx 在数字化娱乐日益普及的今天,如何让Nintendo Switch游戏突破硬件…...
梦幻动漫魔法工坊:5分钟零基础搭建,小白也能生成专属二次元头像
梦幻动漫魔法工坊:5分钟零基础搭建,小白也能生成专属二次元头像 想不想拥有一个独一无二的二次元头像,却苦于不会画画?或者想为你的游戏角色、小说人物创造一个生动的形象,却找不到合适的画师?今天&#x…...
Cursor最新版0.44.11配置DeepSeek-R1模型保姆级教程(含报错解决方案)
Cursor 0.44.11深度适配DeepSeek-R1模型全流程指南 当技术爱好者第一次在Cursor中尝试调用DeepSeek-R1模型时,往往会遇到各种"水土不服"的情况。就像刚拿到新相机的摄影师需要调整镜头焦距一样,我们需要对Cursor进行精确配置才能充分发挥这个强…...
M9A智能助手:为《重返未来:1999》玩家解放时间的自动化解决方案
M9A智能助手:为《重返未来:1999》玩家解放时间的自动化解决方案 【免费下载链接】M9A 1999 小助手 项目地址: https://gitcode.com/gh_mirrors/m9/M9A 在当今快节奏的游戏环境中,玩家常常需要在重复性日常任务上投入大量时间ÿ…...
