8

私はこれをよく見ます:

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

つまり、ベクトルはおそらく内部で配列を使用するので、これが機能する理由がわかります。これが定義された動作であるかどうか疑問に思っています(たとえば、実装者がstd::vectorの実装を実行できるかどうか。壊す)。

標準間に矛盾がある場合は、C++11標準の内容に興味があります。

4

3 に答える 3

17

std::vectorはい、空でない場合は許可されます。vectorが空の場合、vec[0]未定義動作を引き起こします。

std::vector要素を連続して格納するために必要です。

)メソッドもありますがdata(、C++11のみです。

重要:

これは機能しませんstd::vector<bool>(ビット効率の高い特殊化)。ただし、これもコンテナではないため、IMOは非推奨にする必要があります。

于 2012-12-21T19:54:02.783 に答える
9

それは結構です。ただし、vecが空の場合、それは未定義の動作です。空vec.data()の場合にも機能するより良い使用法。vec

于 2012-12-21T19:54:22.253 に答える
6

はい、要素は連続して保存されることが保証されているため、問題ありません。標準はこれを認めています:

ベクトルの要素は連続して格納されます。つまり、がが、以外のタイプである場合v、すべてvector<T, Allocator>ののIDに従います。Tbool&v[n] == &v[0] + n0 <= n < v.size()

于 2012-12-21T19:54:08.607 に答える