62

C++11std::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
4

2 に答える 2

32

C++17 では、メソッドを使用してこれをより簡単に実現できますtry_emplace

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

この標準ライブラリへの追加は論文 N4279で取り上げられており、 Visual Studio 2015GCC 6.1、およびLLVM 3.7 (libc++ ライブラリ)で既にサポートされているはずです。

于 2016-10-05T18:57:45.253 に答える