-1

ARRなどの配列があり、ARR内のオブジェクトの総数はわかっています。ARR内の各オブジェクトの属性をSTLベクトル(VECなど)にコピー(配置)したいと思います。

1つの方法は、ARRを反復処理することです。

VEC.pushback(ARR[i].att);

他の方法は

VEC.resize(ARR.size());
VEC[i] = ARR[i].att;

それらは実行時のパフォーマンスに関して違いをもたらしますか?どちらがいいですか?ありがとう。

フォローアップ:興味のある人のためにいくつかの実験結果を提供したいと思います。50000個の整数をSTLベクトルに入れて、(1)resize()+'='および(2)reserve()+ push_back()メソッドを試しました。

(1) takes 0.000201s;
(2) takes 0.000229s.
  • どちらもg++-O3でコンパイルされ、プログラムを数回実行しました。
  • (1)一貫して(2)を上回っています。
  • (1)余分な割り当てがあるため、スペースの観点からわずかに多くのメモリを使用します。
4

3 に答える 3

2

resize()前に(または)を呼び出すreserve()と、新しいアイテムを追加するときにサイズ変更を節約できる可能性があります。とにかく、あなたはすでにアイテムの数を知っているので、それはさらに理にかなっています。

resize()デフォルトの構築ステップがあるので、reserve()再割り当てを防ぐために使用しますpush_back()(C ++ 11ではemplace_back()、コンパイラーがサポートしている場合)。

于 2012-12-17T11:49:45.940 に答える
0

どちらのシナリオでも、QueryPerformanceCounter()関数を試すか、実行前にタイマーを開始し、実行後に停止する必要があると思います。時間の違いを確認し、各シナリオにかかる時間を評価して、どちらがより適切なソリューションであるかを判断できます。

于 2012-12-17T12:05:58.977 に答える
0

配列のデータをベクトルにコピーする場合は、ARRが単純な配列の場合はVEC.assign(ARR、ARR + ARR_size)を実行し、arrが任意の場合はVEC.assign(ARR.begin()、ARR.end())を実行します。他のシーケンスそれは非PODタイプの最速の方法です

于 2012-12-17T12:09:20.220 に答える