2014-05-02 69 views
3

如果沒有B的複製構造函數的非調用調用,是否可以將映射從1個實例A合併到另一個實例?C++ 11使用兩個映射之間的移動賦值進行STL合併

class A 
{ 
    ... 
    A & operator=(A && rhs); 

    map<string, B> map; 
}; 

class B 
{ 
    B(); 
    B & B(B && rhs); 
    ... 
} 

... 

A instanceOfA1; 
A instanceOfA2; 

B instanceOfB1; 
B instanceOfB2; 
B instanceOfB3; 
B instanceOfB4; 

instanceOfA1.map.insert(pair<string, B>("one", instanceOfB1)); 
instanceOfA1.map.insert(pair<string, B>("two", instanceOfB2)); 
instanceOfA1.map.insert(pair<string, B>("three", instanceOfB3)); 

instanceOfA2.map.insert(pair<string, B>("four", instanceOfB4)); 

instanceOfA2 = instanceOfA1; 

所以instanceOfA2該地圖包含B.

編輯的所有四個實例:在代碼中修復情況。

+0

豈不是'instanceOfA2 =移動( instanceOfA1)'? –

回答

5

是否有可能將地圖從1實例A合併到另一個沒有B的複製構造函數的非調用調用?

不幸的是,沒有。有一個proposal允許元素從一張地圖中移除並插入另一張地圖,但未被接受。有一些計劃將來修改論文並提出新的提案。

你能做的最好的是插入新的元素,但要確保他們使用的B的移動構造函數,而不是複製的:

for (auto& p : A1) 
    A2.insert(std::move(p)); 

這可以用move_iterator做太:

A2.insert(std::make_move_iterator(A1.begin()), std::make_move_iterator(A1.end())); 

請注意,std::map中的key_typeconst,因此密鑰類型不能移動,只有映射類型(B對象)將被移動。這意味着A1仍包含相同數量的元素它最初有,但B對象將被移動,從,所以你可能想以後做到這一點:

A1.clear(); 
+2

在'insert'中使用'move_iterator'會工作嗎? – user657267

+0

是的,我只是在我的答案中寫這個。 – jrok

+0

@ user657267,是的,但映射中的鍵是'const',因此無法移動。映射類型可以移動。 –

相關問題