PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bleibt ein iterator auf ein Element in einem std::vector gültig nach resize?



axeljaeger
31-07-2004, 13:05
Hallo, ich hab eine Frage zur STL: Ich habe einen Vector mit Objekten.


vector<MyClass> vec;

Wichtig dabei ist, das keine Pointer, sondern die Objekte als value im Vector liegen. Wenn ich mir einen Iterator auf ein beliebiges Objekt im Vector hole, bleibt dieser Iterator dann gültig, wenn ich den Vector vergrößere oder verkleinere(wenn ich nicht grad so verkleinere, dass das Element, auf das ich zeige, rausfliegt)?

wraith
31-07-2004, 13:35
Wenn du deinen std::vector vergrößerst (explizit mittels resize oder implizit durch einfügen von Elementen), dann werden alle Iteratoren ungültig.Klar, der vector kann ja jetzt ganz wo anders im Speicher liegen.
Oder etwas genauer ausgedrückt


If reallocation occurs, the capacity increases by a fixed factor (at least), and all iterators and references become invalid. If no reallocation occurs, iterators become invalid only from the point of insertion through the end of the sequence.


Wenn du deinen vector verkleinerst, mittels erase (resize ruft auch erase auf), dann gilt:


Erasing N elements causes N destructor calls and an assignment for each of the elements between the insertion point and the end of the sequence. No reallocation occurs, so iterators and references become invalid only from the first element erased through the end of the sequence.

Entscheidend ist hierbei, daß bei einer Verkleinerung _keine_ Reallokation stattfindet.

axeljaeger
31-07-2004, 13:38
Habe ich eine andere Möglichkeit, eine sichere und stabile Referenz auf ein Objekt zu halten oder bleibt mir nur die Möglichkeit, im Vector selber Pointer zu halten?

wraith
31-07-2004, 13:40
Habe ich eine andere Möglichkeit, eine sichere und stabile Referenz auf ein Objekt zu halten ?
Wie wäre es mit einem Index, wenn du nicht gerade vor dem Element andere Elemente einfügst, bleibt dein Index immer gültig.

axeljaeger
31-07-2004, 14:13
wenn du nicht gerade vor dem Element andere Elemente einfügst, bleibt dein Index immer gültig.
Das habe ich aber vor zu tun. Bei einer list werde ich diesen Ärger nicht haben, oder? Zur Not kann ich auf den RandomAccessIterator verzichten.