【问题标题】:How to remove multiple items from unordered map while iterating over it?如何在迭代无序地图时从无序地图中删除多个项目?
【发布时间】:2013-03-17 17:51:49
【问题描述】:

请考虑以下情况:

using namespace std;
unordered_map<int, vector<A>> elements;

现在我正在迭代这个无序的地图:

for (auto it = elements.begin(); it != elements.end(); ++it)

在循环内部,我正在用elements 的几个元素组成簇(it 指向的当前元素以及更多元素,不一定是下一个元素!)。因为每个元素只能是一个集群的一部分,所以我想从地图中删除这些元素,然后继续下一个元素(即构建下一个集群)。

我怎样才能做到这一点并且仍然在正确的位置继续迭代?

【问题讨论】:

标签: c++ iterator unordered-map


【解决方案1】:

erase 函数在删除元素之后返回迭代器(所有集合 erase 函数都这样做)。您可以使用它继续。

请记住在擦除元素的情况下不要增加迭代器,否则会越过一个元素。

【讨论】:

  • set::erase() 返回删除的元素数量。
  • 或者我应该说“erase() 的基于值的版本返回删除的元素数量”。说“所有集合erase 函数都可以”有点误导。
【解决方案2】:

unordered_map::erase 将返回已删除元素之后的迭代器。

您可能需要以下代码:

it = myMap.erase( it );

重要提示:如果您在循环中执行此操作,您需要确保避免在结尾处使用it 的典型增量完成后循环。

【讨论】:

    【解决方案3】:
    for (auto it = elements.begin(); it != elements.end();) {
       if(you have to rease) {
          it = elements.erase(it);
       }
       else
          it++;
    }
    

    这样可以确保在擦除后不会增加,并且不会增加 end()。

    建议 no good reason 有 for 循环不会增加任何你可能想要我们的 while 循环。主要是为了提高可读性。

    【讨论】:

    • 风格挑剔:no good reason 有一个不会增加任何内容的 for 循环。作为一个while循环,这可能会更好。
    • @MichaelKristofik for 循环在这里很有用;它用于初始化迭代器并限制其范围。
    猜你喜欢
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多