Verändert die klasse vector die speicheradressen ihres inhalts?
-
nunja, sry erstmal für die ganzen threads da unten...aber scheinbar kommt das forum mit größeren codeschnipseln nich zurecht...
nun zur eigentlichen frage:
wenn ich einen pointer auf ein element eines vectors zeigen lasse, kann ich dann davon ausgehen dass der pointer gültig bleibt? ich habe nähmlich das gefühl, dass der inhalt von vectoren wie wild herumgeschoben wird. kann mir das jemand bestätigen?hier nochmal ein beispiel zur anschauung:
myObj tmp;
tmp.bla = 2;
myVektor.push_back(tmp);
myObj *test = myVector.at(myVector.size()-1);und später versuche ich int p = *test->bla
und kriege keine 2
(sondern nen error)boa f**k ich seh grad:
Vector reallocation occurs when a member function must increase the sequence contained in the vector object beyond its current storage capacity. Other insertions and erasures may alter various storage addresses within the sequence. In all such cases, iterators or references that point at altered portions of the sequence become invalid. If no reallocation happens, only iterators and references before the insertion/deletion point remain valid.
shit...hat jmd ne idee wie ich das umgehen könnte ?
-
Wenn du darauf angewiesen bist dass der Pointer / Iterator gültig bleibt kannst du std::vector nur verwenden wenn du am Anfang bereits weist wie viele Elemente du speichern willst. Dann kanst du den Vector anweise eben so viele zu reservieren.
Der bessere Weg dürfte allerdings sein eine std::list zu verwenden. Allerdings hast du dann keinen Random Access.
Die dritte möglichkeit wäre keine Pointer zu verwenden sondern die indices als Handle zu verwenden und dann über diese auf die Daten zuzugreifen.
-
Was soll denn das hier überhaupt
myObj tmp; tmp.bla = 2; myVektor.push_back(tmp); myObj *test = myVector.at(myVector.size()-1);Du packst ein Objekt vom Typ myObj in deinen vector und willst einen Pointer darauf herausholen. Da pass etwas nicht. Fehlt hier ein Dereferenzierungsoperator?
Warum willst du überhaupt auf Pointer auf die vector-elemente zugreifen. Für sowas nimmt man normalerweise Iteratoren.
Auf das letzte Element eines vectors kann man übrigens besser so zugreifenmyVector.back();