C++ "cannot seek vector iterator after end" Error, woher?

Peter_2498

Lieutenant
Registriert
Apr. 2018
Beiträge
555
Ich habe hier einen Error, wo ich nicht verstehe woher der kommt. Den ganzen Code kann ich hier nicht posten aber ich vermute, den Error auf eine ganz bestimmte Zeile zurückgeführt zu haben und wollte mal nachfragen, ob vielleicht jemand auch nur einen Hinweis hat, woher der Error kommt.

C++:
qDebug() << Pun.size() << ", " << 2*pos - counter;
Pun.erase(Pun.begin() + 2*pos - counter); //der error scheint hier zu passieren
qDebug() << "B";
Pun.erase(Pun.begin() + 2*pos - counter);
counter += 2;

Wenn ich den Algorithmus laufen lasse, dann kriege ich als Ausgabe bevor der Error passiert noch "4, 1" aber kein "B". Wenn ich das richtig deute, dann kann doch in dieser Zeile kein Error passieren. qDebug() ist eine Funktion aus Qt, die wird wohl nicht Ursache des Problems sein, da das gleiche auch mit std::cout passiert.
Ergänzung ()

Hab die Frage auch zeitlich auf Stack Overflow gestellt und dort meinte jemand ich solle 2*pos - counter in eine Klammer schreiben und tada der Fehler ist weg. Kann mir das jemand erklären? Niemals wäre ich drauf gekommen, dass das das Problem war.
 
Zuletzt bearbeitet:
Ja, aber wahrscheinlich kommst du selber drauf wenn du auf die Operatoren Reihenfolge nachvollziehst und schaust ob auf einem Iterator der Operator "- " definiert ist.
 
  • Gefällt mir
Reaktionen: Peter_2498, DaysShadow und tollertyp
stimmt, eventuell handelt es sich bei dem Iterator um einen ForwardIterator, dann könnte den Compilter das "-" durcheinanderbringen. Eine andere Idee ist (nicht ausprobiert), dass der -/+ operator des Iterators nur einen Wert erwartet (Wert n, um den der Operator verschoben wird). Durch die Klammer werden alle Operationen (2*pos - counter) zu eben dem einen Wert, der benötigt wird, zusammengefasst. Eventuell kann der Compiler nicht mit mehreren Werten auf der rechten Seite umgehen
 
  • Gefällt mir
Reaktionen: tollertyp
Ein schönes Beispiel dafür, dass Operator-Überladen nicht immer elegant ist.
 
Ich habe den Algorithmus locker mit 10000 Instanzen geprüft und nur bei einzelnen Instanzen ist diese nicht vorhandene Klammer ein Problem. Das passiert nicht immer, aber wenn ich 1000 Instanzen durchteste dann kommt mal immer wieder so ein Fall, deswegen habe ich gar nicht erst an sowas gedacht.

Hab jetzt nochmal geschaut und ja, der Iterator wird ja von links nach rechts um den jeweiligen Wert erhöht und wenn der erste Wert den begin-Iterator schon "hinter" den end-Iterator bringt, dann wirft er einen Error, egal ob man danach zurückgegangen wäre. Das habe ich nicht gewusst, mal wieder was gelernt.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: fgordon
Ich meine grundsätzlich, wenn du den Wert "2*pos - counter" mehrmals brauchst, wäre es im Sinne der Redundanz eh sinnvoll, ihn einmal zu berechnen und einer Variable zuzuweisen. Nicht, weil die Berechnung teuer wäre, ist sie ja nicht. Aber einfach deshalb, falls sich der Algorithmus mal leicht ändert, z.B. es 3*pos - counter würde. Dann müsstest du mehrere Stellen ändern -> doof.

Solche Code-Redundanzen sind unschön (und hätten in dem Fall das Problem auch nie aufkommen lassen).
 
  • Gefällt mir
Reaktionen: Xonical und Peter_2498
@tollertyp
Ja, da hast du absolut Recht. Da siegt manchmal die Faulheit, die ich dann teuer bezahle.
 
  • Gefällt mir
Reaktionen: tollertyp
Code darf ruhig erst mal "hässlich" geschrieben werden, er muss nicht auf Anhieb gut sein. Oft weiß man ja nicht, was man wo noch brauchen wird. Solche Verbesserungen kann man auch problemlos nach und nach immer machen.
 

Ähnliche Themen

Zurück
Oben