2011-09-22 21 views
1

在我的代码中,我有一个包含大量数据(〜100MB)的地图,我需要将所有数据从一个地图复制到另一个地图。目前我正在做这个交换but to my understanding,交换是一个奇特的方式来做副本。有没有办法简单地传输这两个地图使用的内存?我认为我可以用指针做到这一点,但我希望能有一个更优雅的方式。是否有快速的方法来替换两个地图内容?

+1

不,std :: map :: swap真的只是交换指针,而不是做一个副本。 (但是如果你使用了'std :: swap',那么_will_会做一个拷贝。) –

+5

@ChrisJesterYoung:23.4.1.5 [map.special]说''std :: swap'为两个映射'x'和'y'必须专门做相当于'x.swap(y)'。应该没有区别。 (我没有跟踪你!) –

+0

@CharlesBailey:呃,再一次,你是对的。帽子提示等:-) –

回答

4

除非在探查器运行中出现瓶颈,否则您可能会过早进行优化。

我的编译器的std::map::swap()有以下评论,这表明一个地图交换很可能是非常快:

/** 
    * This exchanges the elements between two maps in constant 
    * time. (It is only swapping a pointer, an integer, and an 
    * instance of the @c Compare type (which itself is often 
    * stateless and empty), so it should be quite fast.) Note 
    * that the global std::swap() function is specialized such 
    * that std::swap(m1,m2) will feed to this function. 
    */ 

g++ 4.4.5

5

23.2.1 [container.requirements.general]的ISO/IEC 14882:2011包含一般容器要求清单。对于所有标准集装箱,表达式a.swap(b)swap(a, b)必须交换ab的内容,并且对于除array之外的所有标准集装箱都必须具有恒定的时间。这实际上意味着交换地图不能涉及复制所有地图元素。

+0

我如何将你的答案标记为我的答案? – Yotam

+0

@Yam:我不确定你的意思。我的回答是回答你的问题。不需要采取行动。 –

+0

你的答案和aix答案都是有用的,我已经使用你的答案来扩展我的(错误的)我的代码/ c + +编程的理解。我想给你和aix两个信用点 – Yotam

相关问题