【问题标题】:C++ STL container ::clear ::swapC++ STL 容器 ::clear ::swap
【发布时间】:2012-04-10 23:14:04
【问题描述】:

“清除”大型 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

【问题讨论】:

  • “最快”几乎总是依赖于实现。
  • 这三者之间的差异有多大?如果不是很多,我会说 clear 仍然是最易读的。
  • 您如何使用std::swap 以及您如何对其进行基准测试?
  • swap 本身肯定比clear 快,但它不会释放任何空间。你确定你计算了你交换的对象的破坏?
  • 您应该使用更大的测试用例。 5 毫秒的差异是最小的。

标签: c++ dictionary stl std


【解决方案1】:

您没有正确测试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);

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 好答案。虽然没有“交换技巧”:请参阅 Rob 的回答。
    • 我认为“交换技巧”优化通常意味着交换而不是分配(复制)当数据来自的容器的内容之后无关紧要。不过,这个技巧在 C++11 中大多被 std::move 取代。
    猜你喜欢
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 2015-08-04
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    • 2014-02-03
    相关资源
    最近更新 更多