2011-09-11 10 views
25

chcę zapisywać dane z std::vector<char> do gniazda, używając funkcji write, który ma ten prototyp:Jak mogę uzyskać wskaźnik do pierwszego elementu w std :: vector?

ssize_t write(int, const void *, size_t); 

Drugi argument tej funkcji musi być wskaźnikiem do pierwszego elementu w std::vector<char>. Jak mogę uzyskać wskaźnik do tego elementu?

Próbowałem std::vector::front, ale to zwraca odwołanie, a ja potrzebuję wskaźnik.

Odpowiedz

27
&mv_vec[0] 

lub

&my_vec.front() 

+4

.data() (C++ 11) powinny być preferowane. mv_vec [0] nie działa, jeśli tablica jest pusta. – TarmoPikaro

+0

@ TarmoPikaro Nadal musisz sprawdzić rozmiar. Nie można usunąć dereferencji z wyniku 'std :: vector :: data', jeśli' std :: vector :: size' wynosi zero. 'std :: vector :: data' jest preferowany, ponieważ jeśli wektor jest pusty, nie powoduje niezdefiniowanego zachowania, takiego jak' & v [0] '. –

+0

Wolałbym nie sprawdzać niczego. Więc powinieneś otrzymać jakiś manekinowy wskaźnik, ale jeśli size() ma wartość 0, nic nie zostanie zrobione z tym sztucznym wskaźnikiem. Czy front() działa w ten sposób? Przynajmniej dla wersji wydań? – TarmoPikaro

0

Poprzez adres pierwszego elementu z &vec[0] jako standardu (od C++ 03, chyba) wymaga ciągłe przechowywanie std::vector elementami .

+0

Powoduje to niezdefiniowane zachowanie, jeśli wektor jest pusty. –

1
&*my_vec.begin() 

lub

&mv_vec[0] 
+4

'my_vec.front()' jest mniej kłopotliwą wersją '* my_vec.begin()'. –

47

C++ 11 ma vec.data() który ma tę zaletę, że rozmowa jest ważna nawet jeśli wektor jest pusty.

+0

+1 za przypomnienie, żebym sprawdził, czy wektor jest pusty. Piszę oprogramowanie w C++ 03, niestety. –

+2

To jest właściwa odpowiedź. Jeśli napiszesz funkcjęFunc (my_vec.size(), i my_vec [0]), masz niezdefiniowane zachowanie. Podobnie dla prawie każdej odpowiedzi tutaj. Nie można dereferencji .begin() na pustym wektorze, a .front() nie jest zdefiniowany w pustym wektorze. Działa tylko someFunc (my_vec.size(), my_vec.data()). –

5
my_vec.empty() ? 0 : &my_vec.front() 

Jeśli chcesz się std::out_of_range zostać wyrzucony jeśli wektor jest pusty, można użyć

&my_vec.at(0) 
Powiązane problemy