2012-12-21 16 views
8

widzę to dużo:Czy & vec [0] zdefiniowane zachowanie dla std :: vector vec?

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

To znaczy, wektor będzie prawdopodobnie używać tablicy wewnętrznie tak widzę, dlaczego to działa, Zastanawiam się, czy nie jest to określone zachowanie (jak, to implementor może uruchomić implementację std :: vector, z którą to by się zepsuło).

Jeśli między standardami występują sprzeczności, interesuje mnie to, co mówi standard C++ 11.

+1

Nie * prawdopodobnie * - "wektor" ** będzie ** używał zaciekłej pamięci. –

+1

"* Jeśli między standardami są konflikty, interesuje mnie to, co mówi standard C++ 11." "C++ 98 nie gwarantowało, że to zadziała, ale C++ 03 i C++ 11 . – ildjarn

Odpowiedz

17

Tak, jest dozwolone, jeśli std::vector nie jest pusty. Jeśli vector jest pusty, vec[0] wywoła niezdefiniowane zachowanie.

std::vector jest wymagane do przechowywania elementów w sposób ciągły.

Istnieje również metoda data(), ale jest to tylko C++ 11.

Ważne:

To nie będzie działać na std::vector<bool> (specjalność bitowym efektywny). Ale to także nie jest pojemnik, a IMO powinno być przestarzałe.

6

Tak, jest w porządku, ponieważ elementy są gwarantowane są przechowywane w sposób ciągły. Średnia potwierdza to:

z elementów wektora są przechowywane w sposób zwarty, co oznacza, że ​​jeśli v jest vector<T, Allocator> gdzie T jest jakiś rodzaj inna niż bool, to słucha tożsamość &v[n] == &v[0] + n dla wszystkich 0 <= n < v.size().

9

To dobrze. Ale jeśli vec jest pusty, jest to niezdefiniowane zachowanie. Lepsze użycie vec.data(), które zadziała również, jeśli vec jest pusty.

Powiązane problemy