gpt4 book ai didi

c++ - 使用迭代器从 'find' 或 'remove' 删除

转载 作者:可可西里 更新时间:2023-11-01 18:15:55 24 4
gpt4 key购买 nike

我想知道在 C++ 中从 vector 中删除元素的最佳做法是什么。

我见过很多次人们使用 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 将从 中删除具有给定值的对象的 every 出现 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 更有用,这就是它更常见的原因;特别是,std::remove 后跟 vector::erase 当元素不存在于 vector 中时什么都不做,而 std::find 后跟 vector::erase 具有未定义的行为。

请注意,“查找-删除”和“删除-删除”都保持元素的相对顺序。如果你想从 vector 中移除一个元素但不关心元素的结果顺序,你可以使用“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());

关于c++ - 使用迭代器从 'find' 或 'remove' 删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24011627/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com