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)函数的向量,该函数完全可以正常工作

解决方法

问题是您擦除了元素,但没有更新迭代器。为了避免处理这些问题,最好使用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;
});
,

it使erase失效,因此以后的使用是不确定的,包括在循环测试中对其进行递增和比较。

可以

for (auto it = member_list.begin(); it != member_list.end(); )
    if (it->get_name() == member_name)
        it = member_list.erase(it);
    else
        it++

但是有一个标准的<algorithm>

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

在C ++ 20中,它将更加容易

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...