首页 > 后端开发 > C++ > 如何在保留迭代器有效性的同时安全地从 C 映射中删除元素?

如何在保留迭代器有效性的同时安全地从 C 映射中删除元素?

Barbara Streisand
发布: 2024-12-10 11:54:10
原创
225 人浏览过

How Can I Safely Remove Elements from a C   Map While Preserving Iterator Validity?

从映射中迭代删除:保留迭代器

在映射迭代中,删除元素可能是一个棘手的操作,因为它可能会使迭代器无效。为了防止这种情况,程序员经常寻求保留迭代器有效性的解决方案。

此问题的标准解决方案是关联容器擦除习惯用法:

for (auto it = m.cbegin(); it != m.cend() /* not hoisted */; /* no increment */)
{
  if (must_delete)
  {
    m.erase(it++);    // or "it = m.erase(it)" since C++11
  }
  else
  {
    ++it;
  }
}
登录后复制

至关重要的是,常规 for 循环必须是这里使用而不是基于范围的 for 循环 (RBFL),因为容器正在被修改。在普通的 for 循环中,迭代器显式递增,从而提供对迭代过程的控制。 RBFL 会自动迭代元素,隐藏迭代机制,并可能导致未定义的行为。

对于 C 11 之前的实现,语法略有不同:

for (std::map<K,V>::iterator it = m.begin(); it != m.end(); ) { /* ... */ }
登录后复制

这里, const迭代器不能被删除。因此,必须使用适应擦除的专用迭代器。

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

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