繁体   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