是否有可能将映射从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;
Run Code Online (Sandbox Code Playgroud)
因此instanceOfA2中的map包含B的所有四个实例.
编辑:修复代码中的实例.
是否有可能将映射从1个实例A合并到另一个实例,而不需要对B的复制构造函数进行不必要的调用?
很不幸的是,不行.有人建议允许从一个地图中删除元素并将其插入另一个地图中,但不接受.有一些计划在未来修改该文件并提出新的提案.
您可以做的最好是插入新元素,但要确保它们使用移动构造函数B而不是复制:
for (auto& p : A1)
A2.insert(std::move(p));
Run Code Online (Sandbox Code Playgroud)
这也可以用move_iterators 来完成:
A2.insert(std::make_move_iterator(A1.begin()), std::make_move_iterator(A1.end()));
Run Code Online (Sandbox Code Playgroud)
请注意,key_type在a std::map中const,因此无法移动键类型,只会移动映射的类型(B对象).这意味着它A1仍然包含与原来相同数量的元素,但是B对象将被移动,因此您可能希望之后执行此操作:
A1.clear();
Run Code Online (Sandbox Code Playgroud)