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

时间:2016-04-21 02:08:51

标签: c++ if-statement crash iterator maps

我是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);
        }
}

3 个答案:

答案 0 :(得分:5)

你在for循环中删除了元素,指向被删除元素的迭代器(即if len(css(".Total", parent=new, nowait=True)) > 0:)将失效。然后it会导致问题。

你可以

it++

答案 1 :(得分: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);
    }
 }

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

答案 2 :(得分:0)

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

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