用erase删除元素后迭代器会失效

从STL设计角度看vector::erase:为什么删除元素后迭代器会失效? 本文深入解析了C++ STL中vector::erase操作导致迭代器失效的设计原理,从连续内存模型、算法复杂度等角度揭示了其背后的机制。通过对比不同容器的行为差异,提出了安全的元素删除策略,包括利用返回值更新迭代器、逆向遍历以及C++11后的erase-remove惯用法,帮助开发者编写更健壮的代码。 阅读详情

做一道求两数组交集的题目时我用迭代器遍历两个数组,并在迭代中用了erase操作,有了下面的报错

=================================================================
==42==ERROR: AddressSanitizer: negative-size-param: (size=-120)
    #5 0x7f52c5b84082  (/lib/x86_64-linux-gnu/libc.so.6+0x24082)
0x602000000114 is located 4 bytes inside of 8-byte region [0x602000000110,0x602000000118)
allocated by thread T0 here:
    #6 0x7f52c5b84082  (/lib/x86_64-linux-gnu/libc.so.6+0x24082)
==42==ABORTING

错误代码如下

for(vector<int>::iterator it1=nums1.begin();it1 !=nums1.end();)
        {
            for(vector<int>::iterator it2=nums2.begin();it2 !=nums2.end();)
            {
                if(*it1==*it2)
                {
                    com.push_back(*it1);
                    nums1.erase(it1);
                    nums1.erase(it2);
                    continue;
                }
                it2++;

            }
            it1++;
        }

补充一点 可以利用迭代器修改vector元素

vector<int>v1;
v1.push_back(10);
vector<int>::iterator it = v1.begin();
*it = 12;
cout<<*it;

v1先插入的元素10被修改为了12

C++笔记之迭代器失效问题处理 函数后,使用返回的新迭代器来继续遍历容器。如果你需要在循环中擦除元素,请特别注意处理迭代器的有效性。的元素时,尽量使用返回新迭代器的擦除操作或者标准算法,以确保迭代器不会失效。来将满足条件的元素移到容器末尾,并返回一个指向新的逻辑尾部的迭代器,然后再使用。处理迭代器失效的方法取决于具体的情况和需求。中删除元素时,原来指向被删除元素的迭代器就会失效,进而可能引起未定义行为。来说,擦除(erase)元素会导致迭代器失效。 阅读详情

相关推荐

多机器人协同:水下机器人集群的分布式控制与ROS仿真实践

本文探讨了多自主水下机器人(AUV)集群的分布式控制方法,重点分析了欠驱动6自由度AUV模型的反馈线性化技术。通过ROS/Gazebo仿真平台,详细介绍了系统架构设计、通信延迟补偿策略及环境扰动应对方案,为水下协同作业提供实用参考。

jupi8的博客 688

移除元素(C++)

给你一个数组nums和一个值val,你需要移除所有数值等于val的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用O(1)额外空间并。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。为什么返回数值是整数,但输出的答案是数组呢?请注意,输入数组是以方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。你可以想象内部操作如下://是以“引用”方式传递的。也就是说,不对实参作任何拷贝// 在函数里修改输入数组对于调用者是可见的。

weixin_60389179的博客 627

Lmcache+vllm——KVcache卸载CPU/SSD探索

目前查看了vllm、Nvidia dynamo、mooncake都没有找到将kvcache卸载到SSD的方法,幸好lmcache支持。以下进行lmcache+vllm实践,对比将kvcache分别卸载到CPU-ram和SSD上的TTFT性能差异。目前的query只是单并发,对比的效果已经比较明显了,可能多并发下对存储的要求就会更高了。

weixin_43579058的博客 2655

【C语言刷LeetCode】Address Sanitizer 常见报错

LeetCode使用 AddressSanitizer 检查内存是否存在非法访问,报此错,主要是访问了非法内容。 Address Sanitizer(ASan)是google开发一个快速的内存错误检测工具,性能据说比valgrind要好不少,可以配合clang或者GCC编译器使用,GCC需要4.8及以上版本。 详细了解AddressSanitizer信息可以访问其github项目地址:http...

kinbo88的专栏 1万+

GEO数据库数据下载方法总结

#GEO数据下载 GEO是生信分析经常用到的数据库。经常需要从中获取表达矩阵,平台信息,meta信息等,本博文总结了几种下载GEO数据的方法,各有优劣,实际应用过程中自行选择适合自己的。 ##方法一:直接从浏览器中下载 以数据集GSE1001为例, 可以直接点击“Series Matrix Files”获取该样本txt格式的表达谱数据,一般我们认为这种处理过的表达谱数据是没有问题的,当然,具体情况具体分析。 打开下载的文件可以看到许多“#”开头的行,这些是注释信息,一般关注这些注释信息中的“data pr

sakoko_的博客 4万+

IOS APP上架被拒 4.3(a) - Design - Spam,成功

成功解决IOS APP上架被拒 4.3(a) - Design - Spam,本篇博客记录了详细过程

qq_40147106的博客 6910

内存错误检测-AddressSanitizer

目录 简介: 使用范围: 使用方法: 结合gdb: 运行结果: 简介: AddressSanitizer是C/C++内存错误检测的工具,它是LLVM3.1版本开始支持,GCC从4.8版本开始支持,它可以检测以下错误: 功能: 1.释放后使用(悬空指针解除引用) 2.堆缓冲区溢出 3.堆栈缓冲区溢出 4.全局缓冲区溢出 5.使用返回值访问局部变量 6.使用释放后的局部变量内存 7...

qing310820的专栏 8396

联想X3650M5服务器双模式切换实战:UEFI与Legacy BIOS如何选择?

本文深入探讨了联想X3650 M5服务器在UEFI与Legacy BIOS启动模式间的选择策略。文章从技术原理、决策矩阵、实战切换步骤及后期验证等方面,为企业IT管理员提供了基于操作系统兼容性、存储架构、安全合规与运维习惯的完整决策框架,帮助其在数据中心硬件生命周期管理中做出明智选择。

weixin_29207533的博客 281

STL的erase()陷阱-迭代器失效总结

阅读目录(Content) 1.list,set,map容器 1.1 正确写法1 1.2 正确写法2 1.3 错误写法1 1.4 错误写法2 1.5 分析 2. vector,deque容器 2.1 正确写法 2.2 注意 3.迭代器失效的情况 3.1 vector 3.2 deque 3.3 list 3.4 slist 3.5 stack 3.6 queue 3.7 priority_queue 3.8 set 3.9 multi

jinchengzhou的专栏 3085

高频网络协议与编程IO相关面试基本问题和知识点整理

网络IO相关基本高频面试基本问题和知识点整合

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 173万+

Qt界面美化-飞扬青云自绘控件插件的使用-避免采坑

1、先上一个集成到QtCreater中的效果图: 2、飞扬青云自绘控件插件下载地址:https://gitcode.net/mirrors/feiyangqingyun/qucsdk?utm_source=csdn_github_accelerator 3、集成插件到QtCreater中的方法: (1)、查看自己使用的QtCreater的版本信息,我的:Qt 5.15.2 MSVC2019 64位 (2)插件下载下来后工程预览: 我选择msvc版本的SDK,打开找到匹配的SDK:...

小米的修行之路 2793

[C++]vector的erase()方法遍历删除某些元素迭代器失效问题、及删除最后一个元素迭代器失效问题)

1.vector迭代器失效问题 什么情况下会失效?以及失效的原因 vector是个连续内存存储的容器,如果vector容器的中间某个元素被删除或从中间插入一个元素, 有可能导致内存空间不够用而重新分配一块大的内存 造成失效的其中一原因: 是因为内存的重新分配, 保留下来的迭代器不再指向容器中原来的元素 还有一种是删除元素,迭代器指向的空间自然就是一个无效的地址,无法再使用 使得vector迭代器失效的操作有: (1)执行erase方法时,指向删除节点及其之后的全部迭代器均失...

Wmll1234567的博客 3812

【Unity实战篇 】| 游戏中实现镂空遮罩效果【矩形、圆形镂空遮罩】

本文来写一下怎样在Unity中完成一个 镂空遮罩 的效果。 镂空遮罩 比较常用的有两种:矩形镂空遮罩、圆形镂空遮罩。 镂空遮罩 在游戏中常被当做新手引导必备的内容,可以给玩家更多不一样的体验。 下面就一起来看一下怎样做出这种效果吧!

努力前行,总会成为自己心中的那道光 1万+

容器删除元素后迭代器失效_关于STL的erase()陷阱-迭代器失效问题的总结

下面材料整理自Internet&著作。STL中的容器按存储方式分为两类,一类是按以数组形式存储的容器(如:vector 、deque);另一类是以不连续的节点形式存储的容器(如:list、set、map)。在使用erase方法来删除元素时,需要注意一些问题。1.list,set,map容器在使用 list、set 或 map遍历删除某些元素时可以这样使用:1.1 正确写法1std::lis...

weixin_35662417的博客 536

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

vector的erase()方法遍历删除元素迭代器失效问题、及删除最后一个元素迭代器失效问题)

vector 删除指定元素

qq_19272431的博客 4102

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

如何解决使用erase函数删除元素导致迭代器失效引起的崩溃的问题

在使用 erase  函数删除元素时,会导致后面的迭代器失效。从而引起程序崩溃。

ylf_fengge的博客 695

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

map:erase删除元素之后迭代器失效的问题!(iterator not incrementable)

比如我们现在有如下代码: map&lt;string,int&gt;tmp; for(auto i = tmp.begin();i!=tmp.end();++i) { for(int j = 0;j&lt;tmp-&gt;first;++j) { if(tmp-&gt;first[j] == 55) { tmp.e...

五山口老法师 3988

容器删除元素erase,迭代器失效的问题

转载链接:http://blog.youkuaiyun.com/hlsdbd1990/article/details/46363433  (这篇写的很全面很详细,转载的博主是个女生,厉害,比较有用所以转载收藏下) 简介 看一下9.5节容器之间的区别—-list类似于链表,容易增删改,queue是两端增删改容易。,所以删除时,用到最多的容器时list 1.删除第一个或最后一个元素—

xiaokuang5020的专栏 915

STL中迭代器失效——用erase()方法遍历删除元素

STL迭代器失效的情况         STL中的容器按存储方式分为两类,一类是按以数组形式存储的顺序容器(如:vector 、deque);另一类是以不连续的节点形式存储的容器(如:list、set、map)。在使用erase方法来删除元素时,需要注意一些问题。 1、使用非

success041000的专栏 8683

动态数组(vector)删除元素,迭代器失效

动态数组时一个线性容器,增删改查是容器必备的功能;动态数组(vector)类模板提供了一个成员函数erase(),用于删除数组中的元素。erase有多个重载形式。本文介绍使用迭代器进行元素的删除。

m0_64240990的博客 978

Q18:STL迭代器删除元素

STL迭代器删除元素。

不积跬步无以至千里 809

STL迭代器遍历删除元素:为何不能直接继续循环及正确处理方案

在C++ STL容器中,遍历时删除元素容易导致迭代器失效。本文揭示了迭代器作为"元素位置指示器"的本质,分析了不同容器(vector/list/map等)删除元素后迭代器失效的具体表现,并给出通用解决方案:使用while循环配合erase()返回值更新迭代器。关键点包括:连续内存容器(vector)删除后所有后续迭代器失效,而链表和关联容器仅被删除元素的迭代器失效;正确处理方法是使用it = container.erase(it)更新迭代器,避免直接循环递增。文章还指出了常见误区,如错误

bkspiderx的博客 1057

C++:vector迭代器失效问题

迭代器失效问题一般发生在resize,reserve等开辟空间函数,通过push_back,insert等插入数据函数和pop_back,erase等函数,在使用这些函数时要多加注意迭代器失效的问题。

ggbongjds的博客 617

c++迭代器失效情况

一、序列式容器(数组式容器) 对于序列式容器(如vector,deque),序列式容器就是数组式容器,删除当前的iterator会使后面所有元素的iterator都失效。这是因为vetor,deque使用了连续分配的内存,删除一个元素导致后面所有的元素会向前移动一个位置。所以不能使用erase(iter++)的方式,还好erase方法可以返回下一个有效的iterator。 对于序列式容器,比如vector,删除当前的iterator会使后面所有元素的iterator都失效。这是因为顺序容器内存是连续分配(分

qq_41306849的博客 208

C++ std::map erase() 和迭代器详解:常见面试陷阱与深入理解

erase(it)会返回map.end(),表示迭代器已到达末尾。// 指向 key=2// 删除 key=2// 现在 it == m.end()情况说明删除并前进到下一个删除末尾元素erase()返回end()的意义一个不指向任何元素的“哨兵”迭代器失效规则只有被删元素的迭代器失效。

Ethan_Rich的博客 637

C++中vector迭代器失效问题以及删除所有带有某值的元素

C++中vector迭代器失效问题以及删除特定元素的问题 1.迭代器的失效 C++标准库(第2版)中提到: 如果删除某个元素,所有容器(除了vector和deque)保证迭代器以及用以指向其他元素的引用继续保持有效。 对于vector而言,只有被删除元素之前的迭代器、指针和引用有效,被删除元素以及被删除元素之后的迭代器、指针和引用均会失效。 如果插入某个元素,只有list、forward_list和关联式容器(map/multimap、set/multiset)可以保证原本的迭代器和指向元素的引用继

mingwu96的博客 4860
下一篇: 修改字段时报错Multiple primary key defined
CocaCona
博客等级 码龄5年 21粉丝 11原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值