4

STL コンテナー (セット、マップ、キュー) を複数回使用する必要があるとします。どの一般的なアプローチがより良いでしょうか?

  1. 毎回コンテナを作成します。
  2. 毎回同じグローバル オブジェクトを使用しますが、時間をかけてクリアします。
// Option 1
void foo()
{
    set<int> S; //creating a new S each time foo is called.

    //use S...
}

// Option 2
set<int> S;
void foo()
{
    S.clear();

    //use S...
}
4

2 に答える 2

4

パフォーマンステストを行わなくても、コンテナを毎回構築および破棄する必要がないため、オプション2(再利用)の方がわずかに高速であることが直感的にわかります。コンテナを破棄すると、必ずクリアされます。そうしないと、メモリリークが発生します。

ただし、パフォーマンステストを実行すると、異なる結果が得られます。

  • std :: listのclear場合、デストラクタよりも時間がかかるようです。
  • std :: setの場合、結果はほぼ同じでした。
  • std :: mapの場合、結果は近いものでしたが、オプション1(デストラクタ)の方がわずかに高速でした。
  • std :: vectorの場合、結果はリストと同様でした(ベクトル全体がはるかに高速ですが)

したがって、全体として、option1の方がわずかに高速であるように見えます。私はVS2012、YMMVで実行していました

于 2013-02-28T20:10:14.903 に答える
0

マルチスレッドの問題に対処する必要がないと仮定すると、ケース2の方がおそらく優れています。主な理由は、一部の標準libコンテナでは、clearがメモリ割り当てを回避するためです。具体的には、std::vectorのclear関数のドキュメントを参照してください。

Clearはメモリの再割り当てを引き起こさず、ベクトルの容量は変更されません。

于 2013-02-28T20:09:58.113 に答える