STL顺序容器迭代器何时失效

C++ STL容器元素正确删除 参考文献: 【1】迭代器失效问题:https://www.cnblogs.com/willowcc1803/p/10194757.html 阅读详情
 转自: http://blog.youkuaiyun.com/jokenchang2000/archive/2008/07/01/2603485.aspx

最近看了看STL的Container,对迭代器(iterator)的失效问题一直都很困惑。做了一些实验,有了一定的了解,总结如下,以便备忘。

迭代器(iterator)是一个可以对其执行类似指针的操作(如:解除引用(operator*())和递增(operator++()))的对象,我们可以将它理解成为一个指针。但它又不是我们所谓普通的指针,我们可以称之为广义指针,你可以通过sizeof(vector::iterator)来查看,所占内存并不是4个字节。

首先对于vector而言,添加和删除操作可能使容器的部分或者全部迭代器失效。那为什么迭代器会失效呢?vector元素在内存中是顺序存储,试想:如果当前容器中已经存在了10个元素,现在又要添加一个元素到容器中,但是内存中紧跟在这10个元素后面没有一个空闲空间,而vector的元素必须顺序存储一边索引访问,所以我们不能在内存中随便找个地方存储这个元素。于是vector必须重新分配存储空间,用来存放原来的元素以及新添加的元素:存放在旧存储空间的元素被复制到新的存储空间里,接着插入新的元素,最后撤销旧的存储空间。这种情况发生,一定会导致vector容器的所有迭代器都失效。

我们看到实现上述所说的分配和撤销内存空间的方式以实现vector的自增长性,效率是极其低下的。为了使vector容器实现快速的内存分配,实际分配的容器会比当前所需的空间多一些,vector容器预留了这些额外的存储区,用来存放新添加的元素,而不需要每次都重新分配新的存储空间。你可以从vector里实现capacity和reserve成员可以看出这种机制。

capacity和size的区别:size是容器当前拥有的元素个数,而capacity则指容器在必须分配新存储空间之前可以存储的元素总数。

vector迭代器的几种失效的情况: 1.当插入(push_back)一个元素后,end操作返回的迭代器肯定失效。 2.当插入(push_back)一个元素后,capacity返回值与没有插入元素之前相比有改变,则需要重新加载整个容器,此时first和end操作返回的迭代器都会失效。 3.当进行删除操作(erase,pop_back)后,指向删除点的迭代器全部失效;指向删除点后面的元素的迭代器也将全部失效。

deque迭代器的失效情况: 在C++Primer一书中是这样限定的: 1.在deque容器首部或者尾部插入元素不会使得任何迭代器失效。 2.在其首部或尾部删除元素则只会使指向被删除元素的迭代器失效。 3.在deque容器的任何其他位置的插入和删除操作将使指向该容器元素的所有迭代器失效。但是:我在vs2005测试发现第一条都不满足,不知为何?等以后深入STL以后慢慢的领会吧!

只有list的迭代器好像很少情况下会失效。也许就只是在删除的时候,指向被删除节点的迭代器会失效吧,其他的还没有发现。

 

【048】C++ STL容器的使用时机:何时使用哪个? C++ STL 容器是高效编程的关键,但选择合适的容器至关重要。本文将深入探讨 STL 容器的三大类别:顺序容器、关联容器和无序关联容器,详细分析 `vector`、`list`、`deque`、`set`、`map` 等常用容器的特性、性能差异及适用场景。我们将比较不同容器在内存管理、随机访问、插入/删除操作等方面的优劣,并提供最佳实践和使用技巧,帮助开发者根据实际需求选择最合适的容器,从而编写出高效、可靠的 C++ 代码。 最后,还会推荐一些学习资源,帮助读者更深入地学习 STL 容器。 阅读详情

相关推荐

新手入门:从零开始学习PCB飞针测试全流程(附常见问题解答)

本文详细介绍了PCB飞针测试的全流程,从核心原理、设备解析到实操步骤和常见问题解答,帮助新手快速掌握这一电子制造领域的关键质检技术。内容涵盖测试资料准备、参数设置、设备操作技巧以及故障排查方法,特别适合小批量PCB生产的质量检测需求。

weixin_29295541的博客 391

关于迭代器失效的几种情况

之前就做题的时候就经常碰到与迭代器失效有关的问题,但是一直对这个问题也没有深究,处于似懂非懂的状态,今天就对迭代器失效这部分知识做一个总结。 迭代器 迭代器(iterator)是一个可以对其执行类似指针的操作(如:解除引用(operator*())和递增(operator++()))的对象,我们可以将它理解成为一个指针。但它又不是我们所谓普通的指针,我们可以称之为广义指针,你可以通过sizeo...

everthing willl be ok 2万+

示波器实测RGMII信号:从125MHz时钟判断千兆模式,到时序抓取与PHY寄存器避坑

本文详细介绍了使用示波器实测RGMII信号的完整流程,包括125MHz时钟频率判断、时序参数测量及PHY寄存器配置避坑指南。通过实战操作和典型故障案例分析,帮助硬件工程师快速定位和解决千兆以太网接口的调试问题,提升通信稳定性。

weixin_30015371的博客 260

迭代器失效的几种情况

引言: 最近自己写代码用到了删除链表中某个节点操作,因为迭代器使用不规范,造成了程序崩溃。 例如,对某个迭代器解引用所获得的值并不是执行erase()前这个迭代器指向的值,还有可能对未指向任何元素的迭代器的解引用赋值而引发程序crash。类似的问题代码像这样: LeetCode第283题的一种常规解法: class Solution { public: void moveZeroes(vector<int>& nums) { int num = 0;

森明帮大于黑虎帮的博客 2128

手机拍视频就能训练机器人?SpatialLM开源模型实战指南(附HuggingFace部署教程)

本文详细介绍了如何利用开源模型SpatialLM通过手机视频训练机器人理解3D空间结构。从HuggingFace部署、视频预处理到模型推理和结果可视化,提供完整的实战指南,特别适合具身智能领域的开发者快速上手。

2y3u4i5o6p的博客 788

迭代器失效及其解决方法

迭代器失效的主要原因:对容器进行插入、删除或内存重新分配的操作。如何解决迭代器失效插入或删除操作后,重新获取迭代器。遍历容器时删除元素,使用erase()的返回值获取下一个有效迭代器。使用预先分配内存,减少插入操作导致的迭代器失效。删除map或set元素时,依赖erase()的返回值避免迭代器失效。在使用容器(如vectormapset, 等)进行操作时,迭代器失效(Iterator Invalidation)是一个常见问题。

weixin_47151388的博客 1889

告别ArcGIS小红叉:从‘无法验证登录信息’到成功连接在线资源的完整排错记录

本文详细记录了从Windows便签的网络错误到ArcGIS连接问题的完整排错过程。通过分析代理服务器、DNS配置和系统网络设置,解决了ArcGIS无法验证登录信息的问题,提供了实用的网络优化方案和技术排错思路。

weixin_26800111的博客 390

C++迭代器失效

在STL中,有些操作会导致迭代器失效,即之前获取的迭代器无法再安全地使用。这是因为这些操作可能会改变容器的结构,例如插入、删除元素等。1. 当插入或删除元素导致容器中的内存重新分配时,所有指向容器元素的迭代器都会失效。这是因为容器重新分配了内存空间,原来的迭代器指向的内存已经无效。2. 当插入元素导致迭代器位置被移动时,被移动的迭代器和之后的所有迭代器都会失效。这是因为插入元素后,容器中的元素位置发生了改变。3. 当删除元素导致迭代器位置被移动或失效时,被删除元素的迭代器和之后的所有迭代器都会失效。

xinxin的博客 1481

CXL3.0 CDAT(Coherent Device Attributes Table)

在说明CDAT之前,先讲一下CXL中的DOE类型:CXL协议里定义了两种DOE的类型,一种是Compliance就是合规性测试的内容,还有一种就是CDAT(一致性属性表)Memory_Info_Valid是CXL设备的内存配置完成标志,位于DVSEC(Designated Vendor-Specific Extended Capability)的CXL Range X Size Low寄存器中(X为1或2)。

Summer的博客 1435

逆向实战:我是如何一步步解开美团外卖App的mtgsig3.0签名(附关键代码片段)

本文详细记录了逆向分析美团外卖App的mtgsig3.0签名算法的全过程,从抓包到算法还原,包括Java层和Native层的深度分析。通过Frida、IDA Pro等工具,揭示了签名生成的多层加密流程,并提供了关键代码片段。文章还探讨了逆向工程中的反调试对抗和签名时效性问题,为安全研究人员提供了宝贵的技术参考。

weixin_42530732的博客 872

C++ stl迭代器 (迭代器失效问题)

C++剖析stl 迭代器是什么?:迭代器 和 指针;迭代器失效;详解`vector`迭代器失效

知识分享与学习笔记总结,欢迎指点 4667

2024 年高教社杯全国大学生数学建模竞赛 E 题 交通流量管控 详细思路+matlab代码+python代码+论文范例

随着城市化进程的加快、机动车的快速普及,以及人们活动范围的不断扩大,城市道。景区周边道路上既有本地居民出行,也有过境车辆,化配置,在保证车辆通行的前提下,使得两条主路上的车流平均速度最大。对五一黄金周期间的数据进行分析,判定寻找停车位的巡游车辆,并估算假。相位通过的每辆车的信息,包括拍摄地点、行驶方向、拍摄时间和车牌号。济发展和百姓幸福感的一个“痛点”,是相关部门的棘手难题之一。纬中路交叉口,根据车流量的差异,可将一天分成若干个时段,估。是小镇中两条主路的情况:纬中路,从环西路到环东路,约。

YOLO 3310

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

探索STL奥秘(五)之——vector的迭代器失效问题(新手极容易出错,一定要好好看看!!!)

2301_80220607的博客 3445

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【C++】STL容器中的迭代器失效问题

什么是迭代器失效?在 C++ 中,。但在对容器执行某些操作(如插入、删除、扩容等)后,,也就是说,它指向的内容不再可靠,继续使用会导致程序崩溃或产生未定义行为,这种现象被称为。为什么会失效?对于像vector这类连续存储容器,一旦发生扩容,其内部元素的位置就会整体迁移,原先的迭代器(指针)指向的是旧地址,自然就失效了。删除元素后,容器可能会移动其他元素填补空位,导致原迭代器指向的元素不存在或顺序变化。插入元素也可能使部分迭代器变得不可靠,尤其是插入点之后的迭代器。

qq_48178317的博客 848

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

STL迭代器失效总结

一、序列式容器(数组式容器) 对于序列式容器(如vector,deque),序列式容器就是数组式容器,删除当前的iterator会使后面所有元素的iterator都失效。这是因为vetor,deque使用了连续分配的内存,删除一个元素导致后面所有的元素会向前移动一个位置。所以不能使用erase(iter++)的方式,还好erase方法可以返回下一个有效的iterator。 1 for (iter = cont.begin(); iter != cont.end();) 2 { 3 (*it)-&

wangbuji的博客 1403

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

C++ stl迭代器 (迭代器失效问题)_c++ 迭代器失效

🥦 迭代器是指向元素范围(如数组或容器)中的某个元素的任何对象,它能够使用一组运算符(至少具有自增(++) 和解引用 (*) 运算符)循环访问该范围的元素。🍊 迭代器最明显的形式是指针:指针可以指向数组中的元素,并且可以使用增量运算符 (++) 循环访问这些元素。但其他类型的迭代器也是可能的。例如,每个容器类型(如list )都有一个特定的迭代器类型,旨在循环访问其元素。

2401_87255253的博客 1338

C++经典面试题 | 迭代器失效问题

STL中迭代器失效的问题 关联性容器的迭代器失效问题 序列性容器的迭代器失效问题 总结: 序列性容器::(vector和list和deque) 关联性容器::(map和set比较常

Lebron 5288

C++STL——顺序容器

参考《C++ prime》第五版

m0_63997099的博客 2354

C++ STL 迭代器失效问题

之前看《C++ Primier》的时候,也解到在顺序型窗口里insert/erase会涉及到迭代器失效的问题,并没有深究。今天写程序的时候遇到了这个问题。 1 莫名其妙的Erase     最初我的程序是酱紫的,别说话,我知道这样是有问题的,可这样是最直观的想法 int arr[]={0,1,2,3,4,5,6,7,8,9,10};   vectorint> a(arr,arr+s

coderCong的博客 7239

STL迭代器详解

迭代器是STL的核心组件,重要且常用

2303_79230750的博客 2050

STL迭代器失效的几种情况与应对方法

前几天面试过程中问到了这个问题,但回答的很模糊,如今得闲正好梳理总结一下。废话不多说直接进入正题。

weixin_63838855的博客 1464
上一篇: C语言可变参数函数
下一篇: 将窗口的背景设置为淡绿色以保护眼睛
K行天下
博客等级 码龄19年 358粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值