std::vector<Foo> vec;
Foo foo(...);
assert(vec.size() == 0);
vec.reserve(100); // I've reserved 100 elems
vec[50] = foo; // but I haven't initialized any of them
// so am I assigning into uninitialized memory?
上記のコードは安全ですか?
有効ではありません。ベクトルには要素がないため、それらの要素にアクセスすることはできません。要素用のスペースを予約しただけです100
(つまり、100 を超える要素が挿入されるまで、再割り当てが発生しないことが保証されます)。
実際には、要素を初期化せずにベクトルのサイズを変更することはできません (デフォルトの初期化だけであっても)。
vec.resize(100)
すぐにインデックスを作成したい場合に使用してください。
vec[50]
の場合にのみ安全です50 < vec.size()
。reserve()
ベクトルのサイズを変更しませんが、含まれている型を変更resize()
して構築します。
うまくいきません。コンテナーには 100 個の要素が予約されていますが、まだ 0 個の要素があります。
メモリのその部分にアクセスするには、要素を挿入する必要があります。Jon-Ericresize()
が言ったように、行く方法です。
operator[] を使用して 50 番目の要素にアクセスする前に、resize、push_back() を 50 回呼び出すか、std::fill_n アルゴリズムを使用する必要があります。
std::vector::reserve(100) は 100*sizeof(Foo) の空きメモリを要求するため、ベクトルへのさらなる挿入は 100*sizeof(foo) がいっぱいになるまでメモリ割り当てを行いませんが、の要素にアクセスしますそのベクトルは、その要素の唯一の主張がメモリを割り当てないため、その要素の不確定なコンテンツを提供します。