std :: vector :: erase的时间复杂度

时间:2014-11-03 16:44:37

标签: c++ vector time-complexity

我找到了一种从STL向量中移除元素的方法here

vec.erase(remove(vec.begin(), vec.end(), value), vec.end());

现在我想知道这种方法有多高效,这意味着它在Big O符号中的时间复杂度。

4 个答案:

答案 0 :(得分:4)

vec.erase(remove(vec.begin(),vec.end(),value),vec.end());

在这种情况下,remove会压缩与向量开头的要删除的值(值)不同的元素,并将迭代器返回到该范围之后的第一个元素。然后擦除将删除元素。

所以这使得这个操作O(n)。

答案 1 :(得分:0)

C ++ 11标准在[vector.modifiers] / 4中指定:

  

复杂性T的析构函数被称为次数等于被删除元素的数量,但移动赋值   T的运算符被称为等于数量的次数   擦除元素后向量中的元素。

特别是,最后擦除元素非常便宜,因为所做的一切都在破坏要擦除的元素,因此erase - 调用的时间复杂度应该是出现次数的线性value内的vec - 对应于Big-Oh-Notation中的Θ(n)。整个表达式的复杂性仍然是线性的,因为remove在应用范围的长度方面具有线性复杂性。如果vec的大小由变量 m 描述,我们有Θ(n + m)表示等于 O(m)的完整表达式(因为 n&lt; m m + n&lt; 2m O(2m)= O(m))< / p>

答案 2 :(得分:0)

它可能是任何因为结构的复杂性未知

但假设它是常数,那么它将是O(n)

答案 3 :(得分:-1)

O(N)因为你正在遍历向量的每个元素。