C++ - 为什么程序在映射迭代器中使用 if 语句崩溃?
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);
}
}
请注意,只有在迭代器已经递增后才会删除该元素。
你正在吹走迭代器。一旦您从地图中删除一个元素,它就会变得无效。
此外,您可能希望将迭代器增量更改为 ++it。可以提供一点速度提升。
我是 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);
}
}
请注意,只有在迭代器已经递增后才会删除该元素。
你正在吹走迭代器。一旦您从地图中删除一个元素,它就会变得无效。
此外,您可能希望将迭代器增量更改为 ++it。可以提供一点速度提升。