首页 > 解决方案 > 出现 std::vector 错误:“无法将向量递增到末尾”,同时想要擦除特定元素

问题描述

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

我想实现一个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);
}

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

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

标签: c++c++11vectorstdvector

解决方案


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

预 C++20

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

在 C++20 中

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

推荐阅读