c++ - 出现 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;
});
推荐阅读
- css - 具有多个相同宽度的自动列的 CSS Grid
- numpy - 如何一次构建一个numpy矩阵一行?
- android - Android 11 用户无法授予后台位置权限?
- webp - 将png转换为webp后动画丢失
- node.js - 这有可能解决复杂的猫鼬填充查询吗?
- python - Word 嵌入,数据格式不确定如何组合
- jquery - jQuery Sortable 连接两个列表。我可以使第一个列表不可排序但将项目复制到第二个列表吗?第二个列表是可排序的
- c# - 如何在 C# 中将数组转换为 openCV Mat 对象?
- python - 使用 tensorflow 的数据集 API 使数据在现场可用
- wpf - 使用异步时 Thread.CurrentThread.CurrentUICulture 更改 .net 4.8