Listenelement löschen



  • ich würde es mit erase löschen, remove sucht die liste nochmal durch...



  • Wenn du mit erase ein Element löschst bekommst do als Rückgabewert das nächste Element, also könnte man das z.B. so machen.

    iter = liste->begin();
    while(iter != liste->end()){         
      if(iter > x){ 
        iter = liste->erase(iter); 
      }else{
        iter++;
      } 
    }
    


  • besser...

    for ( iter = liste.begin(); iter != liste.end(); ++it )
      if ( (*iter) > x )
        liste.erase(iter);
    


  • turing_mob schrieb:

    besser...

    for ( iter = liste.begin(); iter != liste.end(); ++it )
      if ( (*iter) > x )
        liste.erase(iter);
    

    ⚠



  • was soll daran gefährlich sein? abgesehen davon, dass der iterator einmal falsch geschrieben ist?



  • Weil dein Iterator nach dem erase ungültig wird und so auch nicht mehr inkrementiert werden kann.
    So sollte es gehen.

    iter = liste.erase(iter);
    

    Was gefällt euch eigentlich an meiner Lösung oben nicht? 😞



  • Braunstein schrieb:

    Weil dein Iterator nach dem erase ungültig wird und so auch nicht mehr inkrementiert werden kann.
    So sollte es gehen.

    iter = liste.erase(iter);
    

    Schon besser 🙂 Aber da ist immer noch ein Fehler ...

    Braunstein schrieb:

    Was gefällt euch eigentlich an meiner Lösung oben nicht? 😞

    Die ist zu schööön 🙂



  • Stimmt. Man muss den Iterator noch zuweisen. Ich war wohl bei Windowslisten, dort findet das Inkrementieren teilweise automatisch statt.

    Braunstein, deine Lösung ist bestimmt richtig. Aber ich finde sie drückt rein semantisch kaum die Absicht des Algorithmus aus. Jemand, der diesen Code liest, wird zunächst nicht verstehen, was eigentlich gemeint ist, ohne irgendwo nachschlagen zu müssen.



  • Meinst du so ?

    for ( iter = liste.begin(); iter != liste.end(); ++it ) 
      if ( (*iter) > x ) 
        iter = liste.erase(iter);
    

    das waere aber auch nicht richtig da jedesmal wenn ein Element geloescht wird das naechste uebersprungen wird.
    Also du hast z.B. die Elemente 1,2,3,4 und 2 wird geloescht dann wird der iterator aufs naechste Element gesetzt also 3 dann kommt der naechste Schleifen-Durchlauf, iter wird inkrementiert und steht jetzt auf 4. Fuer die 3 wuerde also die Bedingung gar nie geprueft werden.



  • Tanren schrieb:

    Meinst du so ?

    for ( iter = liste.begin(); iter != liste.end(); ++it ) 
      if ( (*iter) > x ) 
        iter = liste.erase(iter);
    

    das waere aber auch nicht richtig da jedesmal wenn ein Element geloescht wird das naechste uebersprungen wird.
    Also du hast z.B. die Elemente 1,2,3,4 und 2 wird geloescht dann wird der iterator aufs naechste Element gesetzt also 3 dann kommt der naechste Schleifen-Durchlauf, iter wird inkrementiert und steht jetzt auf 4. Fuer die 3 wuerde also die Bedingung gar nie geprueft werden.

    😉

    Sollte also demnach besser so aussehen:

    for ( list<int>::iterator iter = a.begin(), next = iter; iter != a.end(); iter = next )
    {
        ++next;
        if ( (*iter) > 3 )
            a.erase(iter);
    
    }
    

    turing_mob schrieb:

    Braunstein, deine Lösung ist bestimmt richtig. Aber ich finde sie drückt rein semantisch kaum die Absicht des Algorithmus aus. Jemand, der diesen Code liest, wird zunächst nicht verstehen, was eigentlich gemeint ist, ohne irgendwo nachschlagen zu müssen.

    Braunstein schrieb:

    liste->remove_if(bind2nd(greater<typ>(),(x)));
    

    liste -- lösche wenn -- größer als x
    Mit ein bisschen Phantasie geht das schon 😉 ( bind2nd mal ignoriert 😃 )


Anmelden zum Antworten