Vector 容器快速删除方法

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相比,到底哪个效率高?

猜你喜欢

转载自blog.csdn.net/yj_android_develop/article/details/81982650
今日推荐