list.erase导致迭代器失效问题
2012-12-01 01:55 kennyMc 阅读(2421) 评论(0) 编辑 收藏 举报#include <iostream> #include <vector> #include <string> #include <typeinfo> #include <list> #include <deque> using std::cout; using std::endl; using std::vector; using std::string; using std::list; template<typename T> void fun(list<T> &l,const T &val) { list<T>::iterator first=l.begin(); list<T>::iterator last=l.end(); for(;first!=last;) { if(*first==val) { //删除元素以后要给first迭代器重新赋值,之前first指向的地址已经失效 first=l.erase(first);//erase会返回first下一个元素的地址 cout<<"删除元素:"<<val<<endl; } else { cout<<*first<<endl; //之所以在这里递增first,是因为l.erase(first)之后first就指向下一个元素了, //而for的++first表达式会又再让first指向下一个元素 ++first; } } } int main() { list<int> l; l.push_back(1); l.push_back(2); l.push_back(3); l.push_back(4); int val=1; fun(l,val); //测试删除最后一个元素,检查迭代器 l.clear(); l.push_back(1); list<int>::iterator first=l.begin(); list<int>::iterator last=l.end(); first=l.erase(first);//删除first指向元素以后,first被重新赋值,指向list最后一个元素的下一个(也就是last) cout<<(first==last?"last":"error")<<endl; system("PAUSE"); return 0; }
本文版权归kennyMc和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。