对于vector容器的使用,平时只是简单的进行遍历查找一下,未曾进行其它操作,这不,今天出了一点差错;
erase方法的操作是将此时的节点删除,然后指向被删除节点的下一个:
如对数据1 6 6 4 7;
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<int> vec;
vec.push_back(1);
vec.push_back(6);
vec.push_back(6);
vec.push_back(4);
vec.push_back(7);
vector<int>::iterator arr;
//vec.erase(remove(vec.begin(), vec.end(), 6), vec.end());
for(arr = vec.begin(); arr != vec.end(); arr++)
{
if(6 == *arr)
{
vec.erase(arr);
//arr--;
}
}
cout << "The size of vector is :" << vec.size() << endl;
for(arr = vec.begin(); arr != vec.end(); arr++)
{
cout << *arr << " ";
}
cout << endl;
return 0;
}
进行如上操作的结果为:
有一个6未成功删除,由于每次循环后都将迭代器arr++,在成功删除之后节点后移了一位,实际上在删除进行时是后移了两位,故而在删除时:
for(arr = vec.begin(); arr != vec.end(); arr++)
{
if(6 == *arr)
{
vec.erase(arr);
arr--;
}
}有了arr--操作,就可抵消删除时的自动后移,从而成功进行:
当然,erase还有另外一个方法,就是删除两个节点之间的全部元素,这时依靠remove操作将等于删除值的节点全部移到容器末尾,进行删除;
将上述for循环删除的注释,将其上一行的vec.erase(remove(vec.begin(), vec.end(), 6), vec.end());注释取消即可实现;
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<int> vec;
vec.push_back(1);
vec.push_back(6);
vec.push_back(6);
vec.push_back(4);
vec.push_back(7);
vector<int>::iterator arr;
vec.erase(remove(vec.begin(), vec.end(), 6), vec.end()); //
/*for(arr = vec.begin(); arr != vec.end(); arr++)
{
if(6 == *arr)
{
vec.erase(arr);
arr--;
}
}*/
cout << "The size of vector is :" << vec.size() << endl;
for(arr = vec.begin(); arr != vec.end(); arr++)
{
cout << *arr << " ";
}
cout << endl;
return 0;
}
O(∩_∩)O
vector中的删除,earse和remove的小疑惑--【STL】
原文地址:http://blog.csdn.net/xjm199/article/details/24841071