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

履歴 編集

function template
<unordered_set>

# std::unordered_set::merge(C++17)

    template<class H2, class P2>
    void merge(unordered_set<Key, H2, P2, Allocator>& source);           // (1) C++17
    template<class H2, class P2>
    constexpr void merge(unordered_set<Key, H2, P2, Allocator>& source); // (1) C++26

    template<class H2, class P2>
    void merge(unordered_set<Key, H2, P2, Allocator>&& source);           // (2) C++17
    template<class H2, class P2>
    constexpr void merge(unordered_set<Key, H2, P2, Allocator>&& source); // (2) C++26

    template<class H2, class P2>
    void merge(unordered_multiset<Key, H2, P2, Allocator>& source);           // (3) C++17
    template<class H2, class P2>
    constexpr void merge(unordered_multiset<Key, H2, P2, Allocator>& source); // (3) C++26

    template<class H2, class P2>
    void merge(unordered_multiset<Key, H2, P2, Allocator>&& source);           // (4) C++17
    template<class H2, class P2>
    constexpr void merge(unordered_multiset<Key, H2, P2, Allocator>&& source); // (4) C++26

## 概要

引数 `source` 内の各要素を抽出し、`*this` のハッシュ関数とキー等価(equality)述語を使用して `*this` への挿入を試みる。 `source` の要素のキーと等価(equivalent)なキーの要素がある場合、その要素は `source` から抽出されない。 また、この操作で要素はコピーもムーブもされない。

## 要件

`source.get_allocator() == (*this).get_allocator()`

## 戻り値

なし

## 計算量

平均的なケースでは `O(N)`、最悪ケースでは `O(N*size()+N)`、ただし `N` は `source.size()` である。

## 備考

`source` の転送された要素へのポインタおよび参照は、それらと同じ要素を参照するが、`*this` のメンバとして参照する。また、転送された要素を参照する反復子と`*this`を参照するすべての反復子は無効になるが、 `source` に残っている要素への反復子は有効なままになる。

## 例

    #include <iostream>
    #include <unordered_set>

    int main()
    {
      std::unordered_set<int> s1 = { 10, 20, 30 };
      std::unordered_set<int> s2 = { 10 };

      // s1 の要素を s2 に merge
      s2.merge(s1);

      if (s1.size() != 0) std::cout << "s1 = { ";
      else std::cout << "s1 = {}\n";

      for(auto&& itr = s1.begin(); itr != s1.end();)
        std::cout << *itr << (++itr != s1.end() ? ", " : " }\n");

      if (s2.size() != 0) std::cout << "s2 = { ";
      else std::cout << "s2 = {}\n";

      for(auto&& itr = s2.begin(); itr != s2.end();)
        std::cout << *itr << (++itr != s2.end() ? ", " : " }\n");
    }

### 出力例

    s1 = { 10 }
    s2 = { 20, 30, 10 }

## バージョン

### 言語

- C++17

### 処理系

- Clang: 7.0.0 ✅
- GCC: 7.1.0 ✅
- ICC: ??
- Visual C++: 2017 Update 5 ✅

## 参照

- Splicing Maps and Sets(Revision 5)
- P3372R3 constexpr containers and adaptors