簡體   English   中英

C ++ 11 STL使用2個映射之間的移動分配進行合並

[英]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_typeconst ,因此無法移動鍵類型,只會移動映射類型( B對象)。 這意味着A1仍將包含與原來相同數量的元素,但B對象將被移動,因此您可能希望之后執行此操作:

A1.clear();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM