stl::list probleme beim löschen

  • ich würd gern alle elemente einer stl:list durchlaufen, und die objekte, deren lebenszeit abgelaufen ist rauslöschen.

    Code
    for (HudElements::iterator it = ml_Elements.begin(); it != ml_Elements.end(); it++)
    	{
              if  (*it)->dead)
                { ml_Elements.erase(it);
    }

    - funktioniert aber nicht.

  • So ein Konstrukt -
    linear(!!) Durchiterieren und dabei Löschen,
    ist IMMER problematisch, verursacht oft bösartigste Bugs.
    Der Iterator wird durchs Löschen (möglicherweise) invalidiert (oder "hüpft" umher), kann/wird Probleme mit der Schleife geben.

    Es bietet sich z.B
    list::remove (const T& value) an.

    Löscht alle Elemente der Liste mit Wert=value.
    Es wird der == Operator vom Typ der Listenelemente genommen.

    Oder mit erase sollte es eigentlich so gehen:
    (ohne Gewähr, nicht ausprobiert)

    Code
    itr=list.begin();
    while(itr != list.end())
    {
    if (löschen) itr = liste.erase(itr);
    else ++itr;
    }



    Aber trotzdem sollte man sowas eher vermeiden, das Iterator-Invalidierungsverhalten beim Löschen ist von Container zu Container recht verschieden und das kann ziemlich subtile Probleme geben.

    Mfg, LB


    Trading for a living [equities,futures,forex]

  • das das nicht das beste ist hab ich auch schon gecheckt, aber wie kann ich das umgehen?

    ich hab da eine liste von elementen die am bildschirm angezeigt werden soll, nach einer bestimmten zeit(die nat. in den elementen gespeichert ist) sollen die elemente aber wieder aus der liste gelöscht werden( nicht mehr gezeichnet). wie soll ich das sonst realisieren ausser mit einerliste wo ich die elemente drinnen hab, die dann linear(!!) durchgeh und dann ein element lösche, wenn seine zeit gekommnen ist?
    ich könnte eine liste mit den elementen erstellen, die ich löschen will, und die dann von der bestehenden liste abziehen, aber da ist dann wieder eine 2te liste im spiel.

    lg, bimbo

  • Verwende std::remove_if. Das "verschiebt" die zum Tode verdammten Elemente ans Ende der Liste und liefert dir einen Iterator aufs Ende der Liste aus gewünschten Elementen.

    Danach kannst du mit erase() die unerwünschten Elemente am Ende der Liste löschen.

    Eins Zwei Gras Bär Hund Vier Muh Macht Die Kuh

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!