std::vector<std::vector<int>> vecOfVecs;
vecOfVecs.resize(10);
vecOfVecsの位置0〜9は何になりますか?std :: vectorのインスタンス?
もしそうなら、これは合法ですか?
std::vector<int> *pToVec = &(vecOfVecs[0]);
pToVec->push_back(10);
std::vector<int>
はい、あなたが言ったかのように、位置 0-9 は の空のインスタンスになります
for (size_t i = vecOfVecs.size(); i < 10; ++i) {
vecOfVecs.push_back(std::vector<int>());
}
std::vector::resize
C++03の「標準的な」定義には、実際には 1 つではなく2 つのパラメーターがあり、2 番目の引数は、新しく作成された要素の「塗りつぶし値」として使用される要素値です。2 番目のパラメーターには、値で初期化された要素型のオブジェクトに等しい既定の引数があります。これは、あなたの呼び出しが
vecOfVecs.resize(10);
実際に翻訳される
vecOfVecs.resize(10, std::vector<int>());
電話。つまり、実際にはstd::vector<int>
、すべての新しい要素の初期化子として使用されるデフォルトで構築されたインスタンスを暗黙的に提供したのはあなたです。
あなたのpToVec->push_back(10)
電話は完全に合法です。
C++11 は (このコンテキストでは) の定義に重要でない変更をいくつか加えましたresize
が、一般的な効果は同じままです: 新しい要素は値で初期化されます。これらは、 への呼び出し後すぐに使用できますresize
。
resize
追加スペースに挿入する値を指定するデフォルトの2番目のパラメーターがあります。その値が指定されていない場合は、代わりにデフォルトで作成された値が使用されます。
void resize (size_type n, value_type val = value_type());
n
が現在のコンテナサイズより大きい場合、サイズに達するために必要な数の要素を最後に挿入することにより、コンテンツが拡張されますn
。が指定されている場合val
、新しい要素はのコピーとして初期化されます。指定されていval
ない場合、それらは値で初期化されます。
あなたの例は完全に正当です:あなたのベクトルのベクトルは10個の空のベクトルを含みます。