请考虑以下情况:
using namespace std;
unordered_map<int, vector<A>> elements;
现在我正在迭代这个无序的地图:
for (auto it = elements.begin(); it != elements.end(); ++it)
在循环中,我正在用elements
的几个元素形成集群(it
指向的当前元素和更多元素,不一定是下一行!)。因为每个元素只能是一个集群的一部分,所以我想从地图中删除它们,然后继续下一个元素(即构建下一个集群)。
我怎样才能这样做并仍然在正确的位置继续迭代?
答案 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
函数都这样做)。您可以使用它继续。
请记住在擦除元素时不要增加迭代器,否则你将跳过一个元素。