无法从矢量中按索引擦除项目C++
Cannot erase item by index from C++ vector
我正在尝试学习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
中。
相关文章:
- 引用一个已擦除类型(void*)的指针
- 擦除while循环中迭代的元素
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- C++擦除(如果存在)
- 在映射擦除c++期间执行循环的次数
- 为什么擦除方法会影响结束方法
- C++ 字符串类擦除成员函数的时空复杂性
- 类型擦除的std::function与虚拟函数调用的开销
- C++14 中unordered_map矢量和擦除删除成语的奇怪行为
- C++ 擦除函数中需要澄清
- 在矢量中使用擦除时双重释放或损坏(快速顶部).如何擦除一个矢量的几个项目知道它们的索引?
- 在擦除或修改作为不同索引键的值时,boost::multi_index 迭代器是否无效?
- 如何使用 erase() 函数通过索引擦除矢量?
- 无法从矢量中按索引擦除项目C++
- 使用 str.erase() 的索引擦除字符串的元素?
- 根据向量大小擦除 for 循环内 std::vector 的索引
- 使用索引向量擦除另一个向量的索引
- 使用迭代器的矢量擦除特定索引(不基于范围或条件)
- 关于擦除提升多索引的交互器
- C++特定索引处的矢量擦除无法使其正常工作