问题描述
在 C++14 中,我有一个 std::vector
值,我想删除与给定值匹配的所有元素,并且我不关心在删除后保留元素的顺序。 std::remove
的规范规定保留元素的相对顺序。
是否有内置算法可以执行 std::remove
之类的操作,但不会保留顺序?我希望这样做,因为将向量末尾的元素交换到要删除的位置的工作量较少,从而扰乱了向量中元素的顺序。该算法仍然是线性的,因为它必须访问每个元素以检查是否被删除,但是如果最终只有少数项目被删除,它必须对每个元素执行的恒定工作量会大大减少。
解决方法
是否有内置算法可以执行 std::remove 之类的操作,但不会保留顺序?我希望这样做,因为只需将向量末尾的元素交换到要删除的位置即可
std::partition()
是一种算法,可以满足您的要求。您需要为要保留的值提供谓词,而不是要删除的值。
例如,给定 std::vector v;
,而不是
v.erase( std::remove(v.begin(),v.end(),value),v.end() );
你会写:
v.erase( std::partition(v.begin(),[&](const auto& elem){return elem!=value;}),v.end() );
然而,这不一定比 std::remove()
更有效。问题在于 std::remove()
不会交换 - 相反,它只会移动元素,将要移除的元素保持在任意移出状态。这可能比交换更有效,尤其是在交换向量元素不便宜的情况下。