[英]Time Complexity of std::vector::erase
我找到了一种从STL向量中删除元素的方法,其值在这里 :
vec.erase(remove(vec.begin(), vec.end(), value), vec.end());
现在,我想知道此方法的效率,这意味着它的时间复杂度为Big O表示法。
vec.erase(删除(vec.begin(),vec.end(),值),vec.end());
在这种情况下,remove在向量的开头压缩与要删除的值(值)不同的元素,并将迭代器返回到该范围之后的第一个元素。 然后擦除删除元素。
因此,此操作为O(n)。
C ++ 11标准在[vector.modifiers] / 4中指定:
复杂度 :
T
的析构函数被称为等于擦除的元素数的次数,但是T
的移动赋值运算符被称为等于被擦除的元素之后向量中的元素数的次数。
尤其是,最后删除元素非常便宜,因为完成的所有操作都在破坏要擦除的元素,因此, erase
调用的时间复杂度应根据vec
内部value
的出现次数呈线性关系,这与Big-Oh-表示法中的Θ(n) 。 整个表达式的复杂度仍然是线性的,因为remove
在应用范围的长度方面具有线性复杂性。 如果vec
的大小由变量m描述,则完整表达式的Θ(n + m)等于O(m) (因为n <m和m + n <2m ,所以O(2m)= O(m) )
由于分解的复杂性未知,可能是任何事情
但是假设它是常数,那么它将是O(n)
O(N),因为您正在遍历向量的每个元素。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.