首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于vector和list的erase()操作有关问题

2012-05-16 
关于vector和list的erase()操作问题C++ Primer(第4版)第9章顺序容器习题:假设有如下ia的定义,将ia复制到一

关于vector和list的erase()操作问题
C++ Primer(第4版)第9章顺序容器习题:

假设有如下ia的定义,将ia复制到一个vector容器和一个list容器中。使用单个迭代器参数版本的erase函数将list容器中的奇数值元素删除掉,然后将vector容器中的偶数值元素删除掉。

C/C++ code
int a[]={0,1,1,2,3,5,8,13,21,55,89};


我写的程序如下:
C/C++ code
    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;        }


在VC6.0下编译运行,出现运行时错误,调试发现错误出现在对list容器的erase()操作。将erase语句改为:
C/C++ code
    for(list<int>::iterator liter=ilist.begin();liter!=ilist.end();++liter)        if(*liter%2!=0)        {            liter=ilist.erase(liter);           //原语句为:ilist.erase(liter);            --liter;        }

则编译运行成功。

问题:为什么对于vector容器不需要进行如上修改?同时请讲一下vector容器和list容器erase操作的具体行为。以及删除元素操作的建议。

谢谢!

[解决办法]
老问题了,因为list上的erase操作会使迭代器失效,而vector不会
深层次来说,就是链表和数组的区别
[解决办法]
vector也会导致迭代器失效的。
楼主看:http://www.cppblog.com/JohnsonLu/archive/2009/10/14/98590.html
[解决办法]
erase可能会导致迭代器失效……
所以建议下面的用法
C/C++ code
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 就不能直接++了。要获得新的迭代器位置。

热点排行