1. 程式人生 > >C++關於erase的復雜度(轉載)

C++關於erase的復雜度(轉載)

線性 復雜度 mouse 攤銷 sta dia mona -c lims

被這個問題困擾了很多次,有必要整理一下。

當然最好的參考資料就是http://www.cplusplus.com/reference/set/set/erase/ 裏的Complexcity部分了,但是有必要記住常見的一些復雜度。否則會掉坑的。

先來看一下vector的erase復雜度:

Linear on the number of elements erased (destructions) plus the number of elements after the last element deleted (moving).

析構函數的復雜度和後面要移動的復雜度,所以一般情況下如果不是刪除最後一個(當然刪除最後一個直接用pop_back()就可以了)是O(1)外,其它都是O(n),即線性的。

再來看一下set的erase復雜度如下,它有三種情況的erase,復雜度不同

(1)iterator erase (const_iterator position);
(2) size_type erase (const value_type& val);

>(3) iterator erase (const_iterator first, const_iterator last);

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.

第一種方法也就是刪除叠代器的位置,復雜度是攤銷常數;第二種方法也就是直接刪除一個常數,復雜度是log,最後一種刪除一段區間,復雜度是O(n)

可以看到,如果我們的序列本身有序並且刪除的位置可以確定或者值確定,那麽用vector會很慢,這時可以考慮set或者是手寫erase類似這種

1 2 3 4 5 auto linear_erase=[](auto& v, const size_t index){
std::swap(v[index], v.back()); v.pop_back(); };
轉載自:http://www.ohazyi.com/erase-complexcity/

C++關於erase的復雜度(轉載)