我找到了一种从STL向量中移除元素的方法here:
vec.erase(remove(vec.begin(), vec.end(), value), vec.end());
现在我想知道这种方法有多高效,这意味着它在Big O符号中的时间复杂度。
答案 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)因为你正在遍历向量的每个元素。