是否有类似 std::remove() 的东西不保留向量保留元素的顺序?

Is there something like std::remove() which does not preserve the order of retained elements of a vector?

在 C++14 中,我有一个 std::vector 个值,我想删除所有与给定值匹配的元素,我不关心在删除后保留元素的顺序. std::remove 的规范规定保留元素的相对顺序。

是否有内置算法可以执行类似 std::remove 但不保留顺序的操作?我希望这样做,因为只需将向量末尾的元素交换到要删除的位置即可,从而打乱向量中元素的顺序。该算法仍然是线性的,因为它必须访问每个元素以检查是否已删除,但如果最终只有少数项目被删除,则它必须对每个元素执行的持续工作量会大大减少。

Is there a built-in algorithm to do something like a std::remove but that does not preserve the order? I wish to do this since it is less work to just swap elements from the end of the vector into locations to be removed

std::partition() 是一种算法,可以满足您的要求。您需要为要保留的值提供谓词,而不是要删除的值。

例如,给定 std::vector v;,而不是

v.erase( std::remove(v.begin(), v.end(), value), v.end() );

你会写:

v.erase( std::partition(v.begin(), v.end(), [&](const auto& elem){return elem!=value;}), v.end() );

然而,这并不一定比std::remove()更有效率。问题是 std::remove() 不会交换 - 相反,它只会 移动 元素,使要删除的元素保持在任意移出状态。这可能比交换更有效,尤其是在交换向量元素并不便宜的情况下。