Hauptspeicheradresse von Vektorelementen
-
Hallo,
gegeben sei folgender Beispiel-Code:
vector<int> vec; for(int i = 0; i < 10; i++){ vec.push_back(i); } const int POS = 3 vec.erase(vec.begin() + POS); for(int j = 0; j < vec.size(); j++){ cout<<vec.at(j)<<", "; //Ausgabe: 0, 1, 2, 4, 5, 6, 7, 8, 9 } cout<<endl;
Meine Frage ist aber jetzt folgende:
Behält das element bei vec.at(3) (vor dem Löschen vec.at(4)) seine Hauptspeicheradresse nach dem Löschen?
-
Ich würde mich nie darauf verlassen das die Hauptspeicheradressen gleich bleiben, die Vektoren sind dafür gedacht solche details zu abstrahieren. Ich behaupte einfach mal: nicht definiert->implementationsabhängig...
-
fällt dir zufällig eine einfache variante ein, wie ich das realisieren kann? Ich habe über 4 Wochen ein umfangreiches Programm geschrieben, welches ich am Montag an der Uni abgeben muss, dumerweise bestehen dadrin dutzende von Verknüpfungen, welche in Vektoren abgelegt sind. Mein Problem ist nun, dass wenn ich ein Element eines solchen Vektors lösche, dann die Verknüpfungen dann alle irgendwie nachrücken und ich habe absolut keine Ahnung warum und vor allem, wie ich das beheben kann.
HIIILLLLFEEEEEE!!!!!
-
Weil es so ist. Du kannst das nicht verhindern, es sei denn du benutzt eine andere Vektorklasse. Laut definition werden nach dem löschen eines Elementes alle Iteratoren (und damit auch Zeiger) auf ein Element des Vektors ungültig...
-
Das war mir schon klar, danach habe ich auch gar nicht gefragt. Jedenfalls wollte ich das nicht. Ich habe ja alle Verknüpfungen, die auf dieses Element vor zeigen auch vor dem Löschen auch gelöscht. Aber wenn ich nun das Element gelöscht habe, dann haben die Elemente, die als nächstes kommen, ja weiterhin ihre Verknüpfungen zu anderen Elementen, die ja so bleiben sollen. Stattdessen scheinen die anderen Verknüpfungen durcheinander zu laufen.
Beispiel:
Ich habe 3 Adressen in einem Adressvektor und 2 Termine in einem Terminvektor. Ich ordne nun dem 1. Termin die 1. Adresse als "Nachbar" zu und dem 2. Termin die Adressen 2 und 3. Sowohl Adressen als auch Termine besitzen ein Feld mit Zeigern vom Typ der Basisklasse von Adressen und Termine. Zur Verknüpfung wird in beiden Objekten die Adresse des jeweils anderen Objekts geschrieben. Wenn ich nun die erste Adresse lösche, dann sollte der 1. Termin keinen Nachbarn mehr haben. Stattdessen erhält er aber als Nachbarn die 2. Adresse und Termin 2 hat anstatt der Adressen 2 und 3 nur noch die Adresse 3 als Nachbar. Das dürfte nach meinem Verständnis eigentlich nicht sein oder?
Wenn ich mich da zu blöd anstelle bzw. mich schlichtweg irre, dann sag es mir ruhig. Dann weiß ich wenigstens, dass mein Code irgendwo (wahrscheinlich beim Verknüpfen) Fehler haben muss.
-
Ein vector ist nun mal keine verkettete Liste. Wenn du ein Element löschst werden wahrscheinlich die restlichen Elemente in einen neuen Speicherbereich kopiert.
Bei list hingegen bleiben die Iteratoren der restliche Elemente nach einem erase gültig.
-
Super, vielen Dank für den Hinweis. Ich habe meine Vektoren durch Listen ersetzt, ein paar Methoden umschreiben müssen, aber nichts besonderes und dann hat es geklappt. Danke dir!!! Der Tip hat mir echt weitergeholfen und mich vor 3 Tagen puren Frust und Verzweiflung bewahrt.
Basti