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

Time Complexity of std::vector::erase

本文关键字:时间复杂度 vector std erase      更新时间:2023-10-16

我找到了一种从STL向量中删除元素的方法,它的值在这里:

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

现在我想知道这个方法的效率有多高,也就是说它在大O表示法中的时间复杂性。

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

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

所以这使得这个运算为O(n)。

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

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

特别是,在最后擦除元素是非常便宜的,因为所做的一切都是破坏要擦除的元素,所以erase-调用的时间复杂度应该是线性的,就vec-中value的出现次数而言,这对应于Big Oh符号中的Θ(n)。整个表达式的复杂度仍然是线性的,因为remove在其应用的范围长度方面具有线性复杂度。如果vec的大小由变量m描述,则对于等于O(m)的完整表达式,我们具有θ

它可以是任何东西,因为析构函数的复杂性是未知的

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

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