2011-09-11 16 views
25

私はこのプロトタイプを持っているwrite機能を使用して、ソケットにstd::vector<char>からのデータを書き込みたい:std :: vectorの最初の要素へのポインタを取得するにはどうすればよいですか?

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

この関数の第2引数はstd::vector<char>の最初の要素へのポインタでなければなりません。この要素へのポインタを取得するにはどうすればよいですか?

私はstd::vector::frontを試しましたが、これは参照が必要ですが、ポインタが必要です。 &vec[0]と、最初の要素のアドレスを取ることによって

答えて

27
&mv_vec[0] 

又は

&my_vec.front() 

+4

.dataの()(C++ 11)を使用することができスローするstd::out_of_rangeをご希望の場合。配列が空の場合、mv_vec [0]は機能しません。 – TarmoPikaro

+0

@TarmoPikaroそれでもサイズを確認する必要があります。 'std :: vector :: size'が0の場合、' std :: vector :: data'の結果を逆参照することはできません。 'std :: vector :: data'は、ベクトルが空の場合、'&v [0] 'のような未定義の動作をしないので、優先されます。 –

+0

何もチェックしないことをお勧めします。したがって、ダミーのポインタを取得する必要がありますが、size()が0の場合、そのダミーポインタは何も実行されません。フロント()はこのように動作しますか?少なくともリリースビルドでは? – TarmoPikaro

0

、標準は、(C++ 03ので、私が考える)std::vector要素の連続的な記憶を必要として。

+0

これは、ベクトルが空の場合、未定義の動作になります。 –

1
&*my_vec.begin() 

又は

&mv_vec[0] 
+4

'my_vec.front()'は '* my_vec.begin()'のあまり厄介なバージョンです。 –

47

C++ 11コールがベクトルが空であっても有効であるという利点を有するvec.data()を有しています。

+0

+1は、ベクトルが空であるかどうかを確認するためのものです。私は残念ながらC++ 03でソフトウェアを書いています。 –

+2

これは正しい答えです。 someFunc(my_vec.size()、&my_vec [0])を記述すると、未定義の動作が発生します。ほとんどすべての答えのための同点。空のベクトルで.begin()を参照解除することはできず、.front()は空のベクトルで定義されていません。 someFunc(my_vec.size()、my_vec.data())のみが動作することが保証されています。 –

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

あなたはベクトルが空の場合は優先されなければならない、あなたは

&my_vec.at(0) 
関連する問題