2012-12-21 6 views
8

sehe ich eine Menge:Ist & vec [0] definiertes Verhalten für einen std :: vector vec?

std::vector<Something> vec; 
do_something_with_vec(vec); 
Something *arr=&vec[0]; 
do_something_that_needs_carray(arr); 

Ich meine, so ein Vektor wahrscheinlich intern ein Array verwenden, werde ich sehen, warum das funktioniert, ich frage mich nur, ob dieses Verhalten definiert ist (wie, ist ein implementor erlaubt, eine Implementierung von std :: vector zu starten, mit der dies brechen würde.

Wenn es Konflikte zwischen den Standards gibt, interessiert mich was der C++ 11 Standard sagt.

+1

Nicht * wahrscheinlich * - ein 'Vektor' ** ** wird ** verwendet. –

+1

"* Wenn es Konflikte zwischen den Standards gibt, interessiert mich, was der C++ 11 Standard sagt. *" C++ 98 hat nicht garantiert, dass dies funktionieren würde, aber C++ 03 und C++ 11 tun . – ildjarn

Antwort

17

Ja ist erlaubt, wenn std::vector nicht leer ist. Wenn vector leer ist, ruft Undefined Behavior auf.

std::vector wird benötigt, um Elemente zusammenhängend zu speichern.

Es gibt auch data() Methode, aber es ist nur C++ 11.

Wichtig:

Dies wird nicht auf std::vector<bool> (biteffiziente Spezialisierung) arbeiten. Aber es ist auch kein Container, und IMO sollte es veraltet sein.

6

Ja, es ist in Ordnung, weil die Elemente garantiert zusammenhängend gespeichert werden. Der Standard bestätigt dies:

Die Elemente eines Vektors zusammenhängend gespeichert werden, was bedeutet, dass, wenn v ein vector<T, Allocator> ist, wo T ist eine Art andere als bool, dann gehorcht er die Identität &v[n] == &v[0] + n für alle 0 <= n < v.size().

9

Das ist in Ordnung. Aber wenn vec leer ist, ist es undefiniertes Verhalten. Bessere Verwendung vec.data(), die auch funktioniert, wenn vec leer ist.

Verwandte Themen