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

被這個問題困擾了不少次,有必要整理一下。函數

固然最好的參考資料就是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

>(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.get

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

能夠看到,若是咱們的序列自己有序而且刪除的位置能夠肯定或者值肯定,那麼用vector會很慢,這時能夠考慮set或者是手寫erase相似這種io

 

相關文章
相關標籤/搜索