std::map 放置而不复制值
std::map emplace without copying value
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>
。所以你可以使用 std::pair
的 piecewise construction constructor 来避免中间复制和移动。
std::map<int, Foo> m;
m.emplace(std::piecewise_construct,
std::forward_as_tuple(1),
std::forward_as_tuple(2.3, "hello"));
在 C++17 中,使用 try_emplace
方法可以更轻松地实现这一点。
map<int,Foo> m;
m.try_emplace(1, 2.3, "hello");
paper N4279 and should already be supported in Visual Studio 2015, GCC 6.1 and LLVM 3.7(libc++ 库)涵盖了对标准库的这一补充。
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>
。所以你可以使用 std::pair
的 piecewise construction constructor 来避免中间复制和移动。
std::map<int, Foo> m;
m.emplace(std::piecewise_construct,
std::forward_as_tuple(1),
std::forward_as_tuple(2.3, "hello"));
在 C++17 中,使用 try_emplace
方法可以更轻松地实现这一点。
map<int,Foo> m;
m.try_emplace(1, 2.3, "hello");
paper N4279 and should already be supported in Visual Studio 2015, GCC 6.1 and LLVM 3.7(libc++ 库)涵盖了对标准库的这一补充。