2013-11-01 4 views
12

Ich habe Leute in meinem Team gesehen, die Code so schreiben. Ich persönlich denke, dass dies nicht übertragbar ist, da Vektor auf eine völlig andere Art und Weise implementiert werden könnte. Habe ich recht?ist es tragbar zu behandeln std :: Vektor wie Array

vector<int> a; 
a.push_back(1); 
a.push_back(2); 
a.push_back(3); 

int* b = &a[0]; 
std::cout<< *(b +1); // this will print 2 
+5

In der Tat gibt es ab 2011 für genau diesen Zweck die Memberfunktion ['data'] (http://en.cppreference.com/w/cpp/container/vector/data). – BoBTFish

+0

@BoBTFish Da 'data' ein' const'-Qualifikationsmerkmal hat, müsste 'b' als' const int * b' deklariert werden. – dasblinkenlight

+0

@Mark Sekunde, dass. Nun lasst uns alle die ursprüngliche Frage aufheben. – stijn

Antwort

21

Dieser Code ist korrekt. Die in einer std::vector gespeicherten Elemente werden garantiert ab C++ 03 zusammenhängend gespeichert.

Dies ist der relevante Teil des aktuellen Standard C++ Entwurf N3797 (23.3.6.1):

Ein Vektor ist eine Folge Behälter, die Iteratoren wahlfreiem Zugriff unterstützt. Zusätzlich unterstützt es (amortisiert) konstante Zeit einfügen und löschen Operationen am Ende; einfügen und löschen in der Mitte nehmen lineare Zeit. Die Speicherverwaltung wird automatisch durchgeführt, obwohl die Hinweise zur Verbesserung der Effizienz gegeben werden können. Die Elemente eines Vektors aneinander angrenzend gespeichert, was bedeutet, dass, wenn v ein Vektor ist, wo T einige anderen Typ als Bool ist, dann ist es die Identität &v[n] == &v[0] + n für alle 0 <= n < v.size() gehorcht.

8

In welcher Weise auch immer ein Vektor implementiert wird, einige Dinge werden vom Standard garantiert, um konsistent zu bleiben. Eine std::vector wird immer zusammenhängend im Speicher gespeichert und deshalb kann sie mit Random-Access-Iteratoren arbeiten.