【经验】STL的list vector在iterator迭代器的循环中 使用erase 造成的BUG
你看到的这个文章来自于http://www.cnblogs.com/ayanmw
#include <iostream> #include <list> #include <vector> using namespace std; typedef unsigned char BYTE; typedef unsigned int UINT32; typedef unsigned short UINT16; struct Datastruct{ BYTE type; UINT16 length; UINT32 value; void show(){ //cout<<" type ="<<type; //C++就是这样烦人 打印出的是字符[char] 非数值 //要想以数值的形式打印 需要进行强制类型转换 //cout.setf(ios::hex,ios::basefield);//设置十六进制显示数值 //cout.setf(ios::showbase|ios::uppercase);//设置0x头和大写 cout<<" type ="<<(int)type; //printf(" type =",type);//还是C语言方便 cout<<" length="<<length; cout<<" value ="<<value<<endl; } }; list<Datastruct> datalist; void data_init(){ Datastruct data; data.type=1; data.length=7; data.value=1; datalist.clear(); for(int i=0;i<4;i++){ data.value+=i;//1 2 4 7 datalist.push_back(data); } } void data_show(){ for(list<Datastruct>::iterator datait=datalist.begin();datait!=datalist.end();datait++){ datait->show(); } } int main(int argc,char **argv) { //初始化 list data_init(); data_show(); //删除 value是偶数的 BUG:删除不完全 因为erase,只循环了2次 for(list<Datastruct>::iterator datait=datalist.begin();datait!=datalist.end();datait++){ if(datait->value%2==0){ datait=datalist.erase(datait); } } cout<<"================================"<<endl; data_show(); data_init(); //删除 value是偶数的 BUG:删除不完全 因为erase,只循环了2次 for(list<Datastruct>::iterator datait=datalist.begin();datait!=datalist.end();datait++){ if(datait->value%2==0){ datait=datalist.erase(datait); datait--; } } cout<<"================================"<<endl; data_show(); return 0; } /********* type =1 length=7 value =1 type =1 length=7 value =2 type =1 length=7 value =4 type =1 length=7 value =7 ================================ type =1 length=7 value =1 type =1 length=7 value =4 type =1 length=7 value =7 ================================ type =1 length=7 value =1 type =1 length=7 value =7 ***********/
最关键的代码:
datait=datalist.erase(datait);
其实,后面跟一个 it -- ; 指向前一个 ,再配合 for循环里面的 it++ ,才能保证正确性!
由于不清楚 STL的源码中到底怎么处理 迭代器的.所以 造成 使用不当。 在www.cplusplus.com 中的erase例子 不够好,配合源码 以及经常更新的例子 才能让我们更加理解其工作原理。
转载请注明出处:http://www.cnblogs.com/ayanmw 我会很高兴的!
------------------------------------------------------------------------------------------------
一定要专业!本博客定位于 ,C语言,C++语言,Java语言,Android开发和少量的Web开发,之前是做Web开发的,其实就是ASP维护,发现EasyASP这个好框架,对前端后端数据库 都很感觉亲切啊。. linux,总之后台开发多一点。以后也愿意学习 cocos2d-x 游戏客户端的开发。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!