C++11 std::map<K,V>
类型有 emplace
功能,就像许多其他容器一样。
std::map<int,std::string> m;
std::string val {"hello"};
m.emplace(1, val);
此代码如宣传的那样工作,取代了 std::pair<K,V>
直接,但是它会生成 key
的拷贝和 val
发生。
是否也可以将值类型直接放入映射中?我们能比将调用中的参数移动到 emplace
做得更好吗? ?
这里有一个更详尽的例子:
struct Foo
{
Foo(double d, string s) {}
Foo(const Foo&) = delete;
Foo(Foo&&) = delete;
}
map<int,Foo> m;
m.emplace(1, 2.3, string("hello")); // invalid
最佳答案
您传递给 map::emplace
的参数转发给 map::value_type
的构造函数,即 pair<const Key, Value>
.所以你可以使用 piecewise construction constructor的 std::pair
避免中间复制和移动。
std::map<int, Foo> m;
m.emplace(std::piecewise_construct,
std::forward_as_tuple(1),
std::forward_as_tuple(2.3, "hello"));
关于c++ - std::map 没有复制值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27960325/