vector::erase problem
-
hola leute
hab folgendes codefragment:
/* Grouptable: typedef std::vector<BaseDataEx> GroupTable; */ abelog::GroupTable::iterator temp = group_table.begin() + Grid->Row - 1; ShowMessage(temp->text.c_str()); // (1) group_table.erase(temp); // (2) UpdateGrid();ich hab hier eine tabelle, wo ich einzelne eintrage rausloeschen koennen will.
die zeile (1) hab ich nur mal reingeschrieben um zu sehen ob der iterator auf
das richtige element zeigt. das passt auch so. wenn ich dann jedoch in zeile (2)
das element aus dem vector rausloesche und meine tabelle wieder aktualisiere wurde
das letzte element geloescht. da kannich angeben was ich will. es wird immer das letzte element geloescht. wie kann das kommen.
passsiert auch wenn ich erase den begin-iterator uebergebe.jemand ne idee ?
Meep Meep
-
Dein Problem liegt wo anders. erase bei einem vector funktioniert so wie du es gezeigt hast.
Kurt
-
re
ist halt die frage wo das problem dann liegen soll. UpdateGrid macht ja nix anderes als den vector durch zu iterieren und den inhalt in einem grid anzuzeigen.
Meep Meep
-
in jeder code zeile ne debugmessage ausgeben (mit den werten des vectors)...
villecith hilft das weiter und du findest den fehler.Mfg Shade37337
-
hola shade37337
hab deine idee mal in die tat umgesetzt und mir den vector nach jedem schritt
in eine datei schreiben lassen.
er löscht wirklich immer das letzte element. egal was ich ihm angebe.
bei ner anderen table hab ich das problem jedoch nicht.Meep Meep
-
Das klingt nach einem Problem mit copy-ctor / Zuweisungs Operator in der Klasse BaseDataEx oder einfach einem falschem Index ( z.b Grid->Row == 0 ).
Kurt
-
re
index is inordnung, ansonsten wuerde er mir auch auch nicht das richtige zu loeschende element ausgeben. ich guck mir aber nochmals die BaseDataEx an. vielleicht liegt ja wirklich da der hund begraben
Meep Meep
-
re
deine vermutung lag richtig, das das problem in der BaseDataEx lag.
jetz mal ne frage: wo liegt der unterschied zwischen folgenden zwei zeilen ?
*((BaseData*)this) = *((BaseData*)&bdx); (BaseData)*this = bdx;sollte beides nicht dsa gleiche machen ??
Meep Meep
-
Keine Ahnung wo und ob da ein Unterschied ist.
Der cast auf der linken Seite ist aber entweder nicht notwendig oder falsch. Sieht irgendwie so aus als ob du den typ von this ändern wolltest und das ist IMHO nicht erlaubt.
Kurt
-
was wäre mit:
temp = group_table.erase(temp);