代码改变世界

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和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。