C++ C++;STL容器::清除::交换

C++ C++;STL容器::清除::交换,c++,dictionary,stl,std,C++,Dictionary,Stl,Std,“清除”大型STL容器的最快方法是什么?在我的应用程序中,我需要处理大尺寸的std::map,例如10000个元素 我已经测试了以下3种方法来清除std::map 每次需要时都创建一个新容器 调用map::clear()方法 调用map::swap()方法 似乎::swap()给出了最好的结果。有人能解释一下为什么会这样吗?可以肯定地说,使用map::swap()方法是“清除”std::map的正确方法吗?对于其他STL容器,例如,set、vector、list等,是否也一样 m_t

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

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

  • 每次需要时都创建一个新容器
  • 调用
    map::clear()
    方法
  • 调用
    map::swap()
    方法
似乎
::swap()
给出了最好的结果。有人能解释一下为什么会这样吗?可以肯定地说,使用
map::swap()
方法是“清除”std::map的正确方法吗?对于其他STL容器,例如,
set
vector
list
等,是否也一样

    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
m_timer_start=boost::posix_time::microsec_clock::local_time();
//test_map.clear();
测试映射交换(测试映射2);
对于(int i=0;i<30000;i++){
测试映射插入(std::pair(i,i));
}    
//标准::地图测试\地图\新;
//对于(int i=0;i<30000;i++){
//test_map_new.insert(std::pair(i,i));
//  }     
m_timer_end=boost::posix_time::microsec_clock::local_time();

std::cout您没有正确测试
交换
案例。您需要销毁要映射的交换,以便说明所有时间。请尝试以下方法之一:

{ std::map<something, something_else> test_map2;
test_map.swap(test_map2);
} // test_map2 gets destroyed at the closing brace.
{std::map test_map2;
测试映射交换(测试映射2);
}//test_map2在右括号处被销毁。

//临时文件在分号处被销毁
std::map().swap(测试映射);

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


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

“最快”几乎总是依赖于实现。这三种方法之间的差异有多大?如果不是很多,我会说clear仍然是最可读的。您如何使用
std::swap
以及如何对此进行基准测试?
swap
本身肯定比
clear
快,但它不会释放任何空间。你确定你计算了你交换的对象的破坏吗?你应该使用更大的测试用例。5毫秒的差异最小。回答得好。不过,这里没有“交换技巧”:见Rob的答案。我认为“交换技巧”优化通常意味着当数据来自的容器的内容事后不相关时,交换而不是分配(复制)。不过,在C++11中,这个技巧大部分被
std::move
所取代。
// temporary gets destroyed at the semi-colon
std::map<int, int>().swap(test_map);