Element aus Liste löschen (List iterator not incrementable)
-
BorisDieKlinge schrieb:
probiers mal ohne das typedef!!
Was soll das denn bringen?!

Ein typedef ist ein reiner Alias, das ist dir hoffentlich klar, oder?
Abgesehen davon macht dein Code Quatsch, den der des Threadstellers nicht gemacht hat. Die Zuweisung des Rückgabewertes von erase war denke ich durchaus beabsichtigt.@OP
Wie sieht denn der Fehler genau aus? Dein Code sieht eigentlich nicht falsch aus (bis auf das möglicherweise sehr unelegante Zeigerhantiere). Außerdem solltest du vielleicht std::set und kürzere Variablennamen in Betracht ziehen.
-
@flimor: Ich weis aber hatte damit auch mal probleme
-
was meinst du mit std::set ??
Kürzere Dateinamen sind nicht drin, hab ich von neer Aufgabenstellung so vorgegeben. Hab auch ehrlich gesagt im moment nicht die Ahnung warum ich mir von erase einen Wert zurückgeben lasse(Was gibt er zurück ??) Hatte das halt so ausprobiert, weil ich das hier aus anderen Beispielen so hatte.
Das ganze soll halt nur, falls vorhanden fz aus der Liste löschen
Der Compiler stürzt halt mit dem beschriebenen Fehler ab, was willste mehr hören?
Party-Pansen
-
ob es daran liegt, dass in der schleife nur beim else-teil der iterator erhoeht wird? vielleicht meckert der compiler deshalb
-
abgesehen davon, dass der vergleich auf identität mit elementen einer liste von pointern zu undefinierten resultaten führen kann (besonders, wenn aus der liste elmente gelöscht werden), sieht der restliche code eigentlich ok aus.
-
Naja so wie das aussieht, ist ja sichergestellt, dass es das Fahrzeug nur einmal auf dem "Weg" gibt. Dann reicht einfach:
std::list<Fahrzeug*>::iterator it = std::find(p_ptFahrzeuge.begin(), p_ptFahrzeuge.end(), fz); if (it != p_ptFahrzeuge.end()) p_ptFahrzeuge.erase(it);Ansonsten guck dir mal http://www.cplusplus.com/reference/stl/list/erase.html an.
[...] Was gibt er zurück? [...]
Einen Iterator auf das Element, dass nach dem gelöschten liegt/lag. Deswegen ist auch die Erhöhung des Iterators da falsch(s.BorisDieKlinge: So sieht es aus wenn man denkt es drauf zu haben aber nur mist fabriziert :P), da der vorherige Iterator, der erhöht werden soll, nicht mehr gültig ist.
Was meinst du mit std::set? [...]
Das: http://www.cplusplus.com/reference/stl/set/
Der Compiler stürzt halt mit dem beschriebenen Fehler ab, was willst du noch wissen?
Na das bezweifel ich jetzt mal stark
Der Compiler gibt höchstens eine Fehlermeldung aus ... abstürzen tut der aber normal nicht 
Aber es kommt immer der Fehler List iterator not inkrementable, aber ich verstehe nicht wieso.## Hoffe, dass mir hier jemand noch einen Tipp geben kann!
Zitier mal die genaue Fehlermeldung und die Zeile, in welcher der Fehler auftritt!
-
find oder std::find klappt nicht
find: identifier not found
find is not a member of std
woran kann das liegen ??
-
Party-Pansen schrieb:
find oder std::find klappt nicht
find: identifier not found
find is not a member of std
für std::find benötigst du den Header <algorthm>.
-
#include <algorithm> #include <functional>
-
SO, hab das ganze jetzt rausbekommen und zwar hab ichs jetzt einfach mit remove(fz) gemacht.
Jetzt hab ich aber ein anderes Problem:
FahrzeugListe::iterator itFahrzeugListe;//Neuen Iteratur zum Durchlauf definieren for (itFahrzeugListe=p_ptFahrzeuge.begin(); itFahrzeugListe!=p_ptFahrzeuge.end(); itFahrzeugListe++)//Schleifendurchlauf durch Fahrzeuge auf Weg { try { (*itFahrzeugListe)->vAbfertigung(); //Einzelnes Fahrzeug abfertigen } catch(FahrAusnahme &x) { x.vBearbeiten(); } }und zwar kann jetzt durch x.vBearbeiten genau diese Funktion mit dem löschen ausgeführt werden. Ich schreib bewusst kann, da es auch ohne das löschen sein kann. Danach wird auch wieder mit pusback ein Element eingefügt. Jetzt hab ich aber das Problem, das in dem Moment wo vBeabreiten aufgerufen wird er Iterator itFahrzeuListe undefiniert wird und ich auf jeden fall auch die meldung not incrementable bekomme, was ja auch logisch ist. Was hab
-
So, konnte auch das Problem mittlerweile klären. Vielen Dank für eure Hilfe
Party-Pansen