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

Nik*_*iko 17 c++ iterator unordered-map

请考虑以下情况:

using namespace std;
unordered_map<int, vector<A>> elements;
Run Code Online (Sandbox Code Playgroud)

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

for (auto it = elements.begin(); it != elements.end(); ++it)
Run Code Online (Sandbox Code Playgroud)

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

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

小智 27

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

这样你就可以确保在擦除后没有增加,而且你不会增加结束().

建议没有充分的理由让循环不增加任何东西你可能想要我们一个while循环而不是.主要是为了更具可读性.

  • @MichaelKristofik for循环在这里很有用; 它用于初始化迭代器并限制其范围. (20认同)
  • 样式挑剔:有[没有充分理由](http://stackoverflow.com/q/1379246/46821)有一个不增加任何东西的for循环.作为while循环,这可能会更好. (2认同)

Dre*_*ann 18

unordered_map::erase 将返回迭代器通过已删除的元素.

您可能需要以下代码:

it = myMap.erase( it );
Run Code Online (Sandbox Code Playgroud)

重要提示:如果您在循环中执行此操作,则需要确保在完成此操作时避免it循环结束时的典型增量.


Som*_*ude 5

erase函数在删除的元素之后返回迭代器(所有collection erase函数都执行此操作)。您可以使用它来继续。

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