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