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。可以提供一点速度提升。