从向量中删除对象的方法?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (13)

我正在努力从向量中删除自定义类型。我有以下代码:

  #include "pch.h"
    #include 
    #include 

    class Account {
    public: 
        std::string name;
        int balance; 
    };

    int main()
    {
        std::vector holding_vector;
        Account new_acc1;
        Account new_acc2;
        Account new_acc3; 
        holding_vector.push_back(new_acc1);
        holding_vector.push_back(new_acc2);
        holding_vector.push_back(new_acc3);

    }

我该如何去除new_acc2?可以想到的唯一真实想法是尝试覆盖其中一个类'运算符,以便find()算法可以在向量中定位对象?

提问于
用户回答回答于

我只想澄清的new_acc2是不在向量中。new_acc2在向量中创建了变量的副本。

麻烦的是new_acc1new_acc2new_acc3所有具有相同的值(基本没有姓名和余额为零)。因此,当您将它们放入矢量时,您将获得基本相同对象的三个副本。那么你怎么知道你要删除哪一个(它们都是一样的)。

要从矢量中删除某些内容,您应该能够唯一地识别它。因此,假设您将每个帐户添加到向量时为每个帐户指定了一个新的唯一名称。

    holding_vector.push_back(Account{"Bob", 10});
    holding_vector.push_back(Account{"Mary", 20});
    holding_vector.push_back(Account{"John", 40});

现在您要删除“John”的帐户。然后你可以使用擦除方法。

    // first you have to find a reference to the object you want
    // to remove.
    auto find = std::find_if(std::begin(holding_vector), std::end(holding_vector),
                             [](auto const& a){return a.name == "John";});

    // If you found the item then you can remove it.
    if (find != std::end(holding_vector)) {
        holding_vector.erase(find);
    }

注意:上面我们必须使用专门的Lambda告诉代码如何检查名为“John”的命名帐户。但是,您可以通过简单地将对象与字符串进行比较来简化操作。

class Account {
    public: 
        std::string name;
        int balance; 

        bool operator==(std::string const& test) const {return name == test;}
    };

现在您可以通过以下擦除简化上述内容:

    // first you have to find a reference to the object you want
    // to remove.
    auto find = std::find(std::begin(holding_vector), std::end(holding_vector), "John");

    // If you found the item then you can remove it.
    if (find != std::end(holding_vector)) {
        holding_vector.erase(find);
    }
用户回答回答于

使用std::find_if查找匹配给定标准的元素。然后使用vector::erase删除该元素。

标准是什么取决于您的要求,这些要求很难用发布的代码来猜测。

例如,如果您要删除具有特定名称的帐户,则可以通过这种方式找到它们;

auto it = std::find_if(std::begin(holding_vector), std::end(holding_vector), [](Account const& acc) { return acc.name == "some_account_name"; });

如果多个项目可以匹配相同的条件,并且您想要将它们全部删除(而不仅仅是第一个),那么我建议删除删除习惯用法。stackoverflow 上已有答案可以帮助解决这个问题。

扫码关注云+社区

领取腾讯云代金券