被这个问题困扰了不少次,有必要整理一下。函数
固然最好的参考资料就是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();
};
|