繁体   English   中英

C ++ - 为什么程序在map迭代器中使用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);
    }
 }

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

你正在吹掉迭代器。 一旦从地图中删除元素,它就会变为无效。

此外,您可能希望将迭代器增量更改为++。 可以提供一点速度提升。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM