向量的 std remove 和 vector erase 的区别
std::remove
:它实际上并没有从容器中删除元素,而只是将未删除的元素向前分流到已删除元素的顶部。
vector::erase
:从向量中删除单个元素(位置)或一系列元素([first, last))。
std::remove 与 vector::erase
通过使用 erase()
, std::vector
中的所有元素将被移动 1 位导致大量副本; std::remove
只是进行“逻辑”删除,并通过移动东西使向量保持不变。
如果需要从向量中删除多个元素, std::remove
会将每个未删除的元素仅复制一次到其最终位置,而 vector::erase
方法会将所有元素从该位置移动到末尾多个/次。
例如,删除以下向量中所有 < 5
的元素。
使用擦除,如果逐个删除元素,则会删除 1,从而导致剩余元素的副本被移动 (4)。 然后,将删除 2 并将所有剩余元素移动一 (3)…按照这种模式,这是一个 O(N^2) 算法。
在 std::remove
的情况下,算法维护一个头部,并迭代容器。 对于前 4 个元素,头部将被移动并测试元素,但不会复制任何元素。 仅对于第五个元素,对象将从最后一个位置复制到第一个位置,并且该算法将以单个副本完成并将迭代器返回到第二个位置。 这是一个 O(N) 算法。 后面的带有范围的 std::vector::erase
将导致所有剩余元素的破坏并调整容器的大小。
因此, erase()
对容器中的元素执行的操作, remove()
是对范围执行的操作,因为它会重新排列该游侠,但不会从该范围中删除任何内容。
示例代码:
输出结果: