gpt4 book ai didi

c++ - remove-erase 和 find-erase 有什么区别

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:11:12 27 4
gpt4 key购买 nike

假设您要按值从 vector 中删除单个元素。 remove 之间有什么区别? -删除:

vector<int> v;
// add some values
vector<int>::iterator it = remove(v.begin(), v.end(), 5);
v.erase(it);

然后查找-删除

vector<int> v;
// add some values
vector<int>::iterator it = find(v.begin(), v.end(), 5);
if(it != v.end())
{
v.erase(it);
}

最佳答案

您的移除-删除代码不正确。 remove-erase 习语看起来像这样:

vector<int>::iterator it = remove(v.begin(), v.end(), 5);
v.erase(it, v.end());

在这种情况下,它具有删除所有等于 5 的值的效果,但它最大限度地减少了实现该操作所需的复制量。

您的查找-删除代码仅删除第一个等于 5 的值,因此它会执行您想要的操作。

您的移除-删除代码将所有不等于 5 的值移动到 vector 的前面(这就是 std::remove 所做的),删除 vector 的剩余元素之一,并且在此之后留下任何剩余的元素具有未指定的值(这也是 remove 所做的)。如果 vector 不包含开头的 5,它具有未定义的行为,因为在这种情况下 remove 将返回 v.end() .

因此,如果您只想删除等于 5 的几个元素,那么 std::remove 对您没有用,因为它不保留(其他)5。如果您想将非 5 值移动到开头,将 5 值移动到结尾,在删除第一个 5 之前,实际上您可以使用 std::partition 来做到这一点使用 std::remove:

auto it = partition(v.begin(), v.end(), [](int i) { return i != 5; });
if (it != v.end()) v.erase(it);

虽然,由于一个 5 和另一个一样好,你通过删除最后一个 5 而不是第一个得到相同的结果,并且当有多个 5 时它更有效:

auto it = partition(v.begin(), v.end(), [](int i) { return i != 5; });
if (it != v.end()) v.pop_back();

如果您能以某种方式确定 vector 最初包含恰好 一个等于 5 的元素(不多也不少),那么您的两段代码会做同样的事情。在这种情况下,您不需要在查找-删除代码中对 it != v.end() 进行测试,您会知道它不相等。你可以只做 v.erase(find(v.begin(), v.end(), 5))

关于c++ - remove-erase 和 find-erase 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20000013/

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