21

请考虑以下情况:

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

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

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

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

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

4

3 回答 3

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

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

在建议没有充分理由使用不会增加任何内容的 for 循环之后,您可能希望我们使用 while 循环。主要是为了提高可读性。

于 2013-03-27T15:21:04.477 回答
18

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

您需要以下代码:

it = myMap.erase( it );

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

于 2013-03-27T15:18:24.630 回答
6

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

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

于 2013-03-27T15:18:05.373 回答