std :: map emplace没有复制值

时间:2015-01-15 09:29:05

标签: c++ c++11 dictionary stl emplace

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>,但会生成keyval的副本。

是否可以将值类型直接置于地图中?我们能否比调用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

2 个答案:

答案 0 :(得分:64)

您传递给map::emplace的参数会转发到map::value_type的构造函数,即pair<const Key, Value>。因此,您可以使用std::pair的{​​{3}}来避免中间副本和移动。

std::map<int, Foo> m;

m.emplace(std::piecewise_construct,
          std::forward_as_tuple(1),
          std::forward_as_tuple(2.3, "hello"));

piecewise construction constructor

答案 1 :(得分:15)

在C ++ 17中,使用try_emplace方法可以更轻松地实现这一点。

map<int,Foo> m;
m.try_emplace(1, 2.3, "hello");

标准库的这一新增内容已在paper N4279中介绍,并且应该已在Visual Studio 2015GCC 6.1LLVM 3.7(libc ++库)中得到支持。