删除vector容器的对象元素有三种方法:pop_back,erase,remove算法。
向量容器的成员函数pop_back()可以删除最后一个元素;
函数erase()可以删除由一个iterator指出的元素,也可以删除一个指定范围内的元素;
通用算法remove()也可以用来删除vector容器的元素,不同的是remove一般情况下不会改变容器的大小,而pop_back()和erase()等成员函数会改变容器的大小。
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <list>
using namespace std;
void PrintInt(const int&nData)
{
cout << nData << endl;
}
int main()
{
vector<int> vecInt;
for (int i = 0; i < 10; ++i)
vecInt.push_back(i);
cout << "vector data is : " << endl;
for_each(vecInt.begin(), vecInt.end(), PrintInt);
cout << "vector contains " << vecInt.size() << " elements" << endl;
vecInt.pop_back(); //删除最后一个元素
cout << "delete the last one data in the vector, vector contains " << vecInt.size() << " elements" << endl;
vector<int>::iterator k = vecInt.begin();
vecInt.erase(k);//删除第一个元素
//vecInt.erase(k); //迭代器k已经失效,会出错
cout << "delete the last one data in the vector, vector contains " << vecInt.size() << " elements" << endl;
//vecInt.erase(vecInt.begin(),vecInt.end()); //删除所有元素
//cout<<"删除所有元素后,vector contains "<<vecInt.size()<<"elements"<<endl; //输出为0
vector<int>::iterator vecNewEnd = remove(vecInt.begin(), vecInt.end(), 5); //删除元素
cout << "after element deleted, vector contains " << vecInt.size() << " elements" << endl;
cout << "new vector : " << endl;
for_each(vecInt.begin(), vecNewEnd, PrintInt);
cout << "elements in vector : " << endl;
for_each(vecInt.begin(), vecInt.end(), PrintInt);
system("pause");
return 0;
}
可以看到:remove算法会返回一个指向新的vector的结尾的iterator,从开始到新这个新的结尾(不含新结尾元素)的范围包含了remove操作后剩余的所有元素。还可以看到,删除向量中的元素后,后面的元素都向前移动了。
另外,迭代器用于erase删除元素后,其后会失效,即不能再用该迭代器操作向量。如,例子中的k,当再次用来删除向量的元素后,就会报错。