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