【转】vector中erase()的使用注意事项

vector::erase():从指定容器删除指定位置的元素或某段范围内的元素
vector::erase()方法有两种重载形式
如下:
iterator erase(   iterator _Where);
iterator erase(   iterator _First,   iterator _Last);
如果是删除指定位置的元素时:
返回值是一个迭代器,指向删除元素下一个元素;
如果是删除某范围内的元素时:返回值也表示一个迭代器,指向最后一个删除元素的下一个元素;

看下面的程序,目的是删除数组里面的所有值为6的元素:

 /**
*description:vector中erase()函数的使用注意事项
*author:CodingMengmeng
*time:2017-08-18 20:46:28
*example:删除vector中的6
*/
//#include <iostream>
//#include <vector>
//using namespace std;
//
//int main()
//{
// vector<int> array;
// array.push_back(1);
// array.push_back(6);
// array.push_back(3);
// array.push_back(6);
// array.push_back(6);
// array.push_back(2);
//
// vector<int>::iterator itor;
// vector<int>::iterator itor2;
// for (itor = array.begin(); itor != array.end();)
// {
// if (6 == *itor)
// {
// itor2 = itor;
// itor = array.erase(itor2);
// }
// itor++;
// }
// for (itor = array.begin(); itor != array.end();)
// {
// cout << (*itor++) << endl;
// }
// return 0;
//
//}
//输出
//1
//3
//6
//

  可见,其中一个6并未删除,这是迭代器的问题。

  原因在于erase之后,itor已经指向下一个元素了,不应该再itor++,否则会跳过下一个元素,即连续两个6时,跳过了第二个6。另外,在itor2=itor时,两个itor是一样的,这样做并没有意义,可修改如下:

 /**
*description:修改后
*author:CodingMengmeng
*time:2017-08-18 20:49:12
*/ #include<iostream>
#include <vector>
using namespace std; int main()
{
vector<int> array;
array.push_back();
array.push_back();
array.push_back();
array.push_back();
array.push_back();
array.push_back();
vector<int>::iterator itor;
for (itor = array.begin(); itor != array.end();)
{
if ( == *itor)
{
itor = array.erase(itor);
}
else
{
itor++;
}
}
for (itor = array.begin(); itor != array.end();)
{
cout << (*itor++) << endl;
}
return ;
} //输出:
//1
//3
//
上一篇:Centos7安装vsftpd


下一篇:FutureTask源码解读