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.
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:
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 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
- std:llist< element *> *list = new std::list<element *>();
- std::list< element *>::iterator it;
- for(it = list->begin(); it != list->end(); it++) {
- std::list< element *> *copy = Kopie der Liste;
- std::list< element *>::iterator it = Setzte Iterator auf die momentane Position wie die äußere For-schleife steht.
- while(!copy->isEmpty()) {
- element *ptr = (*it);
- entferne aktuelles Listen Element;
- zähler++;
- function2(ptr, copy);
- it = Setze It auf nächste ____valide____ Position
- }
- }
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:
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