【问题标题】:Insert map entry by r-value moving of mapped_type通过 mapped_type 的 r 值移动插入映射条目
【发布时间】:2013-01-12 22:26:59
【问题描述】:

我有一个(相当)简单的键类型和复杂的映射类型的地图,如下所示:

map<string, vector<string>> myMap;

如果我手头有vector&lt;string&gt;,是否可以在映射中插入一个条目来复制键但移动映射值?也就是说,有没有办法:

string key = "Key";
vector<string> mapped;
for (int i = 0; i < 1000; ++i)
  mapped.push_back("Some dynamic string");

// Insert by moving mapped; I know I'm done with it
myMap.insert(make_pair(key, move(mapped))); // This seems to move key too

【问题讨论】:

  • 问题是,您要将映射类型移动到哪里?它不会存在于地图中,除非您之前在那里创建过。
  • 只使用指针作为映射值可能更容易?
  • @TonyTheLion - vector 有一个移动构造函数,对吧?我希望地图中的 pair&lt;string, vector&gt; 具有通过 move 构造的矢量部分。
  • @billz - 什么,手动处理内存分配处理?不用了,谢谢。在mapped 超出范围之后很久,我将引用myMap
  • map&lt;string,unique_ptr&lt;vector&lt;string&gt;&gt;&gt; myMap,你不需要手动alloc-dealloc

标签: c++ map move-semantics


【解决方案1】:

您正在寻找std::map::emplace:

myMap.emplace(key, move(mapped));

这会就地调用适当的std::pair 构造函数:

template< class U1, class U2 >
pair( U1&& x, U2&& y );

由于第一个参数是左值,键被复制,但第二个(映射)是右值,因此被移动构造。

【讨论】:

    猜你喜欢
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多