1. 程式人生 > >Vector 容器快速刪除方法

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