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