Iterator für List aktualisieren

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Iterator für List aktualisieren

    Hallo,

    ich hab ein ziemlich nervendes Problem bzgl. Listen und Iteratoren in C++.

    Ich habe eine std::list mit n Elementen und laufe diese durch. In jedem Durchlauf wird diese Liste mit allen Elementen kopiert (Elemente sind eigentlich Pointer auf bestimmte structs) und mit den gearbeitet.

    Quellcode

    1. std:llist< element *> *list = new std::list<element *>();
    2. std::list< element *>::iterator it;
    3. for(it = list->begin(); it != list->end(); it++) {
    4. std::list< element *> *copy = Kopie der Liste;
    5. std::list< element *>::iterator it = Setzte Iterator auf die momentane Position wie die äußere For-schleife steht.
    6. while(!copy->isEmpty()) {
    7. element *ptr = (*it);
    8. entferne aktuelles Listen Element;
    9. zähler++;
    10. function2(ptr, copy);
    11. it = Setze It auf nächste ____valide____ Position
    12. }
    13. }
    Alles anzeigen


    Mein erstes Problem geht schon da los das ich den Iterator auf die momentane Position wie die äußere For-schleife setze. Ein einfaches copy = it funktioniert ja nicht. Ich habe das unschön mit einem Counter gelöst der den Iterator immer um eins hochzählt wie hoch der Counter ist.


    in Function2 wird nun folgendes gemacht:

    Quellcode

    1. std::list< element *>::iterator it;
    2. for(it = list->begin(); it != list->end(); it++) {
    3. vergleiche das aktuelle Listen Element mit dem Parameter der übergeben wurde;
    4. wenn true -> it = list->erase(it); /* setze iterator wieder auf die nächste valide position */
    5. }


    Hier wird nun auch durch die verbleibende Liste gelaufen und Elemente mit dem Parameter verglichen und bei erfolgreichem Vergleich dann das Listenelement gelöscht.

    Jetzt ist halt der Knackpunkt! Durch das viele löschen, verliere ich die valide Position meines Iterators in der oberen Funktion. Das alles läuft eins bis zwei mal und dann kracht es irgendwann mit einem Segmentation Fault.

    Was muss ich machen damit ich in Funktion den Iterator auf die wirkliche nächste Position setze? Das ganze ist ein Brute Force und ich will deswegen alles ausprobieren. Wenn ich es immer wieder auf den Anfang setze kriege ich falsche Ergebnise am Ende raus.

    Ich hoffe ich konnte das ungefähr verständlich rüberbringen. Wäre cool wenn mir da einer helfen kann!



    Gruß,
    Burak
  • Ich hoffe mal das ich das richtig deute ?(

    Hier ein Link zu kopieren von list:
    cplusplus.com/reference/stl/list/operator=/
    und hier ganz unten zur Gültigkeit von Iteratoren:
    de.cppreference.com/w/cpp/iterator

    In Containern hab ich noch Nachholbedarf.
    Vor der Zeit hat man bei ähnlichen Projekten: Daten gelesen - ausgelesene Daten geprüft - gültige oder gewünschte Daten dann kopiert/gespeichert.
    Ob du das bei deinem Projekt auch so umsetzen kannst ?(

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von bcc-fan ()