2012-12-21 16 views
8

Vedo questo molto:E & vec [0] comportamento definito per un vd std :: vector?

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

Voglio dire, un vettore sarà probabilmente usare un array interno quindi non vedo il motivo per cui questo funziona, mi chiedo solo se questo è definito un comportamento (come, è un implementor ha permesso di eseguire un'implementazione di std :: vector con la quale questo si sarebbe interrotto).

Se ci sono conflitti tra gli standard, sono interessato a ciò che dice lo standard C++ 11.

+1

Non * probabilmente * - un 'vector' ** userà la memoria contagiosa. –

+1

"* Se ci sono conflitti tra gli standard, sono interessato a ciò che dice lo standard C++ 11. *" C++ 98 non garantiva che questo avrebbe funzionato, ma C++ 03 e C++ 11 fanno . – ildjarn

risposta

17

Sì, è consentito se il std::vector non è vuoto. Se lo vector è vuoto, vec[0] evocherà il comportamento non definito.

std::vector è necessario per memorizzare gli elementi in modo contiguo.

C'è anche il metodo data(), ma è solo C++ 11.

Importante:

Questo non funziona su std::vector<bool> (specializzazione bit-efficiente). Ma non è nemmeno un contenitore, e IMO dovrebbe essere deprecato.

6

Sì, va bene perché gli elementi sono garantiti per essere memorizzati in modo contiguo. Lo standard riconosce questo:

Gli elementi di un vettore sono memorizzati in modo contiguo, nel senso che se v è un vector<T, Allocator> dove T è un certo tipo diverso da bool, poi obbedisce l'identità &v[n] == &v[0] + n per tutti 0 <= n < v.size().

9

Questo va bene. Ma se vec è vuoto, è un comportamento non definito. Meglio usare vec.data() che funzionerà anche se vec è vuoto.