无法从矢量中按索引擦除项目C++

Cannot erase item by index from C++ vector

本文关键字:索引 擦除 项目 C++      更新时间:2023-10-16

我正在尝试学习C++向量,所以我写了一个非常基本的代码。基本上,我有一个包含指向人的指针结构的向量。就像这样:

typedef struct _person
{
unsigned long id;
char* name;
unsigned long age;
}person;

然后,我有一个向量,定义如下:

vector<person*> MyPersons;

然后,为了进行测试,我创建了一些人员结构,并通过push_back函数将它们推送到矢量。现在,例如,我想从我的向量中删除第一个年龄为 25 岁的人。所以,我所做的是在向量中搜索并获取该人的索引,然后从向量中删除该索引。

for(size_t i = 0; i < MyPersons.size(); i++)
{
pperson = MyPersons.at(i);
if(pperson->age == 25)
{
index = i;
break;
}
}
MyPersons.erase(MyPersons.begin() + index )

现在,它应该从列表中删除该项目,对吧?但是,相反,它给了我错误:

调试断言失败!

表达式:矢量擦除迭代器超出范围

但这是不可能的。我已经用Visual Studio调试了我的代码,我看到索引值是有效的。我的大小为5,指数为2。

任何帮助非常感谢。 真诚地

你不需要typedef struct _person序言,那是C主义。

struct person
{
unsigned long id;
std::string name;
unsigned long age;
}

您也不需要new对象,它们可以是值

std::vector<person> people;

要删除第一个 25 岁的人:

auto it = std::find_if(people.begin(), people.end(), [](person & p) { return p.age = 25; });
if (it != people.end()) people.erase(it);

要移除所有年满 25 周岁的用户,请执行以下操作:

auto it = std::remove_if(people.begin(), people.end(), [](person & p) { return p.age = 25; });
people.erase(it, people.end());

问题很可能是index初始化为不在MyPersons范围内的值,因此如果找不到该值,则会收到错误。

您应该为这些类型的任务使用标准算法,要删除 25 岁的第一个person*,您可以使用:

auto itr = std::find_if(MyPersons.cbegin(), MyPersons.cend(),
[] (person* pperson) { return pperson->age == 25; });
if (itr != MyPersons.cend()) MyPersons.erase(itr);

要删除所有25 岁的person*,您可以使用:

MyPersons.erase(std::remove_if(MyPersons.begin(), MyPersons.end(),
[] (person* pperson) { return pperson->age == 25; }),
MyPersons.end());

使用标准算法比使用手动滚动循环更可取。意图更清晰,生成的代码通常不那么冗长,最重要的是,标准算法更有可能是正确的。

此外,您可能以错误的方式将指向数据的指针存储在std::vector中。