質問

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

これは動作します

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

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

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

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

役に立ちましたか?

解決

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

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

おそらくC ++ 11の方がより慣用的な方法です

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

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

他のヒント

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

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

さて、これを行う方法を締めくくりましょう:)

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top