C++ - 为什么在map迭代器中使用if语句会导致程序崩溃?

4
我刚接触C++,想要通过一个if语句来遍历map。但是程序总是崩溃。请帮我修复这个程序。
#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);
        }
}
3个回答

6

您正在 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;
    }
}

1

你的迭代器会移除它指向的元素。

当一个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);
    }
 }

请注意,仅在迭代器已经增加后才会删除该元素。

0

你正在使迭代器失效。一旦从映射中删除元素,它就会变得无效。

此外,你可能想将迭代器的增量更改为++it。这可以提高一点速度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接