7

関数の引数として、vector<double>& vec長さと値が不明な(出力ベクトル、したがって非定数)を取得します。このベクトルをすべてゼロで特定の長さ n に初期化したいと思います。

これはうまくいきます

vec.clear();
vec.resize( n, 0.0 );

そして、これも同様に機能します:

vec.resize( n );
vec.assign( n, 0.0 );

2 番目の方が効率的ですか (メモリの割り当て解除/割り当てが行われないため)? これを行うより効率的な方法はありますか?

4

4 に答える 4

11
std::vector<double>(n).swap(vec);

この後、vec のサイズと容量は n で、すべての値が 0.0 であることが保証されます。

おそらく、C++11 以降のより慣用的な方法は

vec.assign(n, 0.);
vec.shrink_to_fit();

2行目はオプションです。vec複数の要素で始まる場合、n呼び出すかどうかshrink_to_fitは、必要以上のメモリを保持するか、再割り当てを実行するかのトレードオフです。

于 2008-10-06T14:43:15.640 に答える
9
std::vector<double>(n).swap(vec);

これには、ベクトルを実際に圧縮するという利点もあります。(最初の例でclear()は、ベクトルを圧縮することを保証するものではありません。)

于 2008-10-06T11:53:55.983 に答える
3

それでは、これを行う方法をまとめましょう :)

vec.swap(std::vector<double>(n));
std::vector<double>(n).swap(vec);
std::swap(vector<double>(n), vec);
std::swap(vec, vector<double>(n));
于 2008-10-06T21:22:07.600 に答える
2

あなたが投稿したコードスニペットはどちらもメモリの割り当てを解除しないため、ほぼ同じです。

他の誰もが投稿し続けるスワップ トリックは、ベクターが最初に使用したメモリの割り当てを解除するため、実行に時間がかかります。これは、望ましい場合と望ましくない場合があります。

于 2008-10-07T05:29:40.000 に答える