在迭代期间从映射中删除元素
迭代映射时,常见的方法是使用基于范围的 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中文网其他相关文章!