【經驗】STL的list vector在iterator迭代器的循環中 使用erase 造成的BUG


 

#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例子 不夠好,配合源碼 以及經常更新的例子 才能讓我們更加理解其工作原理。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM