如何在迭代时从无序地图中删除多个项目?

时间:2013-03-27 15:15:11

标签: c++ iterator unordered-map

请考虑以下情况:

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

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

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

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

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

3 个答案:

答案 0 :(得分:24)

for (auto it = elements.begin(); it != elements.end();) {
   if(you have to rease) {
      it = elements.erase(it);
   }
   else
      it++;
}

这样一来,你可以确保在擦除后没有增加,而且你没有增加结束()。

建议有no good reason来循环后不会增加任何东西,你可能想要我们一个while循环。主要是为了提高可读性。

答案 1 :(得分:18)

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

您需要的代码如下:

it = myMap.erase( it );

重要提示:如果您是在循环中执行此操作,则需要确保避免在it 的典型增量如果这样做,循环结束。

答案 2 :(得分:5)

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

请记住在擦除元素时不要增加迭代器,否则你将跳过一个元素。