2

大きなSTLコンテナを「クリア」する最速の方法は何ですか? 私のアプリケーションではstd::map、10000 要素などの大きなサイズを処理する必要があります。

をクリアするために、次の 3 つの方法をテストしましたstd::map

  • 必要になるたびに新しいコンテナーを作成します。
  • 呼び出しmap::clear()方法。
  • 呼び出しmap::swap()方法。

::swap()最良の結果をもたらすようです。なぜそうなのか、誰でも説明できますか?map::swap()メソッドを使用することが std::map を「クリア」する適切な方法であると言っても過言ではありませんか? setvectorlistなどの他の STL コンテナでも同じですか。

    m_timer_start = boost::posix_time::microsec_clock::local_time();

//  test_map.clear();
    test_map.swap(test_map2);
    for (int i = 0; i< 30000; i++){
        test_map.insert(std::pair<int, int>(i, i));
    }    

//  std::map<int, int> test_map_new;
//  for (int i = 0; i< 30000; i++){
//      test_map_new.insert(std::pair<int, int>(i, i));
//  }     

    m_timer_end = boost::posix_time::microsec_clock::local_time();
    std::cout << timer_diff(m_timer_start, m_timer_end).fractional_seconds() << std::endl; // microsecond
4

2 に答える 2

8

ケースを適切にテストしていませんswap。すべての時間を考慮するために、スワップ先マップを破棄する必要があります。次のいずれかを試してください。

{ std::map<something, something_else> test_map2;
test_map.swap(test_map2);
} // test_map2 gets destroyed at the closing brace.

また

// temporary gets destroyed at the semi-colon
std::map<int, int>().swap(test_map);
于 2012-04-10T23:41:15.257 に答える
2

パフォーマンスの問題があり、プログラムがマップのクリアに多くの時間を費やしていることを確認したため、これを尋ねていますか? これを行っていない場合は、 map::clear() を使用するか、毎回新しいローカル変数を作成するか、プログラムにとって最も自然で直接的な方を使用してください。スワップ トリックは最適化であり、経験に基づいて必要であることが確実でない限り、最適化に時間を浪費してもほとんど意味がありません。

パフォーマンスの問題を特定した場合は、どの方法が最適かを判断するためのツールをすでに入手しています。

于 2012-04-10T23:47:42.647 に答える