您的位置:首页 > 其它

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;
}




本文版权归kennyMc和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐