Namespaces
Variants

std::unordered_map<Key,T,Hash,KeyEqual,Allocator>:: insert

From cppreference.net
std:: pair < iterator, bool > insert ( const value_type & value ) ;
(1) (C++11以降)
std:: pair < iterator, bool > insert ( value_type && value ) ;
(2) (C++17以降)
template < class P >
std:: pair < iterator, bool > insert ( P && value ) ;
(3) (C++11以降)
iterator insert ( const_iterator hint, const value_type & value ) ;
(4) (C++11以降)
iterator insert ( const_iterator hint, value_type && value ) ;
(5) (C++17以降)
template < class P >
iterator insert ( const_iterator hint, P && value ) ;
(6) (C++11以降)
template < class InputIt >
void insert ( InputIt first, InputIt last ) ;
(7) (C++11以降)
void insert ( std:: initializer_list < value_type > ilist ) ;
(8) (C++11以降)
insert_return_type insert ( node_type && nh ) ;
(9) (C++17以降)
iterator insert ( const_iterator hint, node_type && nh ) ;
(10) (C++17以降)

コンテナに要素を挿入します。ただし、同等のキーを持つ要素がコンテナにまだ含まれていない場合に限ります。

1-3) value を挿入します。
オーバーロード (3) emplace ( std:: forward < P > ( value ) ) と等価であり、 std:: is_constructible < value_type, P && > :: value == true の場合にのみオーバーロード解決に参加します。
4-6) value を挿入します。 hint は検索を開始すべき位置に関する非拘束的な提案として使用されます。
オーバーロード (6) emplace_hint ( hint, std:: forward < P > ( value ) ) と等価であり、 std:: is_constructible < value_type, P && > :: value == true の場合にのみオーバーロード解決に参加します。
7) 範囲 [ first , last ) から要素を挿入します。範囲内の複数の要素が同等と比較されるキーを持つ場合、どの要素が挿入されるかは未規定です( LWG2844 保留中)。
[ first , last ) 有効な範囲 でない場合、または first および/または last * this 内のイテレータである場合、動作は未定義です。
8) 初期化子リスト ilist から要素を挿入します。範囲内の複数の要素に比較等価なキーがある場合、どの要素が挿入されるかは未規定です(保留中 LWG2844 )。
9) nh が空の node handle である場合、何も行わない。そうでない場合、コンテナが nh. key ( ) と等価なキーを持つ要素をまだ含んでいない場合、 nh が所有する要素をコンテナに挿入する。 nh が空でなく、かつ get_allocator ( ) ! = nh. get_allocator ( ) である場合、動作は未定義である。
10) nh が空の node handle の場合、何もせずに終端イテレータを返す。それ以外の場合、コンテナが nh. key ( ) と等価なキーを持つ要素をまだ含んでいなければ、 nh が所有する要素をコンテナに挿入し、 nh. key ( ) と等価なキーを持つ要素を指すイテレータを返す(挿入が成功したか失敗したかに関わらず)。挿入が成功した場合、 nh は移動され、それ以外の場合、要素の所有権を保持し続ける。 hint は検索を開始すべき位置に対する非拘束的な提案として使用される。 nh が空でなく、かつ get_allocator ( ) ! = nh. get_allocator ( ) の場合、動作は未定義である。

操作後に新しい要素数が元の max_load_factor() * bucket_count() より大きくなる場合、リハッシュが発生します。
リハッシュが発生した場合(挿入による)、すべてのイテレータは無効化されます。それ以外の場合(リハッシュなし)、イテレータは無効化されません。 挿入が成功した場合、ノードハンドル内に保持されている間に取得された要素へのポインタと参照は無効化され、抽出前にその要素に対して取得されたポインタと参照は有効になります。 (C++17以降)

目次

翻訳の説明: - 「Contents」を「目次」に翻訳しました - C++関連の専門用語(Parameters, Return value, Exceptions, Complexity, Notes, Example, Defect reports, See also)は原文のまま保持しました - HTMLタグ、属性、クラス名、IDなどは一切変更していません - 数値や記号類もそのまま保持しています - 技術文書としての正確性と専門性を維持しています

パラメータ

hint - 挿入位置のヒントとして使用するイテレータ
value - 挿入する要素の値
first, last - 挿入する要素のソース範囲を定義するイテレータのペア range
ilist - 値を挿入する初期化子リスト
nh - 互換性のある node handle
型要件
-
InputIt LegacyInputIterator の要件を満たさなければならない。

戻り値

1-3) 挿入された要素(または挿入を妨げた要素)へのイテレータと、挿入が行われた場合にのみ bool 値が true に設定されるペア。
4-6) 挿入された要素、または挿入を妨げた要素へのイテレータ。
7,8) (なし)
9) insert_return_type のオブジェクトが以下のようにメンバーが初期化される:
  • nh が空の場合、 inserted false position end ( ) node は空となる。
  • 挿入が行われた場合、 inserted true position は挿入された要素を指し、 node は空となる。
  • 挿入が失敗した場合、 inserted false node nh の前の値を持ち、 position nh. key ( ) と等価なキーを持つ要素を指す。
10) nh が空の場合は終端イテレータ、挿入が行われた場合は挿入された要素を指すイテレータ、失敗した場合は nh. key ( ) と等価なキーを持つ要素を指すイテレータ。

例外

1-6) 何らかの理由で例外がスローされた場合、これらの関数は何も効果を持ちません( strong exception safety guarantee )。
7,8) 例外安全性保証なし。
9,10) 何らかの理由で例外がスローされた場合、これらの関数は何も効果を持ちません( strong exception safety guarantee )。

計算量

1-6) 平均ケース: O(1) 、最悪ケース O(size())
7,8) 平均ケース: O(N) 、ここでNは挿入する要素の数。最悪ケース: O(N * size() + N)
9,10) 平均ケース: O(1) 、最悪ケース O(size())

注記

ヒント付き挿入 ( ( 4-6 ) および ( 10 ) )は、 std::vector::insert のようなシーケンシャルコンテナに対する位置指定挿入とのシグネチャ互換性を保つため、ブール値を返しません。これにより、 std::inserter のような汎用インサーターを作成することが可能になります。ヒント付き挿入の成功を確認する一つの方法は、挿入前後の size() を比較することです。

#include <iostream>
#include <string>
#include <unordered_map>
int main ()
{
    std::unordered_map<int, std::string> dict = {{1, "one"}, {2, "two"}};
    dict.insert({3, "three"});
    dict.insert(std::make_pair(4, "four"));
    dict.insert({{4, "another four"}, {5, "five"}});
    const bool ok = dict.insert({1, "another one"}).second;
    std::cout << "inserting 1 => \"another one\" "
              << (ok ? "succeeded" : "failed") << '\n';
    std::cout << "contents:\n";
    for (auto& p : dict)
        std::cout << ' ' << p.first << " => " << p.second << '\n';
}

出力例:

inserting 1 => "another one" failed
contents:
 5 => five
 1 => one
 2 => two
 3 => three
 4 => four

欠陥報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 2005 C++11 オーバーロード ( 3 ) ( 6 ) P value_type に暗黙変換可能な場合のみ
オーバーロード解決に参加していた
value_type P && から構築可能な場合のみ参加

関連項目

要素をその場で構築する
(public member function)
ヒントを使用して要素をその場で構築する
(public member function)
要素を挿入するか、キーが既に存在する場合は現在の要素に代入する
(public member function)
引数から推論された型の std::insert_iterator を作成する
(function template)