- unordered_set[meta header]
- function template[meta id-type]
- std[meta namespace]
- unordered_multiset[meta class]
- cpp17[meta cpp]
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.get_allocator() == (*this).get_allocator()
なし
平均的なケースでは O(N)、最悪ケースでは O(N*size()+N)、ただし N は source.size() である。
max_load_factor()の不変条件を維持するために再ハッシュが必要となる場合があり、その際のメモリ確保により例外が送出される可能性がある。また、ハッシュ関数やキー等価述語が例外を送出する場合もある。
source の転送された要素へのポインタおよび参照は、それらと同じ要素を参照するが、*this のメンバとして参照する。また、転送された要素を参照する反復子と*thisを参照するすべての反復子は無効になるが、 source に残っている要素への反復子は有効なままになる。
#include <iostream>
#include <unordered_set>
int main()
{
std::unordered_multiset<int> s1 = { 10, 20, 30 };
std::unordered_multiset<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");
}- merge[color ff0000]
s1 = {}
s2 = { 10, 10, 20, 30 }
- C++17
- Clang: 7.0.0 [mark verified]
- GCC: 7.1.0 [mark verified]
- Visual C++: 2017 Update 5 [mark verified]
- Splicing Maps and Sets(Revision 5)
- LWG Issue 2977.
unordered_meow::merge()has incorrect Throws: clause- C++20で、「ハッシュ関数とキー等価述語以外は例外を投げない」という誤った例外指定が削除された
- この修正は欠陥報告(DR)であり、C++17に遡及して適用される。
max_load_factorの不変条件を維持するための再ハッシュでメモリ確保が発生しうるため、元の「投げない」保証は実装不可能だったため
- P3372R3 constexpr containers and adaptors