Unordered_map 擦除方法存储临时变量

Posted

技术标签:

【中文标题】Unordered_map 擦除方法存储临时变量【英文标题】:Unordered map erase method storing temporary variable 【发布时间】:2021-01-12 15:25:16 【问题描述】:

对于unordered_maperase(),我看到一些线程建议使用不同的方法(例如从erase() 的返回中获取下一个元素)。但是,我还没有看到有人提出以下建议。所以,我想知道这种方法是否存在问题:

for (auto it1 = map.begin(); it1 != map.end(); )

   auto it2 = it1++; //it2 assigned before it1 incremented
   map.erase(it2);

【问题讨论】:

你为什么不能只做map.erase(it1); @feverdream 这会使it1 无效,并且循环的后续迭代将是未定义的。规范的方式是it1 = map.erase(it1) @feverdream 因为那会使it1 无效? 这个方法没有问题,确实有人建议,例如***.com/questions/263945/… 同样正确的是 map.erase(it1++); 不需要第二个变量。您必须了解迭代器在调用擦除之前递增,这是人们确实感到困惑的事情。 【参考方案1】:

这种方法效果很好。 std::unordered_map::erase 仅使擦除元素的迭代器(即it2)无效,前面的递增迭代器it1 仍然有效。

对已擦除元素的引用和迭代器无效。其他迭代器和引用不会失效。

【讨论】:

以上是关于Unordered_map 擦除方法存储临时变量的主要内容,如果未能解决你的问题,请参考以下文章

擦除源时将数据临时存储在数组中

【UBoot移植】当bootdelay误设置为0时 怎么擦除nandflash里面的程序 重新烧写u-boot没用

C++ 如何清空unordered_map

Java泛型:类型擦除

为啥我不能更改 unordered_map 返回的对象的成员变量?

向 std::unordered_map 插入数据时访问冲突