[英]C++ - Why is program crashing with if statement inside map iterator?
我是C ++的新手,我正在尝试迭代地图,同时传递一个if语句。 然而程序崩溃了。
请帮我修复程序。
#include <bits/stdc++.h>
#include <iostream>
#include <set>
#include <string>
#include <iterator>
using namespace std;
int main()
{
std::map<int,int> h;
std::map<int,int>::iterator it;
h[1] = 2;
h[4] = 5;
for(it = h.begin(); it !=h.end(); it++){
if (it->second > 4){
h.erase(it->first);
}
}
你正在擦除for循环中的元素,并且指向被移除元素(即it
)的迭代器将被无效。 然后it++
会导致问题。
你可以
for (it = h.begin(); it != h.end(); ) {
if (it->second > 4){
it = h.erase(it); // set it to iterator following the last removed element
} else {
++it;
}
}
迭代器会删除迭代器指向的元素。
当删除std::map
的元素时,它的所有迭代器都会立即失效。
删除元素后,迭代器不再有效。 之后,for循环尝试增加不再有效的迭代器。 这就是你的代码崩溃的原因。
典型的解决方案是这样的:
for(it = h.begin(); it !=h.end(); ){
{
std::map<int,int>::iterator p=it;
++it;
if (p->second > 4){
h.erase(p->first);
}
}
请注意,只有在迭代器已经递增后才会删除该元素。
你正在吹掉迭代器。 一旦从地图中删除元素,它就会变为无效。
此外,您可能希望将迭代器增量更改为++。 可以提供一点速度提升。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.