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

 

相关文章
相关标签/搜索