STL容器遍历删除时erase操作(iter++)

C++ STL容器元素正确删除 参考文献: 【1】迭代器失效问题:https://www.cnblogs.com/willowcc1803/p/10194757.html 阅读详情

我们知道STL中结点类容器(如:list,hash_map)遍历时进行删除时,需要这样做:

for(list::iterator iter = m_list.begin(); iter != m_list.end(); )
{
if(需要删除)
{
m_list.erase(iter++);
}
else
++iter;
}

而不能这样:
for(list::iterator iter = m_list.begin(); iter != m_list.end(); ++iter)
{
if(需要删除)
{
m_list.erase(iter);
}
}

为什么呢?

以STL list为例:

iterator的相关操作
_Self& operator++()
{
this->_M_incr();
return *this;
}

_Self operator++(int)
{ _Self __tmp = *this;
this->_M_incr();
return __tmp; //后缀++按照语意返回了++前的iterator,
}

void _M_incr() { _M_node = _M_node->_M_next; } //++的操作对于list结构来说,就是使iterator的_M_node指向下一个结点

iterator erase(iterator __position)
{ _List_node_base* __next_node = __position._M_node->_M_next;
_List_node_base* __prev_node = __position._M_node->_M_prev;
_Node* __n = (_Node*) __position._M_node;
__prev_node->_M_next = __next_node;
__next_node->_M_prev = __prev_node; //上面的代码把删除结点__position的前后结点串起来,而移除_positoin
_STLP_STD::_Destroy(&__n->_M_data); //call T::~T()
this->_M_node.deallocate(__n, 1); //释放结点内存
return iterator((_Node*)__next_node);
}

分析代码我们可以看出,erase会deallocate__position的_M_node, 在__position上再进行++是错误的。
所以不能在m_list.erase(iter)后,进行iter++.

哪为什么m_list.erase(iter++)可以呢?为什么不能用m_list.erase(++iter)?
参照operator++的代码我们可以找到答案,iter++返回了++之前的iter值,erase使用这个值能正确进行__position的前后结点的串接及删除正确的结点,而++iter返回的是++之后的iter,所以m_list.erase(++iter)串接不正确,iter->_M_node也是失效的.

对于非结点类,如数组类的容器vector,string,deque,如果erase会返回下个有效的iterator,可以这样处理:
for(vector::iterator iter = m_vector.begin(); iter != m_vector.end()😉
{
if(需要删除)
{
iter=m_vector.erase(iter);
}
else
++iter;
}

芋道前后端分离项目跳过登录 在此页面中可以看到当在没有获取到token时,如果此页面在白名单中则直接进入,所以我们将刚刚配置在。在此路径下配置需要跳过登录的页面路径,记住path中编辑的名称。根据以上两图可以发现芋道的。将所有需要跳过登录的方法。,否则会提示登录状态过期。至此完成免登录进入页面。 阅读详情

相关推荐

STM32F103 串口DMA + 空闲中断 实现不定长数据收发

文章目录1. 空闲中断1.1 uart_dma.c1.2 uart_dma.h1.3 main.c1.4 stm32f10x_it.c1.5 效果演示1.6 知识补充1.6.1 外设的基地址     DMA(Direct Memory Access,直接存储器访问) 是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依赖于 CPU 的大量中断负载。否则,CPU 需要从来源把每一片段的资料复制到暂存器,然后把它们再次写回到新的地方。在这个时间中,CPU

夏夜晚风_的博客 3万+

vector和map用erase删除元素

1、vector的删除 vector的删除中,可以有erase和pop_back函数。erase可以删除指定元素或指定位置的元素,而pop_back只能去掉数组的最后一个元素。这里我们讨论erase函数的用法。 假设有如下程序: vector<int> vec; vec.push_back(1); vec.push_back(2); vec.push...

weixin_37754176的博客 1281

因内存不足原因导致fragment空白解决方案

在androidx之前,一般我们防止Fragment重建是在actvitity的onCreate方法中使用savedInstanceState?.remove(“android:support:fragments”)或者savedInstanceState?但是在androidx中,使用这两行代码不生效,但是看FragmentActivity中的FRAGMENT_TAG还是android:support:fragments,那为什么会不生效呢,后来点进去看发现。

qq_39431405的博客 546

erase的用法

① 对于序列容器vector,deque,erase之后,后面的每个元素的迭代器都会失效,iter成为野指针,此时如果对iter操作会出错 示例1: #include<vector> #include<iostream> #include<algorithm> using namespace std; void print(int n) { cout << n << " "; } int main(int argc, char** argv)

lardoris928的博客 949

Ubuntu 24.04下Loki+Alloy+Grafana日志分析系统的快速部署与实践

本文详细介绍了在Ubuntu 24.04系统上快速部署Loki+Alloy+Grafana轻量级日志分析系统的完整流程。通过二进制安装Loki、配置Alloy采集器以及设置Grafana可视化界面,构建了一套资源消耗低、易于管理的日志解决方案,并实战演示了如何采集和分析网络设备日志,特别适合资源有限的中小团队或边缘计算场景。

tensor9flow的博客 234

修勾逃生巨人危机v10.9.9修改版:免广告无限内购与GM工具详解

游戏修改技术是通过对原版游戏程序进行代码层面的调整,实现特定功能的增强或限制解除。其核心原理涉及内存修改、资源替换和API拦截等技术手段,能够有效提升用户体验和测试效率。在移动游戏领域,免广告和无限内购是常见的技术实现方向,通过屏蔽广告SDK调用和修改内购验证逻辑,为用户提供更流畅的游戏体验。这类技术特别适合游戏开发者进行功能测试,以及玩家希望完整体验游戏内容而不受商业模式限制的场景。以修勾逃生巨人危机v10.9.9版本为例,该修改版集成了GM工具开启功能,通过特定操作路径即可激活调试面板,实现了广告去除和

weixin_30855099的博客 2592

STL:在循环中使用erase报错的情况

之前想写个程序,利用iterator遍历list,然后用if语句删除特定值 像下面这样: for(list<int>::iterator iter=lst.begin();iter!=lst.end(); iter++) { if(*iter==20) { lst.erase(iter); } cout<<*iter<<endl; }...

冷锋的博客 784

基于STM32的多普勒雷达测速

基于多普勒雷达传感器,以STM32单片机为主控芯片,根据不同模块检测距离的不同,使用不同多普勒雷达传感器实现对远近距离车辆行驶速度及方向的测量。 1、基础知识 无线电探测和测距,是用无线电(电磁波)方法发现目标并测定其空间位置的装置。随着雷达技术的发展,现代雷达不仅可以对目标进行定位,还可以测量目标的速度、对目标进行成像甚至测量目标的大小和材料特性。所有利用雷达波来检测物体速度的原理,其理论基础皆源自于“多普勒效应”,...

weixin_52801934的博客 6315

STL容器的遍历删除[zz]

剖析STL容器遍历删除时诡异的erase(iter++) --------------------------------------------------------------------- STL中结点类容器(如:list,hash_map)遍历时进行删除时,需要这样做: for(list::iterator iter = m_list.begin(); iter != m_li

1172

飞书日历同步Outlook翻车?我踩过的坑和最终用Google Calendar成功的完整配置记录

本文详细记录了从Outlook日历同步到飞书时遇到的常见问题及解决方案,特别是通过Google Calendar实现稳定同步的完整配置流程。文章揭示了Outlook同步方案易翻车的原因,并提供了Google Calendar的避坑指南、高级技巧和企业级部署建议,帮助用户高效实现日历同步。

weixin_33724046的博客 313

WRF后处理总结:wrf-python与NCL在WRF后处理中的基本应用——变量提取、计算与可视化

判断需要提取的变量与诊断量确定后,使用getvar函数进行提取。可使用ncdump-h命令查看wrfout中的变量,wrf中的诊断量分类也可从官方文档处查阅。判断绘图类型所需的可视化绘图类型,决定了你在WRF后处理中的计算步骤。1D点线图:ll_to_xy interpline2D填色图:interplevel3D剖面图:vinterp vertcross绘图、美化色标、XY轴、标签的设置等等。

weixin_43750300的博客 1万+

剖析STL容器遍历删除时诡异的erase(iter++)

剖析STL容器遍历删除时诡异的erase(iter++) --------------------------------------------------------------------- STL中结点类容器(如:list,hash_map)遍历时进行删除时,需要这样做: for(list::iterator iter = m_list.begin(); iter != m_li

wenwuge_topsec的专栏 1997

量子化学仿真软件:VASP_(7).表面与界面性质模拟

在量子化学仿真软件领域,表面与界面性质的模拟是研究多相催化、表面反应、材料科学等领域的关键工具。VASP(Vienna Ab Initio Simulation Package)作为一种广泛使用的密度泛函理论(DFT)计算软件,提供了强大的功能来模拟表面与界面的性质。本节将详细介绍如何使用VASP进行表面与界面性质的模拟,包括模型构建、输入文件准备、计算设置、结果分析等步骤。

kkchenjj的博客 948

C++ STL map 删除一个元素 erase 操作

C++ STL map 删除一个元素 erase 操作

qq_43667944的博客 1755

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

8 c++ map应用之insert、遍历、erase

摘要:本文介绍了C++ STL中map容器的三个关键操作:1)插入操作(insert),支持pair和value_type两种参数类型,返回包含迭代器和插入状态的pair;2)遍历操作,通过迭代器访问键值对;3)删除操作(erase),重点说明循环删除时的正确用法:要么在erase前获取下一迭代器(iter++),要么使用erase返回值更新迭代器。特别警告直接删除当前迭代器会导致未定义行为。

u012906122的专栏 4657

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

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的专栏 3084

STL容器遍历删除时诡异的erase

STL容器遍历删除时诡异的erase 2011-07-07 13:02 我们知道STL中结点类容器(如:list,hash_map)遍历时进行删除时,需要这样做: for(list::iterator iter = m_list.begin(); iter != m_list.end(); ) {     if(需要删除)     {         m_li

linuxheik的专栏 542

正确运用stl map的erase方法

erase用来从一个map中删除掉指令的节点eg:map mapTest;typedef map::iterator ITER;ITER iter=mapTest.find(key);mapTest.erase(iter);像上面这样只是删除单个节点,map的形为不会出现任务问题,但是当在一个循环里用的时候,往往会被误用,那是因为使用者没有正确理解iterator的概念.像下面这样的一个例

悬崖边的猪的日志 3089

剖析STL容器遍历删除时诡异的erase(iter++) http://bbs.youkuaiyun.com/topics/100044107

剖析STL容器遍历删除时诡异的erase(iter++) --------------------------------------------------------------------- STL中结点类容器(如:list,hash_map)遍历时进行删除时,需要这样做: for(list::iterator iter = m_list.begin(); iter != m_li

诺尔曼 1086

正确使用stl map的erase方法

先声明:下面的文章是针对windows的用法,因为std::map的erase函数的windows的实现版本是返回一个std::map的迭代器,但是STL标准里面的该函数的返回值确是: map.erase有3个重载: void erase ( iterator position ); size_type erase ( const key_type& x ); void erase ( i

谁的博客谁做主 735

在遍历中使用 iterator/reverse_iterator 进行 Erase 的用法

众所周知,在使用迭代器遍历 STL 容器时,需要特别留意是否在循环中修改了迭代器而导致迭代器失效的情形。下面我来总结一下在对各种容器进行正向和反向遍历过程中删除元素时,正确更新迭代器的用法。首先,要明白使用正向迭代器(iterator)进行反向遍历是错误的用法,要不干嘛要有反向迭代器呢(reverse_iterator)。其次,根据容器的特性,遍历删除操作的用法可以分为两组,第一组是 list 和 vector,第二组是 map 和 set。

飘飘白云 3万+

C++ STL之容器介绍(vector、list、set、map)

STL(Standard Template Library)即标准模板库。STL通过使用模板实现了容器和算法的分离,允许程序员编写与类型无关的代码,这正是泛型编程的核心思想。

new9232的博客 1600

stl erase 的正确使用

stl: 【erase 正确使用】stl之map erase方法的正确使用STL的map表里有一个erase方法用来从一个map中删除掉指令的节点eg:map mapTest;typedef map::iterator ITER;ITER iter=mapTest.find(key);mapTest.erase(iter);像上面这样只是删除单个节点,map的形为不会出现任务问题,

xiaofei0859的专栏 796

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

vector容器迭代器失效情况 插入(push_back)元素时 size超过capacity,则全部失效 size没超过capacity,则 当进行删除操作(erase,pop_back)后,指向删除点的迭代器全部失效;指向删除点后面的元素的迭代器也将全部失效。 deque容器迭代器失效情况 在deque容器首部或者尾部插入元素不会使得任何迭代器失效。(因为deque添加元素,并不会引起缓冲区的重新分配,重新分配的是中控器的空间) 在其首部或尾部删除元素则只会使指向被删除元素的迭代器失效。 在d

jojozym的博客 370

正确使用STL-MAP中Erase函数

第一讲 在STL标准里面,map的erase函数的返回值确如下: map.erase有3个重载: void erase ( iterator position ); size_type erase ( const key_type& x ); void erase ( iterator first, iterator last ); 所以下面代码中的例子是针对标准STL中map的era

WorldMvp的专栏 1746
上一篇: QT/Linux常见错误总结(不定期补充)
下一篇: LIBS+=到底如何用!
自先沉稳~
博客等级 码龄8年 59粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值