这里的性能问题不是关于删除要删除的元素,或者将它们移动到最后(这实际上不会发生),而是关于移动要保留的元素。
如果您erase
在要删除的每个元素上使用,则需要在这些元素之后移动所有元素...对于每次调用erase
. 通常,如果要删除k
元素,您将在最近一次(在向量中)之后移动元素,k
而不是仅移动一次。
但是如果你打电话remove
,你只会移动一次(见下面的例子)。
一个小例子可以更好地理解这两种方法是如何工作的:
假设您有一个大小为 1000 的向量,并且您要删除的元素位于位置 17 和 37。
作用于erase
要删除的两个元素:
- 当您调用
erase()
第 17 个元素时,您需要将第 18 个元素移动到 999、982 个元素。
- 当您调用
erase()
第 36 个元素时(现在是第 36 个!),您需要将元素 37 移动到 998、962 个元素。
总共移动了 962 + 982 = 1944 个元素,其中 962 个元素被移动了两次。
随着remove
,发生的情况如下:
element 0 does not change;
element 1 does not change;
...
element 17 is "discarded";
element 18 is moved at position 17;
element 19 is moved at position 18;
...
element 36 is moved at position 35;
element 37 is "discarded";
element 38 is moved at position 36;
...
element 999 is moved at position 997.
您总共移动了 998 个元素(1000 减去您删除的两个元素),这比之前方法的 1943 个元素要好得多。如果您有超过 2 个要删除的元素,这会更好。
您可以在 en.cppreference.com 上查看可能的实现,以更好地了解其std::remove
工作原理。