出现 std::vector 错误:“无法将向量增加到末尾”,同时想要擦除特定元素

Dem*_*ion -1 c++ vector stdvector c++11

我有一个类向量,该类有一个字符串名称,以及其他私有字段。

我想实现一个void delete(string name)函数,它根据字符串查找元素(向量中的每个类都有一个唯一的名称)。

但是经过简单的测试,它给了我一个错误“不能增加到最后”。

这是我的功能:

void delete_member(string member_name)
{
    int count = 0;

    for (auto it = member_list.begin(); it != member_list.end(); ++it, ++count)
        if (it->get_name() == member_name)
            member_list.erase(member_list.begin() + count);
}
Run Code Online (Sandbox Code Playgroud)

就我搜索的答案而言,似乎迭代器不应该超过向量的 .end() 。

这里的缺陷是什么?我使用相同的循环来迭代 add_member(Member m) 函数的向量,该函数完全正常

Cro*_*man 5

问题是您擦除了元素但没有更新迭代器。为了避免处理这些,最好使用 STL 算法。标准用法如下

预 C++20

member.erase(std::remove_if(member.begin(), member.end(), [&](const auto& val) 
{
  return val.get_name() == member_name;
}), member.end());
Run Code Online (Sandbox Code Playgroud)

在 C++20 中

std::erase_if(member, [&](const auto& val) 
{
  return val.get_name() == member_name;
});
Run Code Online (Sandbox Code Playgroud)