【问题标题】:Unordered map erase method storing temporary variableUnordered_map 擦除方法存储临时变量
【发布时间】: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 无效?
  • 这个方法没有问题,确实有人建议,例如stackoverflow.com/questions/263945/…
  • 同样正确的是 map.erase(it1++); 不需要第二个变量。您必须了解迭代器在调用擦除之前递增,这是人们确实感到困惑的事情。

标签: c++ unordered-map


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 2017-05-18
    • 2022-01-23
    相关资源
    最近更新 更多