vector<>-element-pointer
-
hi@all - ma wieder ein typisches stl-problem, vereinfacht dargestellt:
Ich hab 2 Arrays, dh. vector<>:
A mit irgendwelchen Strukturen
B mit Pointern auf Elemente von Aalso:
vector< any_structures > A; vector< *any_structures > B; A.push_back( any_structure() ); B.push_back( &A[0] );Nachdem ich A mit Kram und B (korrekt - is geprüft) mit Referenzen auf Elemente von A gefüllt habe, gebe ich später den Inhalt von A größtenteils nur noch über die B-Elemente aus. Genau dabei kommts zu Dereferzierungs-Fehlern, weil die pointer anscheinend nicht mehr auf die Elemente zeigen.
Woran kann das liegen?Momentan arbeite ich damit, die Indices der A-Elemente in B zu speichern, aber das hat ziemlich hässliche folgen, da die Arrays zweidimensional und deren namen nicht kurz sind, als Beispiel:
vData[ tData[row][col].v[i].y ][ tData[row][col].v[i].x ].n.c_vec()vorher wars einfach:
tData[row][col].v[i]->n.c_vec()Gibt es eine bessere Möglichkeit?
evtl. iteratoren in B speichern oder so ?Danke schon ma für die Mühe bis hierhin zu lesen ^^
-
toast schrieb:
Genau dabei kommts zu Dereferzierungs-Fehlern, weil die pointer anscheinend nicht mehr auf die Elemente zeigen.
Woran kann das liegen?Ein Iterator (oder allgemein Zeiger) auf ein Element eines sequentiellen Containers verliert seine Gültigkeit, wenn eine verändernde Operation auf den Container ausgeführt wurde. Heißt im Klartext: Sobald der Container verändert wurde, ist nicht mehr garantiert, dass dein Iterator noch auf die richtige Stelle zeigt.
-
Michael E. schrieb:
toast schrieb:
Genau dabei kommts zu Dereferzierungs-Fehlern, weil die pointer anscheinend nicht mehr auf die Elemente zeigen.
Woran kann das liegen?Ein Iterator (oder allgemein Zeiger) auf ein Element eines sequentiellen Containers verliert seine Gültigkeit, wenn eine verändernde Operation auf den Container ausgeführt wurde. Heißt im Klartext: Sobald der Container verändert wurde, ist nicht mehr garantiert, dass dein Iterator noch auf die richtige Stelle zeigt.
hm.., hab mich wahrscheinlich nicht klar ausgedrückt: nachdem einmal Elemente in A hinzugefügt wurden, wird nicht mehr der Container A (dh. die Anzahl dessen elemente), sondern nur noch deren Inhalt geändert. Danach (also nach dem Hinzufügen) wird das array B erzeugt und A nicht mehr verändert.
Die Pointer zeigen aber trotzdem nicht mehr auf die Elemente.kann es also sein, dass vector seine Elemente spontan wo anders speichert und so deren Adresse ändert?
-
Würde ich schon sagen. Da du andere Elemente veränderst, d.h. idR auch in der Größe etc. , müssen diese an eine andere Speicherstelle geschrieben werden.
-
Wenn du in einer Schleife (A.pus_back();B.push_back(&A.last());) die Vektoren füllst, kann es schnell passieren, daß A zwischendurch mehr Speicher anfordert - und dabei werden auch die vorhandenen Elemente umkopiert.
Btw, wozu benötigst du A, wenn du dann doch nur mit den Pointern rechnest?
-
sry, dass ich nich geantwortet hatte, bisl stressig die Tage; Ansonsten weiß ich jetz wie ichs mache, also danke für die Hilfe!!
PS: Wieso ich das so mache? Würde jetz ziemlich weit führen, allerdings is A noch nötig, da mehrere Elemente von B auf die selben A-Elemente verweisen müssen. Das wird leider wegen meiner vereinfachten Darstellung nicht so richtig klar ..