C++中list的erase()函数问题

来源:互联网 发布:香港阿里云 淘宝 编辑:程序博客网 时间:2024/04/29 04:08

erase的作用是,使作为参数的迭代器失效,并返回指向该迭代器下一参数的迭代器。

1)典型错误

using namespace std;int main(){  std::listtest_list;  std::list::iterator test_list_it;  test_list.push_back(1);  test_list_it = test_list.begin();  for(;test_list_it != test_list.end();test_list_it++)  {  test_list.erase(test_list_it);  }}

问题:该程序不能跳出循环
原因:test_list.erase(test_list_it);每次做erase时都有可能使迭代器失效,test_list_it++就发生错误了。可以参见effective stl一书。所有容器做erase操作时都有可能使迭代器失效。

2)改正的原理是使当前迭代器失效时能指向下一个位置,具体的实现方法有三种。

例子
#include<iostream>#include<list>using namespace std;int main(){int i;list<int> list1;list<int> ::iterator it;for(i = 0; i < 8; i++)list1.push_back(i);for(it = list1.begin(); it != list1.end(); ++ it){cout <<*it<<" ";}cout<<endl;/*//写法一for(it=list1.begin(); it!= list1.end(); )if (*it % 2){list1.erase(it++);}elseit++;//写法二for(it=list1.begin();it!=list1.end();){if(*it%2)it=list1.erase(it);else it++;}*///写法三for(it=list1.begin();it!=list1.end();){if(*it%2){list<int>::iterator tmp=it++;list1.erase(tmp);}elseit++;}for (it = list1.begin(); it != list1.end(); ++ it){cout <<*it<<" ";}cout<<endl;return 1;}



0 0
原创粉丝点击