エラー...
次の方法を試してください。
std::vector<T>::reserve(x)
これにより、初期化せずにx個のアイテム用に十分なメモリを予約できます(ベクトルはまだ空です)。したがって、xを超えるまで再割り当てはありません。
2番目のポイントは、ベクトルが値をゼロに初期化しないことです。デバッグでコードをテストしていますか?
g ++で検証した後、次のコードを実行します。
#include <iostream>
#include <vector>
struct MyStruct
{
int m_iValue00 ;
int m_iValue01 ;
} ;
int main()
{
MyStruct aaa, bbb, ccc ;
std::vector<MyStruct> aMyStruct ;
aMyStruct.push_back(aaa) ;
aMyStruct.push_back(bbb) ;
aMyStruct.push_back(ccc) ;
aMyStruct.resize(6) ; // [EDIT] double the size
for(std::vector<MyStruct>::size_type i = 0, iMax = aMyStruct.size(); i < iMax; ++i)
{
std::cout << "[" << i << "] : " << aMyStruct[i].m_iValue00 << ", " << aMyStruct[0].m_iValue01 << "\n" ;
}
return 0 ;
}
次の結果が得られます。
[0] : 134515780, -16121856
[1] : 134554052, -16121856
[2] : 134544501, -16121856
[3] : 0, -16121856
[4] : 0, -16121856
[5] : 0, -16121856
あなたが見た初期化はおそらくアーティファクトでした。
[編集]サイズ変更に関するコメントの後、サイズ変更行を追加するようにコードを変更しました。サイズ変更は、ベクター内のオブジェクトのデフォルトコンストラクターを効果的に呼び出しますが、デフォルトコンストラクターが何もしない場合、何も初期化されません...それはアーティファクトであると私は信じています(ベクター全体をゼロにするのは初めてでした次のコード:
aMyStruct.push_back(MyStruct()) ;
aMyStruct.push_back(MyStruct()) ;
aMyStruct.push_back(MyStruct()) ;
それで... :-/
[編集2]Arkadiyがすでに提供しているように、解決策は、必要なパラメーターを取得するインラインコンストラクターを使用することです。何かのようなもの
struct MyStruct
{
MyStruct(int p_d1, int p_d2) : d1(p_d1), d2(p_d2) {}
int d1, d2 ;
} ;
これはおそらくコードにインライン化されます。
ただし、とにかくプロファイラーを使用してコードを調べ、このコードがアプリケーションのボトルネックであることを確認する必要があります。