提示:先阅读更新!
当前的C++ 11标准和C++ 14草案不提供用于启用此功能的成员函数。作为拉夫尔建议你仍然可以写
m.insert(make_move_iterator(begin(temp)),
make_move_iterator(end (temp)));
将从源容器的值移动到目标容器中。但是,容器节点和密钥都不会移动。这需要内存分配(至少用于在目标映射中创建新节点)。源容器中元素的数量将保持不变。复制背后的原因很简单:std::map
的值类型是std::pair<const Key,T>
。从const Key
移动本质上是复制密钥(除非有人超载Key
构造函数,它采取const Key &&
,我想不出有足够的理由)。
如果您需要将数据从一个容器移动到另一个容器,则可以考虑使用std::list
而不是std::map
。它有一个member function splice
,它可以将元素从一个列表中移动到另一个列表中。
UPDATE:
由于C++ 17有基本上把之一std::map
所有元素到另一个std::map
无需移动或复制实际的元件的功能std::map::merge()
,但仅通过repointing内部指针。这与自C++ 98以来存在的std::list::splice()
非常相似。
所以,你可能写
m.merge(temp);
来实现自己的目标。这比将所有元素从一个容器复制或移动到另一个容器更有效。
但要小心!冲突的钥匙不会被解决:对于一致的钥匙什么都不会做。
虽然'const key'会在移动这对时被复制,而'temp'会保持相同数量的元素,'T'会st如果'T'是一个像'std :: vector'这样的移动语义的大型结构,这仍然有意义,对吧? – iavr
@lavr的确是的。 –