emplace_backとpush_backに関するこのSOの記事を参照してください。基本的に、最初に渡されるオブジェクトを作成しなくても、渡された引数からオブジェクトを構築できます。挿入するオブジェクトを作成した結果として通常発生するコピー構造を削除することにより、オーバーヘッドを節約します。
だからあなたはこれで逃げることができます:
unordered_map<int,int> foo;
foo.emplace(4, 5);
それ以外の
foo.insert(std::make_pair(4, 5));
さらに良いことに(そして私が間違っていなければ)、あなたはこのルートを通り抜けることができます:
struct Bar{
int x,y;
Bar(int _x, int _y) : x(_x), y(_y){}
};
unordered_map<int,Bar> baz;
baz.emplace(4, 5, 6);
そして、C ++ 0xのWikiから取得:
右辺値参照の言い回しの性質、および左辺値参照(通常の参照)の言い回しの変更により、右辺値参照を使用すると、開発者は完全な関数転送を提供できます。バリアディックテンプレートと組み合わせると、この機能により、特定の引数を取る別の関数に引数を完全に転送できる関数テンプレートが可能になります。これは、コンストラクターパラメーターを転送して、それらの特定の引数に対して正しいコンストラクターを自動的に呼び出すファクトリ関数を作成する場合に最も役立ちます。
これは次のように機能します。
template<typename TypeToConstruct> struct SharedPtrAllocator {
template<typename ...Args> std::shared_ptr<TypeToConstruct> construct_with_shared_ptr(Args&&... params) {
return std::shared_ptr<TypeToConstruct>(new TypeToConstruct(std::forward<Args>(params)...));
}
}
繰り返しになりますが、上記のWiki記事から恥知らずに盗まれました。