vector是一个向量容器,在C++开发中经常会使用到,vector本身自带的删除函数有:
- iterator erase(iterator it):删除向量中迭代器指向元素
- iterator erase(iterator first,iterator last):删除向量中[first,last)中元素
- void pop_back():删除向量中最后一个元素
- void clear():清空向量中所有元素
如果要删除vector中指定的元素,则可以使用 erase函数,该函数可以删除一个迭代器指向的元素或者一个迭代器区间的元素,但是该函数执行过程中每被删除一个元素,则指定迭代器就会失效,并且该迭代器之后的元素都要进行移位,如果频繁使用该函数效率会很低。
C++ <algorithm>中提供了一个remove方法,但是采用remove一般情况下不会改变容器的大小,删除指定元素,后面的元素会向前移动,然后用"未删除"对象来填补被删除对象留下的缺口。所以remove过程中迭代器不会失效,但是整个vector中肯定没有被删除的元素数据了。remove之后再结合erase函数才能达到真正删除的目的。
demo测试:
测试环境:
Ubuntu 16.04.4 LTS
gcc version 4.8.5
测试代码:
#include <iostream>
#include <vector>
#include <algorithm>
void showData(vector<int>& vec) {
cout<<"vec siez:"<<vec.size()<<endl;
vector<int>::iterator it = vec.begin();
for(; it!=vec.end();it++) {
cout<<*it<<" ";
}
cout << endl;
}
int main()
{
vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
vec.push_back(4);
vec.push_back(3);
vec.push_back(5);
showData(vec);
vector<int>::iterator ret = remove(vec.begin(), vec.end(), 3);
cout<<"ret = "<<*ret<<endl;
showData(vec);
vec.erase(ret, vec.end());
showData(vec);
return 0;
}
输出:
vec siez:6
1 2 3 4 3 5
ret = 3
vec siez:6
1 2 4 5 3 5
vec siez:4
1 2 4 5
总结:
1、当需要删除的元素在vector中有重复的情况,使用remove和erase一起使用比较简单高效。
2、当要删除vector中不同元素的时候,通常是在for循环中找到需要删除的元素,然后再一一删除,但是这个过程一不小心还会出错。所以也可以用remove和erase结合解决。
问题:
其实这里有一个疑问,就是使用remove方法也有移位操作,但是跟erase相比,到底哪个效率高?