Namespaces
Variants

std::unordered_set<Key,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++11以降)
iterator insert ( const_iterator hint, const value_type & value ) ;
(3) (C++11以降)
iterator insert ( const_iterator hint, value_type && value ) ;
(4) (C++11以降)
template < class InputIt >
void insert ( InputIt first, InputIt last ) ;
(5) (C++11以降)
void insert ( std:: initializer_list < value_type > ilist ) ;
(6) (C++11以降)
insert_return_type insert ( node_type && nh ) ;
(7) (C++17以降)
iterator insert ( const_iterator hint, node_type && nh ) ;
(8) (C++17以降)
template < class K >
std:: pair < iterator, bool > insert ( K && obj ) ;
(9) (C++23以降)
template < class K >
iterator insert ( const_iterator hint, K && obj ) ;
(10) (C++23以降)

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

1,2) value を挿入します。
3,4) value を挿入します。 hint は検索を開始すべき位置に関する非拘束的な提案として使用されます。
5) 範囲 [ first , last ) から要素を挿入します。範囲内の複数の要素が同等と比較されるキーを持つ場合、どの要素が挿入されるかは未規定です( LWG2844 保留中)。
6) 初期化子リスト ilist から要素を挿入します。範囲内の複数の要素が同等と比較されるキーを持つ場合、どの要素が挿入されるかは未規定です( LWG2844 保留中)。
7) nh が空の node handle である場合、何も行わない。そうでない場合、コンテナが nh. key ( ) と等価なキーを持つ要素を既に含んでいない場合に限り、 nh が所有する要素をコンテナに挿入する。 nh が空でなく、かつ get_allocator ( ) ! = nh. get_allocator ( ) である場合、動作は未定義である。
8) もし nh が空の node handle であれば、何もせずに終端イテレータを返す。そうでなければ、 nh が所有する要素をコンテナに挿入する(ただし、コンテナが既に nh. key ( ) と等価なキーを持つ要素を含んでいない場合)。挿入の成否に関わらず、 nh. key ( ) と等価なキーを持つ要素を指すイテレータを返す。挿入が成功した場合、 nh は移動され、そうでない場合は要素の所有権を保持する。 hint は検索を開始すべき位置に対する非拘束的なヒントとして使用される。 nh が空でなく、かつ get_allocator ( ) ! = nh. get_allocator ( ) の場合、動作は未定義である。
9) * this が既に透過的に比較して 等価 な要素を含む場合、何もしない。それ以外の場合、 value_type 型のオブジェクト u std:: forward < K > ( obj ) で構築し、 u * this に挿入する。 equal_range ( u ) ! = hash_function ( ) ( obj ) || contains ( u ) true の場合、動作は未定義である。 value_type std:: forward < K > ( obj ) から unordered_set EmplaceConstructible でなければならない。このオーバーロードは、 Hash KeyEqual が両方とも 透過的 である場合にのみオーバーロード解決に参加する。これは、そのような Hash K Key 型の両方で呼び出し可能であり、 KeyEqual が透過的であることを前提としており、これらにより Key のインスタンスを構築せずにこの関数を呼び出すことができる。
10) もし * this が既に透過的に比較して 等価 な要素を含む場合、何もしない。

そうでない場合、 u value_type のオブジェクトとして std:: forward < K > ( obj ) で構築し、 u * this に挿入する。 Template:hint は検索を開始すべき場所に対する非拘束的な提案として使用される。もし equal_range ( u ) ! = hash_function ( ) ( obj ) || contains ( u ) true の場合、動作は未定義である。 value_type std:: forward < K > ( obj ) から unordered_set EmplaceConstructible でなければならない。このオーバーロードは以下の場合にのみオーバーロード解決に参加する:

  • std:: is_convertible_v < K && , const_iterator > std:: is_convertible_v < K && , iterator > の両方が false であり、かつ
  • Hash :: is_transparent KeyEqual :: is_transparent が有効であり、それぞれが型を表すこと。これは、そのような Hash K Key 型の両方で呼び出し可能であり、 KeyEqual が透過的であることを前提とする。
これらにより、 Key のインスタンスを構築せずにこの関数を呼び出すことが可能になる。

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

目次

パラメータ

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

戻り値

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

例外

1-4) いずれかの操作によって例外がスローされた場合、挿入は無効となります。

計算量

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

注記

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

機能テスト マクロ 標準 機能
__cpp_lib_associative_heterogeneous_insertion 202311L (C++26) 順序付き および 非順序 連想 コンテナ の残りのメンバー関数に対する異種オーバーロード。 ( 9,10 )

#include <array>
#include <iostream>
#include <unordered_set>
std::ostream& operator<<(std::ostream& os, std::unordered_set<int> const& s)
{
    for (os << '[' << s.size() << "] { "; int i : s)
        os << i << ' ';
    return os << "}\n";
}
int main ()
{
    std::unordered_set<int> nums{2, 3, 4};
    std::cout << "1) Initially: " << nums << std::boolalpha;
    auto p = nums.insert(1); // insert element, overload (1)
    std::cout << "2) '1' was inserted: " << p.second << '\n';
    std::cout << "3) After insertion: " << nums;
    nums.insert(p.first, 0); // insert with hint, overload (3)
    std::cout << "4) After insertion: " << nums;
    std::array<int, 4> a = {10, 11, 12, 13};
    nums.insert(a.begin(), a.end()); // insert range, overload (5)
    std::cout << "5) After insertion: " << nums;
    nums.insert({20, 21, 22, 23}); // insert initializer_list, (6)
    std::cout << "6) After insertion: " << nums;
    std::unordered_set<int> other_nums = {42, 43};
    auto node = other_nums.extract(other_nums.find(42));
    nums.insert(std::move(node)); // insert node, overload (7)
    std::cout << "7) After insertion: " << nums;
    node = other_nums.extract(other_nums.find(43));
    nums.insert(nums.begin(), std::move(node)); // insert node with hint, (8)
    std::cout << "8) After insertion: " << nums;
}

出力例:

1) Initially: [3] { 4 3 2 }
2) '1' was inserted: true
3) After insertion: [4] { 1 2 3 4 }
4) After insertion: [5] { 0 1 2 3 4 }
5) After insertion: [9] { 13 12 11 10 4 3 2 1 0 }
6) After insertion: [13] { 23 22 13 12 11 10 21 4 20 3 2 1 0 }
7) After insertion: [14] { 42 23 22 13 12 11 10 21 4 20 3 2 1 0 }
8) After insertion: [15] { 43 42 23 22 13 12 11 10 21 4 20 3 2 1 0 }

関連項目

要素をその場で構築する
(public member function)
ヒントを使用して要素をその場で構築する
(public member function)
引数から推論された型の std::insert_iterator を作成する
(function template)