首页 > 后端开发 > C++ > 如何在 C 循环中安全地从向量中删除元素?

如何在 C 循环中安全地从向量中删除元素?

Mary-Kate Olsen
发布: 2024-12-10 03:55:21
原创
1025 人浏览过

How to Safely Remove Elements from a Vector in a C   Loop?

在循环内从向量中删除元素

使用向量时的一个常见任务是根据其属性删除特定元素。但是,在迭代向量时更新向量可能会导致意外错误。

让我们考虑以下代码片段:

for (vector<Player>::iterator it = allPlayers.begin(); it != allPlayers.end(); it++) {
    if (it->getpMoney() <= 0)
        it = allPlayers.erase(it);
    else
        ++it;
}
登录后复制

此代码旨在从零或更少金钱的玩家中删除所有玩家向量。然而,执行此代码通常会导致错误消息:

'operator =' function is unavailable in 'Player'

错误原因:

出现该错误是因为 std::vector::erase 内部使用赋值运算符(=)来移动向量内的元素。要使用擦除,Player 类必须实现赋值运算符。

不使用赋值运算符的解决方案:

要避免赋值运算符要求,请注释掉循环:

for (vector<Player>::iterator it = allPlayers.begin(); it != allPlayers.end(); /*it++*/) {
    if (it->getpMoney() <= 0)
        it = allPlayers.erase(it);
}
登录后复制

通过删除it增量,迭代器在每次擦除后自动前进

使用 Erase-Remove Idiom 进行重构:

更简洁的解决方案是使用 Erase-Remove Idiom,它提供了一种简洁有效的方法来从向量:

allPlayers.erase(
    std::remove_if(
        allPlayers.begin(),
        allPlayers.end(),
        [](Player const & p) { return p.getpMoney() <= 0; }
    ),
    allPlayers.end()
);
登录后复制

在这种方法中,std::remove_if 根据提供的过滤向量拉姆达表达式。然后使用 std::vector::erase 删除过滤后的元素。

以上是如何在 C 循环中安全地从向量中删除元素?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板