Ist & vec [0] Verhalten für ein std :: vector vec definiert?

8

Ich sehe das oft:

%Vor%

Ich meine, ein Vektor wird wahrscheinlich intern ein Array verwenden, also sehe ich, warum das funktioniert. Ich frage mich nur, ob dies ein definiertes Verhalten ist (wie zB ein Implementor, der eine Implementierung von std :: vector mit ausführen darf) was würde brechen).

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

    
Cubic 21.12.2012, 19:52
quelle

3 Antworten

17

Ja, es ist erlaubt, wenn std::vector nicht leer ist. Wenn vector leer ist, ruft vec[0] Undefined Behavior hervor.

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

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

Wichtig:

Dies funktioniert nicht bei std::vector<bool> (bit-effiziente Spezialisierung). Aber es ist auch kein Container und IMO sollte es veraltet sein.

    
milleniumbug 21.12.2012, 19:54
quelle
9

Das ist in Ordnung. Aber wenn vec leer ist, ist es undefiniertes Verhalten. Verwenden Sie besser vec.data() , was auch funktioniert, wenn vec leer ist.

    
Johannes Schaub - litb 21.12.2012 19:54
quelle
6

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

  

Die Elemente eines Vektors werden zusammenhängend gespeichert, dh wenn v ein vector<T, Allocator> ist, wobei T ein anderer Typ als bool ist, dann wird die Identität &v[n] == &v[0] + n für alle 0 <= n < v.size() übernommen.

    
Joseph Mansfield 21.12.2012 19:54
quelle

Tags und Links