最終更新日時: 2026年02月17日 23時22分33秒 (JST)
Akira Takahashi が更新

履歴 編集

function
<unordered_set>

# std::unordered_set::operator=(C++11)

    unordered_set& operator=(const unordered_set& v);           // (1) C++11
    constexpr unordered_set& operator=(const unordered_set& v); // (1) C++26

    unordered_set& operator=(unordered_set&& rv);                             // (2) C++11
    unordered_set& operator=(unordered_set&& x)
      noexcept(allocator_traits<Allocator>::is_always_equal::value
                && is_nothrow_move_assignable<Hash>::value
                && is_nothrow_move_assignable<Container_move_assign>::value); // (2) C++17
    constexpr unordered_set& operator=(unordered_set&& x)
      noexcept(allocator_traits<Allocator>::is_always_equal::value
                && is_nothrow_move_assignable<Hash>::value
                && is_nothrow_move_assignable<Container_move_assign>::value); // (2) C++26

    unordered_set& operator=(initializer_list<value_type> il);           // (3) C++11
    constexpr unordered_set& operator=(initializer_list<value_type> il); // (3) C++26

## 概要

`unordered_set` オブジェクトを代入する

## 要件

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

  - `value_type` はこのコンテナに対してコピー挿入可能（CopyInsertable）であること。
  - `value_type` はコピー代入可能（CopyAssignable）であること。

- (2) の形式の場合、`std::allocator_traits<allocator_type>::propagate_on_container_move_assignment::value` が `false` であれば、以下の条件を満たすこと。

  - `value_type` はこのコンテナに対してムーブ挿入可能（MoveInsertable）であること。
  - `value_type` はムーブ代入可能（MoveAssignable）であること。

## 効果

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

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

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

## 事後条件

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

- (1) : `u == v`。
- (2) : `u == 代入前の rv`。
- (3) : －

## 戻り値

`*this`

## 計算量

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

## 備考

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

## バージョン

### 言語

- C++11

### 処理系

- Clang: 3.0 ✅, 3.1 ✅
- GCC: 4.4.7 ✅, 4.5.3 ✅, 4.6.3 ✅, 4.7.0 ✅
- ICC: ?
- Visual C++: ?

## 関連項目

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

## 参照

- N2679 Initializer Lists for Standard Containers(Revision 1)
  - (3)の経緯となる提案文書
- N4258 Cleaning-up noexcept in the Library, Rev 3
  - `noexcept` 追加の経緯となる提案文書
- P3372R3 constexpr containers and adaptors