C ++ STL容器:: clear :: swap

时间:2012-04-10 23:14:04

标签: c++ dictionary stl std

“清除”大型STL容器的最快方法是什么?在我的应用程序中,我需要处理大型std::map,例如10000个元素。

我测试了以下3种方法来清除std::map

  • 每次需要时创建一个新容器。
  • 调用map::clear()方法。
  • 调用map::swap()方法。

::swap()似乎给出了最好的结果。谁能解释为什么会这样呢?拜托?可以说使用map::swap()方法是“清除”std :: map的正确方法吗?对于其他STL容器是否相同,例如setvectorlist等。

    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

2 个答案:

答案 0 :(得分:7)

您没有正确测试swap案例。您需要销毁swap-to地图才能占用所有时间。尝试其中之一:

{ 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);

答案 1 :(得分:2)

您是否在问这个问题,因为您遇到了性能问题并且您发现您的程序花费了太多时间来清理地图?如果你还没有这样做,那么只需使用map :: clear()或每次创建新的局部变量,无论哪种最自然和直接的程序。交换技巧是一种优化,除非根据经验确定你需要,否则浪费时间优化没什么意义。

如果您发现了性能问题,那么您已经拥有了确定哪种方法最适合它的工具。