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

时间:2019-03-31 22:25:17

标签: c++

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

#include "pch.h"
#include <iostream>
#include <vector>

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

int main()
{
    std::vector<Account> 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()算法可以在向量中定位该对象?

2 个答案:

答案 0 :(得分:3)

再次出现1991年的Arrrg。

我要澄清的第一件事是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});

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

    // 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);
    }

答案 1 :(得分:2)

使用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上已经有answers可以帮助解决此问题。