【问题标题】:Remove object from vector based on object property [duplicate]根据对象属性从向量中删除对象[重复]
【发布时间】:2018-02-26 21:25:25
【问题描述】:

我想从具有特定值的属性集的向量中删除对象。在这个例子中:

void RemoveUser(int val)
{
    users.remove_if([val](User u)
    {
        return u.val == val;
    });
}

我可以根据其val 属性删除特定用户。这适用于std::list,但不适用于std::vector。如何在 vector 上归档相同的结果?

【问题讨论】:

  • std::list 有一个 remove_if 成员函数。 std::vector 没有。您可以使用 中的 remove_if。

标签: c++


【解决方案1】:

std::vector 没有remove_if 成员。但是有一个标准算法,恰当地命名为std::remove_if,它可以与向量erase 成员函数协同工作。

users.erase(remove_if(begin(users), end(users), [val](User const& u)
{
    return u.val == val;
}), end(users));

首先remove_if 移动范围的元素,并在所有“好元素”的末尾返回一个迭代器。向量的大小与我们从此时开始时的大小相同。现在迭代器被馈送到erase,它会杀死所有这些项目,从“新端”到向量的“旧端”。

std::list 实现自己的成员版本remove_if 的原因是为了更好地利用其基于节点的结构。它不必复制来移动元素或删除它们。对于std::vector,算法是我们能做的最好的。

【讨论】:

  • 这是一个重要的区别。我已经看到在调用 remove_if 之后在“坏”元素上调用 delete 之类的代码。
  • @juanchopanza - 这意味着代码使用原始指针作为拥有句柄。我认为误解remove_if 是其中最少的问题。
  • 叹息。好吧,那就拿坏元素用它们的价值做任何其他事情。从数据库或其他任何东西中删除表。
  • @juanchopanza - 不需要戏剧。考虑到它的粘性,已经改写了。如果向量元素在移动时没有自行整理,请不要责怪假定值语义的算法。
猜你喜欢
  • 1970-01-01
  • 2012-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-08
  • 2021-07-09
  • 2020-04-28
相关资源
最近更新 更多