我正在努力从向量中删除自定义类型。我有以下代码:
#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()
算法可以在向量中定位该对象?
答案 0 :(得分:3)
再次出现1991年的Arrrg。
我要澄清的第一件事是new_acc2
不在向量中。在向量中创建了变量new_acc2
的副本。
问题在于new_acc1
,new_acc2
和new_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可以帮助解决此问题。