删除包含2的元素
删除操作的代码:
代码1:
#include <vector>
#include <iostream>
using namespace std;
int main()
{
typedef vector<int> IntArray;
IntArray array;
array.push_back(1);
array.push_back(2);
array.push_back(2);
array.push_back(4);
array.push_back(2);
array.push_back(5);
for (IntArray::iterator it = array.begin();
it != array.end(); it++)
{
cout << *it <<" ";
}
//delete 数值为2的
for (IntArray::iterator itor = array.begin();
itor != array.end(); ++itor)
{
if (2 == *itor)
{
array.erase(itor);
}
}
cout << "deleted" << endl;
for (IntArray::iterator it = array.begin();
it != array.end(); it++)
{
cout << *it <<" ";
}
cout << endl;
}
运行结果:
1 2 2 4 2 5 deleted
1 2 4 5
错误:还有2存在。
问题原因: 调用vecotr的erase()时,被删除元素之后的内容会自动向前移动,导致迭代漏项,
应该在删除一项以后进行或者“itor--”运算。或者修改代码如下:
代码2:
//delete 数值为2的
for (IntArray::iterator itor = array.begin();
itor != array.end();)
{
if (2 == *itor)
{
array.erase(itor);
}
else
{
++itor;
}
}
运行结果:
1 2 2 4 2 5 deleted
1 4 5
正确。
实际上,可以使用remove()算法结合vector的erase()操作函数就可以轻松地完成这一任务。
代码3:
加包含remove()函数的头文件:
#include <algorithm>
删除操作的代码:
//delete 数值为2的
array.erase( remove(array.begin(), array.end(), 2),
array.end() );
运行结果:
1 2 2 4 2 5 deleted
1 4 5
正确。