Ist es sicher, dass STL-Vektor-Speicher ist immer zusammenhängend zu übernehmen?
Frage
Wenn Sie einen STL-Vektor haben, die Größe geändert wurde, ist es sicher, die Adresse des Elements 0 und übernimmt den Rest des Vektors zu nehmen, wird im Speicher folgen?
z.
vector<char> vc(100);
// do some stuff with vc
vc.resize(200);
char* p = &vc[0];
// do stuff with *p
Lösung
Ja, das ist eine gültige Annahme (*).
Von dem C ++ 03-Standard (23.2.4.1):
Die Elemente eines Vektors gespeichert werden zusammenhängend bedeutet, dass, wenn v a Vektor, wobei T einig Geben Sie andere als Bool, dann gehorcht die Identität & v [n] == & v [0] + n für alle 0 <= n
(*) ... aber achten Sie auf das Array (entkräften alle Zeiger und Iteratoren) neu zugewiesen werden, nachdem Elemente ihm hinzufügen.
Andere Tipps
Die C ++ 03-Standard hinzugefügt Formulierung deutlich zu machen, dass Vektorelemente müssen zusammenhängend sein.
C ++ 03 23.2.4 Absatz 1 enthält folgende Sprache, die ist nicht in dem C ++ 98-Standard-Dokument:
Die Elemente eines
vector
gespeichert zusammenhängend bedeutet, dass, wennv
avector<T, Allocator>
woT
ist einiger anderer Typ alsbool
, dann gehorcht der Identität&v[n] == &v[0] + n
für alle0 <= n < v.size()
.
Herb Sutter spricht über diese Änderung in einem seiner Blogeinträge, Cringe nicht: Vektoren sind garantiert zusammenhängenden sein:
... Kontiguität ist in der Tat ein Teil der Vektor-Abstraktion. Es ist so wichtig, in der Tat, dass, wenn es entdeckt wurde, dass der C ++ 98-Standard hat nicht vollständig garantieren Kontiguität, die C ++ 03-Standard wurde geändert, um ausdrücklich die Garantie hinzuzufügen.
Speicher ist immer zusammenhängende, aber es kann als der Vektor der Kapazität bewegen geändert wird.
Wenn Sie einen Zeiger, Bezug genommen, oder Iterator auf das Element Null (oder ein beliebiges Element) vor einer Kapazität Wechselvorgang wird für ungültig erklärt und müssen neu zugewiesen werden.
std::vector
garantiert, dass die Elemente in einer angrenzenden Array gespeichert sind, und sind daher der bevorzugte Ersatz von Arrays und können auch verwendet werden mit plattformabhängigen Low-Level-Code-Schnittstelle (wie Win32-API-Aufrufe). Um einen Zeiger auf die Array Verwendung zu erhalten:
&myVector.front();
ja.
es sollte alway angrenzen