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

履歴 編集

function
<unordered_set>

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

template<class H2, class P2>
  void merge(unordered_set<Key, H2, P2, Allocator>& source);       // (1)
template<class H2, class P2>
  void merge(unordered_set<Key, H2, P2, Allocator>&& source);      // (2)
template<class H2, class P2>
  void merge(unordered_multiset<Key, H2, P2, Allocator>& source);  // (3)
template<class H2, class P2>
  void merge(unordered_multiset<Key, H2, P2, Allocator>&& source); // (4)

概要

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

要件

source.get_­allocator() == (*this).get_­allocator()

戻り値

なし

計算量

平均的なケースでは O(N)、ワーストケースでは O(N*size()+N)、ただし Nsource.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

処理系

参照