页首Html代码

返回顶部

【经验】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 我会很高兴的!

posted @   ayanmw  阅读(2616)  评论(2编辑  收藏  举报
编辑推荐:
· 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 让容器管理更轻松!

页脚Html代码

点击右上角即可分享
微信分享提示