2011-09-22 60 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

相關問題