您的位置:首页 > 编程语言 > C语言/C++

C++ vector 删除

2011-12-26 22:08 162 查看
标签:C++vector

erase

#include <iostream>

#include <vector>

using namespace std;


int main()

{

vector<int> arr;

arr.push_back(6);

arr.push_back(7);

arr.push_back(8);

arr.push_back(9);

for(vector<int>::iterator it=arr.begin(); it!=arr.end(); )

{

if(* it == 8)

{

it = arr.erase(it);

}

else

{

++it;

}

}

//注意上面不能写成

/*

for(vector<int>::iterator it=arr.begin(); it!=arr.end(); it ++)

{

if(* it == 8)

{

arr.erase(it); //在erase后,it失效,并不是指向vector的下一个元素,it成了一个“野指针”。

}

}

*/

cout << "After remove 8:\n";

for(vector<int>::iterator it = arr.begin(); it < arr.end(); ++it)

{

cout << * it << " ";

}

cout << endl << arr.size();

cout << endl;

}




还有一个示例,看了就更清楚了:



void fun()

{

vector<int> iVec;

vector<int>::iterator it;

for(int i=0;i<10;i++)

iVec.push_back(i);

display(iVec);

for(it=iVec.begin();it!=iVec.end();++it)

{

if(*it ==4 || *it == 7)

{

it=iVec.erase(it);

}

else

++it;

}

display(iVec);

}

l例如上面这个 1 2 3 4 5 6 7 8 9

如果要删除4 和7 两个元素

则删除4后iterator返回5,不满足if()判断,这时++it执行两次,一次是else里面,一次是for()循环里面,导致7被错过

实际上,应该是这样的

void fun()

{

vector<int> iVec;

vector<int>::iterator it;

for(int i=0;i<10;i++)

iVec.push_back(i);

display(iVec);

for(it=iVec.begin();it!=iVec.end();++it)

{

if(*it ==4 || *it == 7)

{

it=iVec.erase(it);

--it;//这里回退一个

}

}

display(iVec);

}


点击打开原文链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: