被這個問題困擾了不少次,有必要整理一下。函數
固然最好的參考資料就是http://www.cplusplus.com/reference/set/set/erase/ 裏的Complexcity部分了,可是有必要記住常見的一些複雜度。不然會掉坑的。spa
先來看一下vector的erase複雜度:code
Linear on the number of elements erased (destructions) plus the number of elements after the last element deleted (moving).seo
析構函數的複雜度和後面要移動的複雜度,因此通常狀況下若是不是刪除最後一個(固然刪除最後一個直接用pop_back()就能夠了)是O(1)外,其它都是O(n),即線性的。ip
再來看一下set的erase複雜度以下,它有三種狀況的erase,複雜度不一樣ci
(1)iterator erase (const_iterator position);
(2) size_type erase (const value_type& val);element
For the first version (erase(position)), amortized constant.
For the second version (erase(val)), logarithmic in container size.
For the last version (erase(first,last)), linear in the distance between first and last.get
第一種方法也就是刪除迭代器的位置,複雜度是攤銷常數;第二種方法也就是直接刪除一個常數,複雜度是log,最後一種刪除一段區間,複雜度是O(n)it
能夠看到,若是咱們的序列自己有序而且刪除的位置能夠肯定或者值肯定,那麼用vector會很慢,這時能夠考慮set或者是手寫erase相似這種io
1
2
3
4
5
|
auto linear_erase=[](auto& v, const size_t index){
std::swap(v[index], v.back());
v.pop_back();
};
|