【发布时间】:2017-08-07 16:04:14
【问题描述】:
我需要从满足特定条件的向量中删除所有元素。
我的第一种方法是遍历向量并在所有满足条件的元素上调用 vector::erase。
据我了解,vector::erase 在此用例中的性能很差,因为它会从底层数组中删除该项目,并将向量的其余部分向前移动一个元素(或者如果您删除一个范围则更多元素)。
当您移除多个元素时,后面的元素将在每次移除时移动。
remove 算法将所有要移除的元素移到向量的末尾,因此您只需移除向量的后部,不涉及移位。
但是为什么这比擦除更快?(是不是更快?)
将元素移动到末尾是否意味着将所有后续元素向前移动,就像在vector::erase 中一样?
怎么会,那个remove只有O(n)的复杂度?
【问题讨论】:
-
据我了解,vector::erase 在这个用例中表现不佳 -- 如果编码器不重新安装在导致删除的每次迭代中正确迭代。这只是应该使用
remove / erase的另一个原因。
标签: c++ vector stl erase-remove-idiom