2016-04-21 7 views
4

Ich bin neu in C++ und ich versuche durch die Karte zu iterieren, während ich eine if-Anweisung übergebe. Das Programm stürzt jedoch ab.C++ - Warum stürzt das Programm mit der if-Anweisung im Map-Iterator ab?

Bitte helfen Sie mir das Programm zu reparieren.

#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); 
     } 
} 

Antwort

5

Sie Löschelement innerhalb der for-Schleife, und der Iterator zeigt auf das entfernte Element (d.h. it) wird für ungültig erklärt werden. Dann wird it++ Problem verursachen.

konnte Sie

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

Ihr Iterator entfernt das Element der Iterator zeigt.

Wenn ein Element in einem std::map entfernt wird, werden alle Iteratoren sofort ungültig gemacht.

Der Iterator ist nicht mehr gültig, nachdem das Element entfernt wurde. Anschließend versucht die for-Schleife, den nicht länger gültigen Iterator zu inkrementieren. Deshalb stürzt dein Code ab.

Die typische Lösung geht in etwa so:

for(it = h.begin(); it !=h.end();){ 
{ 
    std::map<int,int>::iterator p=it; 

    ++it; 

    if (p->second > 4){ 
     h.erase(p->first); 
    } 
} 

Hinweis, dass das Element entfernt wird erst nach der Iterator bereits erhöht.

0

Sie blasen den Iterator weg. Es wird ungültig, sobald Sie ein Element aus der Karte entfernen.

Sie möchten möglicherweise auch Ihr Iterator-Inkrement in ++ it ändern. Kann einen kleinen Geschwindigkeitsschub bieten.