4


0

次のstd :: vectorコードは有効ですか?
std::vector 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?

上記のコードは安全ですか?

5 Answer


7


無効です。 ベクトルには要素がないため、要素にアクセスできません。 あなたは `100`要素のためにスペースを予約しました(つまり、100個以上の要素が挿入されるまで再割り当てが起こらないことが保証されていることを意味します)。

実際には、要素を初期化せずにベクトルのサイズを変更することはできません(デフォルトの初期化だけでも)。


4


すぐにインデックスインする場合は、 `vec.resize(100)`を使用する必要があります。

`vec [50]`は、 `50 <vec.size()`の場合にのみ安全です。 `reserve()`はベクトルのサイズを変更しませんが、 `resize()`は含まれる型を_and_構築します。


0


うまくいきません。 コンテナには100個の要素が予約されていますが、まだ要素はありません。

メモリのその部分にアクセスするには、要素を挿入する必要があります。 Jon-Ericが言ったように、 `resize()`が道です。


0


std

vector :: reserve(100)は、100 * sizeof(foo)が空きメモリの100 * sizeof(foo)を要求するため、100 * sizeof(foo)がいっぱいになるまでベクトルへの追加挿入はメモリ割り当てを行いませんが、そのベクトルは、その要素の不確定な内容を提供します。メモリを割り当てないだけだからです。


0


operator []を使用して50番目の要素にアクセスする前に、resize、push_back()を50回呼び出すか、std

fill_nアルゴリズムを使用する必要があります。