list.erase导致迭代器失效问题
2012-12-01 01:55
387 查看
#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; }
![](http://pic002.cnblogs.com/images/2012/438266/2012120101540711.png)
本文版权归kennyMc和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
相关文章推荐
- C++中防止STL中迭代器失效——map/set等关联容器——vector/list/deque等序列容器—如何防止迭代器失效—即erase()的使用
- 如何处理C++删除容器中元素时导致的迭代器失效问题
- 关于STL的list,vector等用迭代器iterator,用erase删除元素出现的问题。
- 迭代器失效问题——小心使用erase()
- 容器insert、erase操作引起迭代器失效问题
- 基于list循环删除元素,迭代器失效的问题详解
- 关于STL的erase()陷阱-迭代器失效问题的总结
- STL list erase 删除一个节点后,迭代器会失效吗
- 关于STL的list,vector等用迭代器iterator,用erase删除元素出现的问题。
- C++中防止STL中迭代器失效__map/set等关联容器vector/list/deque等序列容器_如何防止迭代器失效_即erase()的使用
- C++中防止STL中迭代器失效__map/set等关联容器vector/list/deque等序列容器_如何防止迭代器失效_即erase()的使用
- C++关于迭代器删除(erase)插入(insert)失效问题
- C++中防止STL中迭代器失效——map/set等关联容器——vector/list/deque等序列容器—如何防止迭代器失效—即erase()的使用
- 关于list循环删除元素,迭代器失效的问题
- C++关于迭代器删除(erase)插入(insert)失效问题http://m.blog.csdn.net/blog/a327369238/26715187
- 关于vector的erase操作后,迭代器失效问题
- STL中的erase操作导致指针失效问题
- 关于扩展 Laravel 默认 Session 中间件导致的 Session 写入失效问题分析
- std::map中迭代器失效的问题
- 迭代器失效(1)-小心使用STL容器的erase()