首页 > 后端开发 > C++ > 如何在 C 中迭代时安全地删除映射元素?

如何在 C 中迭代时安全地删除映射元素?

DDD
发布: 2024-12-22 21:22:11
原创
904 人浏览过

How to Safely Erase Map Elements While Iterating in C  ?

迭代期间擦除映射元素时的潜在陷阱

在 C 中操作映射时,考虑迭代时擦除元素的后果至关重要他们。本问题探讨了 C 03 和 C 11 的潜在问题并提供了解决方案。

C 03 注意事项

在 C 03 中,从映射中删除元素并不自动使映射中的所有迭代器失效。但是,它确实使指向已删除元素的迭代器无效。要安全地迭代映射并在迭代期间擦除元素,您需要在调用擦除之前递增迭代器。以下是问题中提供的代码的更新版本:

map<string, SerialdMsg::SerialFunction_t><string, SerialdMsg::SerialFunction_t>::iterator pm_it = port_map.begin();
while (pm_it != port_map.end()) {
    if (pm_it->second == delete_this_id) {
        port_map.erase(pm_it++);  // Use post-increment to get the updated iterator.
    } else {
        ++pm_it;  // Can use pre-increment for efficiency.
    }
}
登录后复制

C 11 增强

在 C 11 中,erase() 方法得到了显着改进。现在,它返回一个指向映射中下一个元素的迭代器,从而可以在迭代期间安全地删除元素,而不会导致其他迭代器无效。使用 C 11 的更新代码为:

auto pm_it = port_map.begin();
while (pm_it != port_map.end()) {
    if (pm_it->second == delete_this_id) {
        pm_it = port_map.erase(pm_it);
    } else {
        ++pm_it;
    }
}
登录后复制

Mark Ransom 技术

Mark Ransom 技术是 C 03 中用于在迭代期间安全擦除地图元素的另一个选项。它涉及创建一个临时向量来存储要擦除的元素的键,然后在第二个循环中擦除它们。

总之,在 C 迭代期间从映射中擦除元素时,请考虑潜在的迭代器失效并根据您使用的 C 版本使用适当的方法。请记住在删除元素之前始终递增迭代器,以保持一致性并避免意外行为。

以上是如何在 C 中迭代时安全地删除映射元素?的详细内容。更多信息请关注PHP中文网其他相关文章!

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