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

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

Barbara Streisand
Barbara Streisand原创
2024-12-09 13:52:14314浏览

How Can I Safely Remove Elements from a C   Map During Iteration?

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

在 C 中,在删除元素时迭代标准库映射可能具有挑战性,因为使用擦除() 使迭代器无效。然而,有一个被广泛接受的习惯用法来解决这个问题:

for(auto it = m.begin(); it != m.cend() /* not hoisted */; /* no increment */)
{
  if(must_delete)
  {
    auto next = it;
    it = m.erase(it);      // or "it = m.erase(it)" since C++11
  }
  else
  {
    ++it;
  }
}

这个习惯用法是这样的:

  • 禁止提升:我们不提升循环条件之外的增量运算符。这很关键,因为即使删除元素,提升也会导致迭代器前进,从而可能导致未定义的行为。
  • 安全递增: 在循环内,仅应用增量运算符检查该元素是否不应被删除后。
  • 缓存下一个迭代器(C 11 或后来): 当删除一个元素时,我们在删除之前将迭代器缓存到下一个元素。这使我们能够继续无缝迭代,而不会破坏迭代器序列。

Pre-C 11 语法:

在 C 11 之前,擦除常量迭代器需要稍微不同的语法:

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

常量和删除:

从映射中删除元素不会违反元素的常量性,类似于删除指向常量的指针。常量主要限制修改值的能力,而不是其生命周期。

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

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