std::vector<int>
またはを使用しますstd::vector<long>
。ベクトルのサイズが大きくなると、新しく割り当てられた要素はデフォルトで0に初期化されますか、それともプログラマーはそれらを明示的に0にする必要がありますか?
3 に答える
新しい要素は値で初期化されます:
[C++11: 23.3.6.3/9]:
void resize(size_type sz);
効果:の場合sz <= size()
、 と同等erase(begin() + sz, end());
。の場合、値が初期化された要素をシーケンスsize() < sz
に追加します。sz - size()
との両方についてint
、long
これは次のことを意味し0
ます。
[C++11: 8.5/7]:
タイプのオブジェクトを値で初期化するには、次のことをT
意味します。
T
ユーザー提供のコンストラクター (12.1) を持つ (おそらく cv 修飾された) クラス型 (第 9 節) の場合、デフォルトのコンストラクターがT
呼び出されます (T
アクセス可能なデフォルトのコンストラクターがない場合、初期化は不正な形式です)。- ユーザー提供のコンストラクターを持たない
T
(おそらく cv 修飾された) 非共用体クラス型の場合、オブジェクトはゼロで初期化され、T
の暗黙的に宣言されたデフォルト コンストラクターが自明でない場合、そのコンストラクターが呼び出されます。- が配列型の場合
T
、各要素は値で初期化されます。- それ以外の場合、オブジェクトはゼロで初期化されます。
値で初期化されたオブジェクトは構築されていると見なされるため、オブジェクトのオブジェクトに対してコンストラクターが呼び出されない場合でも、「構築された」オブジェクト、「コンストラクターが完了した」オブジェクトなどに適用されるこの国際標準の規定の対象となります。初期化。
ただし、これはベクトルの末尾にある「予約済み」スペースについて話しているわけではないことに注意してください。このスペースには、ゼロで初期化されているかどうかに関係なく、有効な要素が含まれていません。resize
この回答と標準的な言い回しは、新しい要素に明示的な値を指定せずにa を実行したときに取得する要素についてのみ話します。
C++11 標準のパラグラフ 23.3.6.3/9 による (約std::vector::resize()
):
void resize(size_type sz);
効果: sz <= size() の場合、erase(begin() + sz, end()); と同等。size() < sz の場合、sz - size()値で初期化された要素をシーケンスに追加します。
さらに、基準のパラグラフ 8.5/7 に従って:
タイプ T のオブジェクトを値で初期化するとは、次のことを意味します。
— T がユーザー提供のコンストラクター (12.1) を持つ (おそらく cv 修飾された) クラス型 (第 9 節) である場合、T のデフォルト コンストラクターが呼び出されます (T にアクセス可能なデフォルト コンストラクターがない場合、初期化の形式は正しくありません)。 );
— T が (おそらく cv 修飾された) 非共用体クラス型であり、ユーザー提供のコンストラクターがない場合、オブジェクトはゼロで初期化され、T の暗黙的に宣言された既定のコンストラクターが自明でない場合、そのコンストラクターが呼び出されます。
— T が配列型の場合、各要素は値で初期化されます。
— それ以外の場合、オブジェクトはゼロで初期化されます。
これはint
、新しく作成された要素の場合、値が に初期化されることを意味し0
ます。
はい、std::vector
サイズが変更されると (おそらく を実行することによってstd::vector::resize
)、新しい要素はvalue-initializedになります。int
またはなどの型の場合long
、値の初期化によりゼロ初期化が行われ、名前が示すように値が 0 に設定されます。