关于vector和list的erase()操作问题
C++ Primer(第4版)第9章顺序容器习题:
假设有如下ia的定义,将ia复制到一个vector容器和一个list容器中。使用单个迭代器参数版本的erase函数将list容器中的奇数值元素删除掉,然后将vector容器中的偶数值元素删除掉。
int a[]={0,1,1,2,3,5,8,13,21,55,89}; int ia[]={0,1,1,2,3,5,8,13,21,55,89}; size_t arr_size=sizeof(ia)/sizeof(*ia); vector<int> ivec(ia,ia+arr_size); list<int> ilist(ia,ia+arr_size); for(list<int>::iterator liter=ilist.begin();liter!=ilist.end();++liter) if(*liter%2!=0) { ilist.erase(liter); //list的erase()操作 --liter; } for(vector<int>::iterator viter=ivec.begin();viter!=ivec.end();++viter) if(*viter%2==0) { ivec.erase(viter); //vector的erase()操作 --viter; } for(list<int>::iterator liter=ilist.begin();liter!=ilist.end();++liter) if(*liter%2!=0) { liter=ilist.erase(liter); //原语句为:ilist.erase(liter); --liter; }int ia[]={0,1,1,2,3,5,8,13,21,55,89}; size_t arr_size=sizeof(ia)/sizeof(*ia); vector<int> ivec(ia,ia+arr_size); list<int> ilist(ia,ia+arr_size); for(list<int>::iterator liter=ilist.begin();liter!=ilist.end();) if(*liter%2!=0) { liter = ilist.erase(liter); //list的erase()操作 } else ++liter; for(vector<int>::iterator viter=ivec.begin();viter!=ivec.end();) if(*viter%2==0) { viter=ivec.erase(viter); //vector的erase()操作 } else ++viter;
[解决办法]
因为用earse 的时候,以前的迭代器会失效,所以之前的iter 就不能直接++了。要获得新的迭代器位置。