使用迭代器擦除'find'或'remove'

Erasing using iterator from 'find' or 'remove'

本文关键字:remove find 迭代器 擦除      更新时间:2023-10-16

我想知道在c++中从向量中删除元素的最佳实践是什么。

我见过很多人使用std::remove来查找和删除元素,然后使用erase从vector中删除元素。

但是,为什么它比使用find获取要删除的元素的迭代器,然后对该迭代器使用erase更好呢?

谢谢

std::find后接vector::erase将擦除vector中首次出现的具有给定值的对象。

std::vector<int> vec{1,3,3,8,3,5};
vec.erase(std::find(vec.begin(), vec.end(), 3));
//vec == {1,3,8,3,5}

std::remove后跟vector::erase将从vector中删除每个出现的具有给定值的对象。

std::vector<int> vec{1,3,3,8,3,5};
vec.erase(std::remove(vec.begin(), vec.end(), 3), vec.end());
//vec == {1,8,5}

两者都不是更好的,他们只是做不同的事情。

std::remove更普遍有用,这就是为什么它更常见的原因;特别是,当元素不存在于vector中时,std::remove后跟vector::erase没有任何作用,而std::find后跟vector::erase则没有未定义的行为。

注意"find-erase"answers"remove-erase"保持元素的相对顺序。如果你想从向量中删除一个元素,但不关心元素的结果顺序,你可以使用"find-move-pop_back"或"partition-erase"

//find-move-pop_back
std::vector<int> vec{1,3,3,8,3,5};
*std::find(vec.begin(), vec.end(), 3) = std::move(vec.back());
vec.pop_back();
//partition-erase
std::vector<int> vec{1,3,3,8,3,5};
vec.erase(
    std::partition(vec.begin(), vec.end(), [](int v){return v != 3;}),
    vec.end());