std::unordered_map<Key,T,Hash,KeyEqual,Allocator>::emplace
提供: cppreference.com
< cpp | container | unordered map
template<class... Args> std::pair<iterator,bool> emplace( Args&&... args); | (C++11以上) | |
コンテナにそのキーを持つ要素がなければ、指定された args
を使用してその場で構築される新しい要素をコンテナに挿入します。
emplace
を注意深く使用すれば、不必要なコピーやムーブを避けながら新しい要素を構築することができます。 新しい要素 (すなわち std::pair<const Key, T>) のコンストラクタは、 emplace
に与えられたものとまったく同じ引数が std::forward<Args>(args)... によって転送されて、呼ばれます。 コンテナにそのキーの要素がすでに存在している場合でも、要素は構築されるかもしれません。 その場合、新しく構築された要素は即座に破壊されます。
挿入によって再ハッシュが発生した場合は、すべてのイテレータが無効化されます。 そうでなければ、イテレータは影響を受けません。 参照は無効化されません。 再ハッシュは新しい要素数が max_load_factor()*bucket_count() より大きい場合にのみ発生します。
目次 |
[編集]引数
args | - | 要素のコンストラクタに転送される引数 |
[編集]戻り値
挿入された要素、または挿入しなかった場合は既存の要素を指すイテレータと、挿入が発生したかどうかを表す bool (挿入が発生した場合は true、しなかった場合は false) から構成される、ペアを返します 。
[編集]例外
何らかの操作によって例外が投げられた場合、この関数は何の効果も持ちません。
[編集]計算量
平均的なケースでは償却定数時間。 ワーストケースではコンテナのサイズに比例。
[編集]例
Run this code
#include <iostream>#include <utility>#include <string>#include <unordered_map> int main(){std::unordered_map<std::string, std::string> m; // uses pair's move constructor m.emplace(std::make_pair(std::string("a"), std::string("a"))); // uses pair's converting move constructor m.emplace(std::make_pair("b", "abcd")); // uses pair's template constructor m.emplace("d", "ddd"); // uses pair's piecewise constructor m.emplace(std::piecewise_construct, std::forward_as_tuple("c"), std::forward_as_tuple(10, 'c'));// as of C++17, m.try_emplace("c", 10, 'c'); can be used for(constauto&p : m){std::cout<< p.first<<" => "<< p.second<<'\n';}}
出力例:
a => a b => abcd c => cccccccccc d => ddd
[編集]関連項目
ヒントを使用して要素をその場で構築します (パブリックメンバ関数) | |
(C++17) | キーが存在しなければその場で挿入します。 キーが存在している場合は何もしません (パブリックメンバ関数) |
要素またはノード(C++17以上)を挿入します (パブリックメンバ関数) |