std::list Objekt aus der Mitte löschen



  • Hallo,

    ich habe eine Liste mit Objekten von Flugzeugdaten, jetzt möchte ich ein beliebiges Objekt löschen, also irgendwo von der Mitte, nicht am Anfang, oder Ende.
    Dachte das müsste mit erase gehen, aber igendwie bekomme ich es nicht hin 🙄

    Folgender Code

    void einFlugzeugLoeschen(FlugzeugListe& alleFlugzeuge)
    {
    
    	if(!alleFlugzeuge.empty())
    	{
    		bool found = false;
    	string flugnummer;
    	string tempflugnummer;
    	cout << "Bitte Flugnummer des Flugzeuges eingeben, dass landen soll:";
    	cin>> flugnummer;
    	FlugzeugListe::iterator iter = alleFlugzeuge.begin();
    
    	for(iter; iter != alleFlugzeuge.end(); ++iter)
    	{
    		if(flugnummer == iter->getFlightNumber())
    		{
    			alleFlugzeuge.erase(Flugzeuge(iter->getFlightNumber(),iter->getStartAirport(),
    				iter->getLandingHour(),iter->getLandingMinutes())); // geht leider nicht.. 
    
    			found = true;
    		}//end if
    	}//end for
    	if(found == false)
    	{
    		cout << "\n#### Flugnummer wurde nicht gefunden #####" << endl;
    	}// end if
    	}// end if
    	else
    		cout << "\n#### Flugliste ist Leer #### "<< endl;
    }
    

    Wäre fur jeden sinnvollen Vorschlag dankbar.
    Gruss
    Joe



  • du musst erase() einen iterator übergeben. Dieser ist nebenbeibemerkt danach ungültig

    while(iter != alleFlugzeuge.end())
        {
            if(flugnummer == iter->getFlightNumber())
            {
                alleFlugzeuge.erase(iter++); //Postinkrement, da iter sonst ungültig wird
    
                found = true;
            }
            else
            {
                iter++;//Wenn der aktuelle Datensatz nicht der gesuchte ist müssen wir den iterator trotzdem weiterbewegen
            }
        }
    


  • WOW, genial!

    vielen Dank!

    Gruss
    Joe



  • und jetzt das ganze nochmal mit boost::lambda

    Flugzeugliste::iterator end = remove_if(
      alleFlugzeuge.begin(),
      alleFlugzeuge.end(),
      bind(Flugzeug::getFlightNumber, _1) == flugnummer));
    alleFlugzeuge.erase( end, alleFlugzeuge.end());
    

    *denkfehler gefixt #2*



  • @Topic:
    Sicherer dürfte sein, den Iterator den erase zurückgibt zu verwenden:

    iter=alleFlugzeuge.erase(iter);
    

    @r0nny:
    Da fehlt aber noch das alleFlugzeuge.erase( ergebnis_von_remove_if, alleFlugzeuge.end() ) 😉



  • @LordJaxom
    http://cppreference.com/cppalgorithm/remove_if.html ist da leicht verwirrend

    ich bin davon ausgegangen, das die elemente tatsächlich entfernt werden



  • LordJaxom schrieb:

    @Topic:
    Sicherer dürfte sein, den Iterator den erase zurückgibt zu verwenden:

    iter=alleFlugzeuge.erase(iter);
    

    Aber nicht in einer Schleife, wo irgendwo ++iter steht, da man so ein Element verliert ...



  • KasF schrieb:

    Aber nicht in einer Schleife, wo irgendwo ++iter steht, da man so ein Element verliert ...

    Der Auszug war auch für die direkte Verwendung im if-Zweig der Bedingung im Codebeispiel von r0nny gedacht 😉



  • LordJaxom schrieb:

    KasF schrieb:

    Aber nicht in einer Schleife, wo irgendwo ++iter steht, da man so ein Element verliert ...

    Der Auszug war auch für die direkte Verwendung im if-Zweig der Bedingung im Codebeispiel von r0nny gedacht 😉

    Achso sry, meinst aber bestimmt von darthdespotism 😉



  • Äh, ja. Ronny hat mich grad auch drauf hingewiesen.

    (Warum gibt's hier keinen Hinter-Mauer-Versteck-Smiley?)



  • Ähh ronny, das stimmt immer noch nicht so 🙂


Anmelden zum Antworten