以下为C++ primer 中 习题9.26的答案,是关于vector 的erase方法。
#include "stdafx.h"
#include <iostream>
#include <string>
#include <vector>
#include <bitset>
#include <cstring>
#define ARRAY_LENGTH 5
using namespace std;
int main(int argc, char * argv[])
{
int ia[10] = {1,2,3,4,5,6,7,8,9,10};
vector<int> vec(ia,ia+10);
list<int> listTemp(ia,ia+10);
for(vector<int>::iterator iter = vec.begin();iter!=vec.end();){
//注意此处for循环中iter的赋值问题,并不是一味的++iter,因为在执行erase之后,iter自动指向iter之后的元素。这是易错点。
if((*iter)%2 == 0){
iter = vec.erase(iter);
}else{
++iter;
}
}
for(list<int>::iterator lter = listTemp.begin();lter!=listTemp.end();){
if((*lter)%2 != 0){
lter =listTemp.erase(lter);
}else{
++lter;
}
}
cout<<"vector number is: "<<endl;
for(vector<int>::iterator iter = vec.begin();iter!=vec.end();++iter){
cout<<*iter<<" ";
}
cout<<"list number is: "<<endl;
for(list<int>::iterator lter = listTemp.begin();lter!=listTemp.end();++lter){
cout<<*lter<<" ";
}
return 0;
}
erase函数的说明:
iterator erase ( iterator position );
iterator erase ( iterator first, iterator last );
现在只关注函数执行后的副作用和返回值。函数调用后使指向position和first之后的所有迭代器失效。返回值则是一个指向删除的最后一个元素后面的元素的迭代器。所以上面代码中的iter在调用erase后就无效了。
要解决这个问题,只需弃用原来的迭代器,使用返回值即可,代码如下:
for(iter = member.begin(); iter != member.end();)
{
if(*iter == 2)
{
iter = member.erase(iter);
}
else
{
iter++;
}
}