有没有像 std::remove() 这样的东西不保留向量的保留元素的顺序?

问题描述

在 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() 不会交换 - 相反,它只会移动元素,将要移除的元素保持在任意移出状态。这可能比交换更有效,尤其是在交换向量元素不便宜的情况下。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...