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

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

Patricia Arquette
Patricia Arquette原创
2024-12-12 15:20:11644浏览

How to Safely Remove Elements from a C   Map During Iteration?

在迭代期间从映射中删除元素

迭代映射时,常见的方法是使用基于范围的 for 循环。但是,在迭代时修改映射可能会导致意外行为,因为迭代器将变得无效。

在迭代时从映射中删除元素的推荐技术称为“关联容器擦除习惯用法”:

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 循环非常重要,因为修改容器将使基于范围的循环的迭代器无效。

在 C 11 之前,在迭代映射时需要使用单独的迭代器类型来删除元素:

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

在这两个版本中在这种情况下,删除元素不会违反元素的常量性,因为 C 中的常量性不会影响对象的生命周期。

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn