[英]C++11 STL merge using move assignment between 2 maps
是否有可能將映射從1個實例A合並到另一個實例,而不需要對B的復制構造函數進行不必要的調用?
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中的map包含B的所有四個實例。
編輯:修復代碼中的實例。
是否有可能將映射從1個實例A合並到另一個實例,而不需要對B的復制構造函數進行不必要的調用?
很不幸的是,不行。 有人建議允許從一個地圖中刪除元素並將其插入另一個地圖中,但不接受。 有一些計划在未來修改該文件並提出新的提案。
您可以做的最好是插入新元素,但要確保它們使用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_type
是const
,因此無法移動鍵類型,只會移動映射類型( B
對象)。 這意味着A1
仍將包含與原來相同數量的元素,但B
對象將被移動,因此您可能希望之后執行此操作:
A1.clear();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.