首页 > 后端开发 > C++ > 在迭代期间对 C 映射元素调用'erase()”是否安全?

在迭代期间对 C 映射元素调用'erase()”是否安全?

Susan Sarandon
发布: 2024-12-11 15:21:14
原创
284 人浏览过

Is it Safe to Call `erase()` on a C   Map Element During Iteration?

从开始到结束的迭代过程中对映射元素调用擦除()的后果

在 C 中迭代映射时,必须考虑以下含义:在循环内对地图元素调用擦除()方法。具体来说,出现了这样的问题:擦除元素并继续迭代是否安全,或者是否有必要将密钥收集到另一个容器中并执行单独的循环进行擦除?

在 C 03 中,从 a 中擦除元素map 不会使任何迭代器 失效,除了 那些指向已删除元素的迭代器。但是,请务必注意,您的代码在调用擦除后正在修改迭代器。这是有问题的,因为一旦调用擦除,pm_it 就会变得无效。为了解决这个问题,您应该在调用擦除之前增加迭代器。

map<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 iterator and post-increment
    } else {
        ++pm_it;  // Can use pre-increment here for efficiency
    }
}
登录后复制

在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;
    }
}
登录后复制

以上是在迭代期间对 C 映射元素调用'erase()”是否安全?的详细内容。更多信息请关注PHP中文网其他相关文章!

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