最終更新日時(UTC):
が更新

履歴 編集

function
<unordered_map>

std::unordered_map::operator=(C++11)

unordered_map& operator=(const unordered_map& v);          // (1)
unordered_map& operator=(unordered_map&& rv);              // (2)
unordered_map& operator=(unordered_map&& x)
  noexcept(allocator_traits<Allocator>::is_always_equal::value
            && is_nothrow_move_assignable<Hash>::value
            && is_nothrow_move_assignable<Pred>::value);   // (2) C++17
unordered_map& operator=(initializer_list<value_type> il); // (3)

概要

unordered_map オブジェクトを代入する

要件

  • (1)、および、(3) の形式の場合、以下の条件を満たすこと。

    • value_type はこのコンテナに対してコピー挿入可能(CopyInsertable)であること。
    • key_type、および、mapped_type はコピー代入可能(CopyAssignable)であること。(value_typestd::pair<const key_type, mapped_type> であるため、コピー代入可能ではない)
  • (2) の形式の場合、std::allocator_traits<allocator_type>::propagate_on_container_move_assignment::valuefalse であれば、以下の条件を満たすこと。

    • value_type はこのコンテナに対してムーブ挿入可能(MoveInsertable)であること。(但し、備考参照)
    • key_type、および、mapped_type はムーブ代入可能(MoveAssignable)であること。(value_typestd::pair<const key_type, mapped_type> であるため、ムーブ代入可能ではない)

効果

  • (1) : v の全ての要素がコピー代入される。ハッシュ関数オブジェクト、キー比較用関数オブジェクト、max_load_factor() の値もコピーされる。 アロケータオブジェクトは、std::allocator_traits<allocator_type>::propagate_on_container_copy_assignment::valuetrue の場合に限りコピーされる。

  • (2) : ハッシュ関数オブジェクト、キー比較用関数オブジェクトの値はムーブされる。 max_load_factor() の値はコピーされる。 アロケータオブジェクトは、std::allocator_traits<allocator_type>::propagate_on_container_move_assignment::valuetrue の場合に限りムーブされる。コンテナ内に元々存在していた要素は、代入されるか、破棄される(デストラクタが呼び出される)。

  • (3) : イテレータ範囲 [il.begin(), il.end()) がコピー代入される。 コンテナ内に元々存在していた要素は、代入されるか、破棄される(デストラクタが呼び出される)。

事後条件

以下では構築されたオブジェクトを u とする。

  • (1) u == v
  • (2) u == 代入前の rv
  • (3) -

戻り値

*this

計算量

  • (1) : 平均的には O(n)、ここで、n = v.size()。最悪のケースでは O(n2)
  • (2) : 線形時間。
  • (3) : 代入対象を aa の型を X とすると、a = X(il) と同様。(備考参照)

備考

  • (3) の形式の場合、計算量は a = X(il) と同様となっているが、効果が a = X(il) と同様なわけではない。(ハッシュ関数オブジェクト、キー比較用関数オブジェクト、アロケータオブジェクト、max_load_factor() 等が異なる)

  • (2) の形式の要件に、「value_type はこのコンテナに対してムーブ挿入可能であること」というものがあるが、value_typestd::pair<const key_type, mapped_type> であるため、通常のムーブ挿入可能の条件に合わせると key_type にコピーコンストラクタが必要となってしまう。 従って、規格書に明確な記載はないものの、この場合のムーブ挿入可能とは、m をアロケータ型 allocator_type の左辺値、p を要素型 value_type へのポインタ、krv をキーの型 key_type の右辺値、mrv を値の型 mapped_type の右辺値とすると、以下の式が適格(well-formed)であるということであるものと思われる。

    std::allocator_traits<allocator_type>::construct(m, p, krv, mrv)

バージョン

言語

  • C++11

処理系

関連項目

名前 説明
(constructor) コンストラクタ
(destructor) デストラクタ

参照