xref: /netbsd-src/external/gpl3/gcc.old/dist/libstdc++-v3/include/bits/unordered_map.h (revision 53b02e147d4ed531c0d2a5ca9b3e8026ba3e99b5)
1 // unordered_map implementation -*- C++ -*-
2 
3 // Copyright (C) 2010-2019 Free Software Foundation, Inc.
4 //
5 // This file is part of the GNU ISO C++ Library.  This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 3, or (at your option)
9 // any later version.
10 
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 // GNU General Public License for more details.
15 
16 // Under Section 7 of GPL version 3, you are granted additional
17 // permissions described in the GCC Runtime Library Exception, version
18 // 3.1, as published by the Free Software Foundation.
19 
20 // You should have received a copy of the GNU General Public License and
21 // a copy of the GCC Runtime Library Exception along with this program;
22 // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23 // <http://www.gnu.org/licenses/>.
24 
25 /** @file bits/unordered_map.h
26  *  This is an internal header file, included by other library headers.
27  *  Do not attempt to use it directly. @headername{unordered_map}
28  */
29 
30 #ifndef _UNORDERED_MAP_H
31 #define _UNORDERED_MAP_H
32 
33 namespace std _GLIBCXX_VISIBILITY(default)
34 {
35 _GLIBCXX_BEGIN_NAMESPACE_VERSION
36 _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
37 
38   /// Base types for unordered_map.
39   template<bool _Cache>
40     using __umap_traits = __detail::_Hashtable_traits<_Cache, false, true>;
41 
42   template<typename _Key,
43 	   typename _Tp,
44 	   typename _Hash = hash<_Key>,
45 	   typename _Pred = std::equal_to<_Key>,
46 	   typename _Alloc = std::allocator<std::pair<const _Key, _Tp> >,
47 	   typename _Tr = __umap_traits<__cache_default<_Key, _Hash>::value>>
48     using __umap_hashtable = _Hashtable<_Key, std::pair<const _Key, _Tp>,
49                                         _Alloc, __detail::_Select1st,
50 				        _Pred, _Hash,
51 				        __detail::_Mod_range_hashing,
52 				        __detail::_Default_ranged_hash,
53 				        __detail::_Prime_rehash_policy, _Tr>;
54 
55   /// Base types for unordered_multimap.
56   template<bool _Cache>
57     using __ummap_traits = __detail::_Hashtable_traits<_Cache, false, false>;
58 
59   template<typename _Key,
60 	   typename _Tp,
61 	   typename _Hash = hash<_Key>,
62 	   typename _Pred = std::equal_to<_Key>,
63 	   typename _Alloc = std::allocator<std::pair<const _Key, _Tp> >,
64 	   typename _Tr = __ummap_traits<__cache_default<_Key, _Hash>::value>>
65     using __ummap_hashtable = _Hashtable<_Key, std::pair<const _Key, _Tp>,
66 					 _Alloc, __detail::_Select1st,
67 					 _Pred, _Hash,
68 					 __detail::_Mod_range_hashing,
69 					 __detail::_Default_ranged_hash,
70 					 __detail::_Prime_rehash_policy, _Tr>;
71 
72   template<class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
73     class unordered_multimap;
74 
75   /**
76    *  @brief A standard container composed of unique keys (containing
77    *  at most one of each key value) that associates values of another type
78    *  with the keys.
79    *
80    *  @ingroup unordered_associative_containers
81    *
82    *  @tparam  _Key    Type of key objects.
83    *  @tparam  _Tp     Type of mapped objects.
84    *  @tparam  _Hash   Hashing function object type, defaults to hash<_Value>.
85    *  @tparam  _Pred   Predicate function object type, defaults
86    *                   to equal_to<_Value>.
87    *  @tparam  _Alloc  Allocator type, defaults to
88    *                   std::allocator<std::pair<const _Key, _Tp>>.
89    *
90    *  Meets the requirements of a <a href="tables.html#65">container</a>, and
91    *  <a href="tables.html#xx">unordered associative container</a>
92    *
93    * The resulting value type of the container is std::pair<const _Key, _Tp>.
94    *
95    *  Base is _Hashtable, dispatched at compile time via template
96    *  alias __umap_hashtable.
97    */
98   template<typename _Key, typename _Tp,
99 	   typename _Hash = hash<_Key>,
100 	   typename _Pred = equal_to<_Key>,
101 	   typename _Alloc = allocator<std::pair<const _Key, _Tp>>>
102     class unordered_map
103     {
104       typedef __umap_hashtable<_Key, _Tp, _Hash, _Pred, _Alloc>  _Hashtable;
105       _Hashtable _M_h;
106 
107     public:
108       // typedefs:
109       //@{
110       /// Public typedefs.
111       typedef typename _Hashtable::key_type	key_type;
112       typedef typename _Hashtable::value_type	value_type;
113       typedef typename _Hashtable::mapped_type	mapped_type;
114       typedef typename _Hashtable::hasher	hasher;
115       typedef typename _Hashtable::key_equal	key_equal;
116       typedef typename _Hashtable::allocator_type allocator_type;
117       //@}
118 
119       //@{
120       ///  Iterator-related typedefs.
121       typedef typename _Hashtable::pointer		pointer;
122       typedef typename _Hashtable::const_pointer	const_pointer;
123       typedef typename _Hashtable::reference		reference;
124       typedef typename _Hashtable::const_reference	const_reference;
125       typedef typename _Hashtable::iterator		iterator;
126       typedef typename _Hashtable::const_iterator	const_iterator;
127       typedef typename _Hashtable::local_iterator	local_iterator;
128       typedef typename _Hashtable::const_local_iterator	const_local_iterator;
129       typedef typename _Hashtable::size_type		size_type;
130       typedef typename _Hashtable::difference_type	difference_type;
131       //@}
132 
133 #if __cplusplus > 201402L
134       using node_type = typename _Hashtable::node_type;
135       using insert_return_type = typename _Hashtable::insert_return_type;
136 #endif
137 
138       //construct/destroy/copy
139 
140       /// Default constructor.
141       unordered_map() = default;
142 
143       /**
144        *  @brief  Default constructor creates no elements.
145        *  @param __n  Minimal initial number of buckets.
146        *  @param __hf  A hash functor.
147        *  @param __eql  A key equality functor.
148        *  @param __a  An allocator object.
149        */
150       explicit
151       unordered_map(size_type __n,
152 		    const hasher& __hf = hasher(),
153 		    const key_equal& __eql = key_equal(),
154 		    const allocator_type& __a = allocator_type())
155       : _M_h(__n, __hf, __eql, __a)
156       { }
157 
158       /**
159        *  @brief  Builds an %unordered_map from a range.
160        *  @param  __first  An input iterator.
161        *  @param  __last  An input iterator.
162        *  @param __n  Minimal initial number of buckets.
163        *  @param __hf  A hash functor.
164        *  @param __eql  A key equality functor.
165        *  @param __a  An allocator object.
166        *
167        *  Create an %unordered_map consisting of copies of the elements from
168        *  [__first,__last).  This is linear in N (where N is
169        *  distance(__first,__last)).
170        */
171       template<typename _InputIterator>
172 	unordered_map(_InputIterator __first, _InputIterator __last,
173 		      size_type __n = 0,
174 		      const hasher& __hf = hasher(),
175 		      const key_equal& __eql = key_equal(),
176 		      const allocator_type& __a = allocator_type())
177 	: _M_h(__first, __last, __n, __hf, __eql, __a)
178 	{ }
179 
180       /// Copy constructor.
181       unordered_map(const unordered_map&) = default;
182 
183       /// Move constructor.
184       unordered_map(unordered_map&&) = default;
185 
186       /**
187        *  @brief Creates an %unordered_map with no elements.
188        *  @param __a An allocator object.
189        */
190       explicit
191       unordered_map(const allocator_type& __a)
192 	: _M_h(__a)
193       { }
194 
195       /*
196        *  @brief Copy constructor with allocator argument.
197        * @param  __uset  Input %unordered_map to copy.
198        * @param  __a  An allocator object.
199        */
200       unordered_map(const unordered_map& __umap,
201 		    const allocator_type& __a)
202       : _M_h(__umap._M_h, __a)
203       { }
204 
205       /*
206        *  @brief  Move constructor with allocator argument.
207        *  @param  __uset Input %unordered_map to move.
208        *  @param  __a    An allocator object.
209        */
210       unordered_map(unordered_map&& __umap,
211 		    const allocator_type& __a)
212       : _M_h(std::move(__umap._M_h), __a)
213       { }
214 
215       /**
216        *  @brief  Builds an %unordered_map from an initializer_list.
217        *  @param  __l  An initializer_list.
218        *  @param __n  Minimal initial number of buckets.
219        *  @param __hf  A hash functor.
220        *  @param __eql  A key equality functor.
221        *  @param  __a  An allocator object.
222        *
223        *  Create an %unordered_map consisting of copies of the elements in the
224        *  list. This is linear in N (where N is @a __l.size()).
225        */
226       unordered_map(initializer_list<value_type> __l,
227 		    size_type __n = 0,
228 		    const hasher& __hf = hasher(),
229 		    const key_equal& __eql = key_equal(),
230 		    const allocator_type& __a = allocator_type())
231       : _M_h(__l, __n, __hf, __eql, __a)
232       { }
233 
234       unordered_map(size_type __n, const allocator_type& __a)
235       : unordered_map(__n, hasher(), key_equal(), __a)
236       { }
237 
238       unordered_map(size_type __n, const hasher& __hf,
239 		    const allocator_type& __a)
240       : unordered_map(__n, __hf, key_equal(), __a)
241       { }
242 
243       template<typename _InputIterator>
244 	unordered_map(_InputIterator __first, _InputIterator __last,
245 		      size_type __n,
246 		      const allocator_type& __a)
247 	: unordered_map(__first, __last, __n, hasher(), key_equal(), __a)
248 	{ }
249 
250       template<typename _InputIterator>
251 	unordered_map(_InputIterator __first, _InputIterator __last,
252 		      size_type __n, const hasher& __hf,
253 		      const allocator_type& __a)
254 	  : unordered_map(__first, __last, __n, __hf, key_equal(), __a)
255 	{ }
256 
257       unordered_map(initializer_list<value_type> __l,
258 		    size_type __n,
259 		    const allocator_type& __a)
260       : unordered_map(__l, __n, hasher(), key_equal(), __a)
261       { }
262 
263       unordered_map(initializer_list<value_type> __l,
264 		    size_type __n, const hasher& __hf,
265 		    const allocator_type& __a)
266       : unordered_map(__l, __n, __hf, key_equal(), __a)
267       { }
268 
269       /// Copy assignment operator.
270       unordered_map&
271       operator=(const unordered_map&) = default;
272 
273       /// Move assignment operator.
274       unordered_map&
275       operator=(unordered_map&&) = default;
276 
277       /**
278        *  @brief  %Unordered_map list assignment operator.
279        *  @param  __l  An initializer_list.
280        *
281        *  This function fills an %unordered_map with copies of the elements in
282        *  the initializer list @a __l.
283        *
284        *  Note that the assignment completely changes the %unordered_map and
285        *  that the resulting %unordered_map's size is the same as the number
286        *  of elements assigned.
287        */
288       unordered_map&
289       operator=(initializer_list<value_type> __l)
290       {
291 	_M_h = __l;
292 	return *this;
293       }
294 
295       ///  Returns the allocator object used by the %unordered_map.
296       allocator_type
297       get_allocator() const noexcept
298       { return _M_h.get_allocator(); }
299 
300       // size and capacity:
301 
302       ///  Returns true if the %unordered_map is empty.
303       _GLIBCXX_NODISCARD bool
304       empty() const noexcept
305       { return _M_h.empty(); }
306 
307       ///  Returns the size of the %unordered_map.
308       size_type
309       size() const noexcept
310       { return _M_h.size(); }
311 
312       ///  Returns the maximum size of the %unordered_map.
313       size_type
314       max_size() const noexcept
315       { return _M_h.max_size(); }
316 
317       // iterators.
318 
319       /**
320        *  Returns a read/write iterator that points to the first element in the
321        *  %unordered_map.
322        */
323       iterator
324       begin() noexcept
325       { return _M_h.begin(); }
326 
327       //@{
328       /**
329        *  Returns a read-only (constant) iterator that points to the first
330        *  element in the %unordered_map.
331        */
332       const_iterator
333       begin() const noexcept
334       { return _M_h.begin(); }
335 
336       const_iterator
337       cbegin() const noexcept
338       { return _M_h.begin(); }
339       //@}
340 
341       /**
342        *  Returns a read/write iterator that points one past the last element in
343        *  the %unordered_map.
344        */
345       iterator
346       end() noexcept
347       { return _M_h.end(); }
348 
349       //@{
350       /**
351        *  Returns a read-only (constant) iterator that points one past the last
352        *  element in the %unordered_map.
353        */
354       const_iterator
355       end() const noexcept
356       { return _M_h.end(); }
357 
358       const_iterator
359       cend() const noexcept
360       { return _M_h.end(); }
361       //@}
362 
363       // modifiers.
364 
365       /**
366        *  @brief Attempts to build and insert a std::pair into the
367        *  %unordered_map.
368        *
369        *  @param __args  Arguments used to generate a new pair instance (see
370        *	        std::piecewise_contruct for passing arguments to each
371        *	        part of the pair constructor).
372        *
373        *  @return  A pair, of which the first element is an iterator that points
374        *           to the possibly inserted pair, and the second is a bool that
375        *           is true if the pair was actually inserted.
376        *
377        *  This function attempts to build and insert a (key, value) %pair into
378        *  the %unordered_map.
379        *  An %unordered_map relies on unique keys and thus a %pair is only
380        *  inserted if its first element (the key) is not already present in the
381        *  %unordered_map.
382        *
383        *  Insertion requires amortized constant time.
384        */
385       template<typename... _Args>
386 	std::pair<iterator, bool>
387 	emplace(_Args&&... __args)
388 	{ return _M_h.emplace(std::forward<_Args>(__args)...); }
389 
390       /**
391        *  @brief Attempts to build and insert a std::pair into the
392        *  %unordered_map.
393        *
394        *  @param  __pos  An iterator that serves as a hint as to where the pair
395        *                should be inserted.
396        *  @param  __args  Arguments used to generate a new pair instance (see
397        *	         std::piecewise_contruct for passing arguments to each
398        *	         part of the pair constructor).
399        *  @return An iterator that points to the element with key of the
400        *          std::pair built from @a __args (may or may not be that
401        *          std::pair).
402        *
403        *  This function is not concerned about whether the insertion took place,
404        *  and thus does not return a boolean like the single-argument emplace()
405        *  does.
406        *  Note that the first parameter is only a hint and can potentially
407        *  improve the performance of the insertion process. A bad hint would
408        *  cause no gains in efficiency.
409        *
410        *  See
411        *  https://gcc.gnu.org/onlinedocs/libstdc++/manual/associative.html#containers.associative.insert_hints
412        *  for more on @a hinting.
413        *
414        *  Insertion requires amortized constant time.
415        */
416       template<typename... _Args>
417 	iterator
418 	emplace_hint(const_iterator __pos, _Args&&... __args)
419 	{ return _M_h.emplace_hint(__pos, std::forward<_Args>(__args)...); }
420 
421 #if __cplusplus > 201402L
422       /// Extract a node.
423       node_type
424       extract(const_iterator __pos)
425       {
426 	__glibcxx_assert(__pos != end());
427 	return _M_h.extract(__pos);
428       }
429 
430       /// Extract a node.
431       node_type
432       extract(const key_type& __key)
433       { return _M_h.extract(__key); }
434 
435       /// Re-insert an extracted node.
436       insert_return_type
437       insert(node_type&& __nh)
438       { return _M_h._M_reinsert_node(std::move(__nh)); }
439 
440       /// Re-insert an extracted node.
441       iterator
442       insert(const_iterator, node_type&& __nh)
443       { return _M_h._M_reinsert_node(std::move(__nh)).position; }
444 
445 #define __cpp_lib_unordered_map_try_emplace 201411
446       /**
447        *  @brief Attempts to build and insert a std::pair into the
448        *  %unordered_map.
449        *
450        *  @param __k    Key to use for finding a possibly existing pair in
451        *                the unordered_map.
452        *  @param __args  Arguments used to generate the .second for a
453        *                new pair instance.
454        *
455        *  @return  A pair, of which the first element is an iterator that points
456        *           to the possibly inserted pair, and the second is a bool that
457        *           is true if the pair was actually inserted.
458        *
459        *  This function attempts to build and insert a (key, value) %pair into
460        *  the %unordered_map.
461        *  An %unordered_map relies on unique keys and thus a %pair is only
462        *  inserted if its first element (the key) is not already present in the
463        *  %unordered_map.
464        *  If a %pair is not inserted, this function has no effect.
465        *
466        *  Insertion requires amortized constant time.
467        */
468       template <typename... _Args>
469         pair<iterator, bool>
470         try_emplace(const key_type& __k, _Args&&... __args)
471         {
472           iterator __i = find(__k);
473           if (__i == end())
474             {
475               __i = emplace(std::piecewise_construct,
476                             std::forward_as_tuple(__k),
477                             std::forward_as_tuple(
478                               std::forward<_Args>(__args)...))
479                 .first;
480               return {__i, true};
481             }
482           return {__i, false};
483         }
484 
485       // move-capable overload
486       template <typename... _Args>
487         pair<iterator, bool>
488         try_emplace(key_type&& __k, _Args&&... __args)
489         {
490           iterator __i = find(__k);
491           if (__i == end())
492             {
493               __i = emplace(std::piecewise_construct,
494                             std::forward_as_tuple(std::move(__k)),
495                             std::forward_as_tuple(
496                               std::forward<_Args>(__args)...))
497                 .first;
498               return {__i, true};
499             }
500           return {__i, false};
501         }
502 
503       /**
504        *  @brief Attempts to build and insert a std::pair into the
505        *  %unordered_map.
506        *
507        *  @param  __hint  An iterator that serves as a hint as to where the pair
508        *                should be inserted.
509        *  @param __k    Key to use for finding a possibly existing pair in
510        *                the unordered_map.
511        *  @param __args  Arguments used to generate the .second for a
512        *                new pair instance.
513        *  @return An iterator that points to the element with key of the
514        *          std::pair built from @a __args (may or may not be that
515        *          std::pair).
516        *
517        *  This function is not concerned about whether the insertion took place,
518        *  and thus does not return a boolean like the single-argument emplace()
519        *  does. However, if insertion did not take place,
520        *  this function has no effect.
521        *  Note that the first parameter is only a hint and can potentially
522        *  improve the performance of the insertion process. A bad hint would
523        *  cause no gains in efficiency.
524        *
525        *  See
526        *  https://gcc.gnu.org/onlinedocs/libstdc++/manual/associative.html#containers.associative.insert_hints
527        *  for more on @a hinting.
528        *
529        *  Insertion requires amortized constant time.
530        */
531       template <typename... _Args>
532         iterator
533         try_emplace(const_iterator __hint, const key_type& __k,
534                     _Args&&... __args)
535         {
536           iterator __i = find(__k);
537           if (__i == end())
538             __i = emplace_hint(__hint, std::piecewise_construct,
539                                std::forward_as_tuple(__k),
540                                std::forward_as_tuple(
541                                  std::forward<_Args>(__args)...));
542           return __i;
543         }
544 
545       // move-capable overload
546       template <typename... _Args>
547         iterator
548         try_emplace(const_iterator __hint, key_type&& __k, _Args&&... __args)
549         {
550           iterator __i = find(__k);
551           if (__i == end())
552             __i = emplace_hint(__hint, std::piecewise_construct,
553                                std::forward_as_tuple(std::move(__k)),
554                                std::forward_as_tuple(
555                                  std::forward<_Args>(__args)...));
556           return __i;
557         }
558 #endif // C++17
559 
560       //@{
561       /**
562        *  @brief Attempts to insert a std::pair into the %unordered_map.
563 
564        *  @param __x Pair to be inserted (see std::make_pair for easy
565        *	     creation of pairs).
566        *
567        *  @return  A pair, of which the first element is an iterator that
568        *           points to the possibly inserted pair, and the second is
569        *           a bool that is true if the pair was actually inserted.
570        *
571        *  This function attempts to insert a (key, value) %pair into the
572        *  %unordered_map. An %unordered_map relies on unique keys and thus a
573        *  %pair is only inserted if its first element (the key) is not already
574        *  present in the %unordered_map.
575        *
576        *  Insertion requires amortized constant time.
577        */
578       std::pair<iterator, bool>
579       insert(const value_type& __x)
580       { return _M_h.insert(__x); }
581 
582       // _GLIBCXX_RESOLVE_LIB_DEFECTS
583       // 2354. Unnecessary copying when inserting into maps with braced-init
584       std::pair<iterator, bool>
585       insert(value_type&& __x)
586       { return _M_h.insert(std::move(__x)); }
587 
588       template<typename _Pair>
589 	__enable_if_t<is_constructible<value_type, _Pair&&>::value,
590 		      pair<iterator, bool>>
591 	insert(_Pair&& __x)
592         { return _M_h.emplace(std::forward<_Pair>(__x)); }
593       //@}
594 
595       //@{
596       /**
597        *  @brief Attempts to insert a std::pair into the %unordered_map.
598        *  @param  __hint  An iterator that serves as a hint as to where the
599        *                 pair should be inserted.
600        *  @param  __x  Pair to be inserted (see std::make_pair for easy creation
601        *               of pairs).
602        *  @return An iterator that points to the element with key of
603        *           @a __x (may or may not be the %pair passed in).
604        *
605        *  This function is not concerned about whether the insertion took place,
606        *  and thus does not return a boolean like the single-argument insert()
607        *  does.  Note that the first parameter is only a hint and can
608        *  potentially improve the performance of the insertion process.  A bad
609        *  hint would cause no gains in efficiency.
610        *
611        *  See
612        *  https://gcc.gnu.org/onlinedocs/libstdc++/manual/associative.html#containers.associative.insert_hints
613        *  for more on @a hinting.
614        *
615        *  Insertion requires amortized constant time.
616        */
617       iterator
618       insert(const_iterator __hint, const value_type& __x)
619       { return _M_h.insert(__hint, __x); }
620 
621       // _GLIBCXX_RESOLVE_LIB_DEFECTS
622       // 2354. Unnecessary copying when inserting into maps with braced-init
623       iterator
624       insert(const_iterator __hint, value_type&& __x)
625       { return _M_h.insert(__hint, std::move(__x)); }
626 
627       template<typename _Pair>
628 	__enable_if_t<is_constructible<value_type, _Pair&&>::value, iterator>
629 	insert(const_iterator __hint, _Pair&& __x)
630 	{ return _M_h.emplace_hint(__hint, std::forward<_Pair>(__x)); }
631       //@}
632 
633       /**
634        *  @brief A template function that attempts to insert a range of
635        *  elements.
636        *  @param  __first  Iterator pointing to the start of the range to be
637        *                   inserted.
638        *  @param  __last  Iterator pointing to the end of the range.
639        *
640        *  Complexity similar to that of the range constructor.
641        */
642       template<typename _InputIterator>
643 	void
644 	insert(_InputIterator __first, _InputIterator __last)
645 	{ _M_h.insert(__first, __last); }
646 
647       /**
648        *  @brief Attempts to insert a list of elements into the %unordered_map.
649        *  @param  __l  A std::initializer_list<value_type> of elements
650        *               to be inserted.
651        *
652        *  Complexity similar to that of the range constructor.
653        */
654       void
655       insert(initializer_list<value_type> __l)
656       { _M_h.insert(__l); }
657 
658 
659 #if __cplusplus > 201402L
660 #define __cpp_lib_unordered_map_insertion 201411
661       /**
662        *  @brief Attempts to insert a std::pair into the %unordered_map.
663        *  @param __k    Key to use for finding a possibly existing pair in
664        *                the map.
665        *  @param __obj  Argument used to generate the .second for a pair
666        *                instance.
667        *
668        *  @return  A pair, of which the first element is an iterator that
669        *           points to the possibly inserted pair, and the second is
670        *           a bool that is true if the pair was actually inserted.
671        *
672        *  This function attempts to insert a (key, value) %pair into the
673        *  %unordered_map. An %unordered_map relies on unique keys and thus a
674        *  %pair is only inserted if its first element (the key) is not already
675        *  present in the %unordered_map.
676        *  If the %pair was already in the %unordered_map, the .second of
677        *  the %pair is assigned from __obj.
678        *
679        *  Insertion requires amortized constant time.
680        */
681       template <typename _Obj>
682         pair<iterator, bool>
683         insert_or_assign(const key_type& __k, _Obj&& __obj)
684         {
685           iterator __i = find(__k);
686           if (__i == end())
687             {
688               __i = emplace(std::piecewise_construct,
689                             std::forward_as_tuple(__k),
690                             std::forward_as_tuple(std::forward<_Obj>(__obj)))
691                 .first;
692               return {__i, true};
693             }
694           (*__i).second = std::forward<_Obj>(__obj);
695           return {__i, false};
696         }
697 
698       // move-capable overload
699       template <typename _Obj>
700         pair<iterator, bool>
701         insert_or_assign(key_type&& __k, _Obj&& __obj)
702         {
703           iterator __i = find(__k);
704           if (__i == end())
705             {
706               __i = emplace(std::piecewise_construct,
707                             std::forward_as_tuple(std::move(__k)),
708                             std::forward_as_tuple(std::forward<_Obj>(__obj)))
709                 .first;
710               return {__i, true};
711             }
712           (*__i).second = std::forward<_Obj>(__obj);
713           return {__i, false};
714         }
715 
716       /**
717        *  @brief Attempts to insert a std::pair into the %unordered_map.
718        *  @param  __hint  An iterator that serves as a hint as to where the
719        *                  pair should be inserted.
720        *  @param __k    Key to use for finding a possibly existing pair in
721        *                the unordered_map.
722        *  @param __obj  Argument used to generate the .second for a pair
723        *                instance.
724        *  @return An iterator that points to the element with key of
725        *           @a __x (may or may not be the %pair passed in).
726        *
727        *  This function is not concerned about whether the insertion took place,
728        *  and thus does not return a boolean like the single-argument insert()
729        *  does.
730        *  If the %pair was already in the %unordered map, the .second of
731        *  the %pair is assigned from __obj.
732        *  Note that the first parameter is only a hint and can
733        *  potentially improve the performance of the insertion process.  A bad
734        *  hint would cause no gains in efficiency.
735        *
736        *  See
737        *  https://gcc.gnu.org/onlinedocs/libstdc++/manual/associative.html#containers.associative.insert_hints
738        *  for more on @a hinting.
739        *
740        *  Insertion requires amortized constant time.
741        */
742       template <typename _Obj>
743         iterator
744         insert_or_assign(const_iterator __hint, const key_type& __k,
745                          _Obj&& __obj)
746         {
747           iterator __i = find(__k);
748           if (__i == end())
749             {
750               return emplace_hint(__hint, std::piecewise_construct,
751                                   std::forward_as_tuple(__k),
752                                   std::forward_as_tuple(
753                                     std::forward<_Obj>(__obj)));
754             }
755           (*__i).second = std::forward<_Obj>(__obj);
756           return __i;
757         }
758 
759       // move-capable overload
760       template <typename _Obj>
761         iterator
762         insert_or_assign(const_iterator __hint, key_type&& __k, _Obj&& __obj)
763         {
764           iterator __i = find(__k);
765           if (__i == end())
766             {
767               return emplace_hint(__hint, std::piecewise_construct,
768                                   std::forward_as_tuple(std::move(__k)),
769                                   std::forward_as_tuple(
770                                     std::forward<_Obj>(__obj)));
771             }
772           (*__i).second = std::forward<_Obj>(__obj);
773           return __i;
774         }
775 #endif
776 
777       //@{
778       /**
779        *  @brief Erases an element from an %unordered_map.
780        *  @param  __position  An iterator pointing to the element to be erased.
781        *  @return An iterator pointing to the element immediately following
782        *          @a __position prior to the element being erased. If no such
783        *          element exists, end() is returned.
784        *
785        *  This function erases an element, pointed to by the given iterator,
786        *  from an %unordered_map.
787        *  Note that this function only erases the element, and that if the
788        *  element is itself a pointer, the pointed-to memory is not touched in
789        *  any way.  Managing the pointer is the user's responsibility.
790        */
791       iterator
792       erase(const_iterator __position)
793       { return _M_h.erase(__position); }
794 
795       // LWG 2059.
796       iterator
797       erase(iterator __position)
798       { return _M_h.erase(__position); }
799       //@}
800 
801       /**
802        *  @brief Erases elements according to the provided key.
803        *  @param  __x  Key of element to be erased.
804        *  @return  The number of elements erased.
805        *
806        *  This function erases all the elements located by the given key from
807        *  an %unordered_map. For an %unordered_map the result of this function
808        *  can only be 0 (not present) or 1 (present).
809        *  Note that this function only erases the element, and that if the
810        *  element is itself a pointer, the pointed-to memory is not touched in
811        *  any way.  Managing the pointer is the user's responsibility.
812        */
813       size_type
814       erase(const key_type& __x)
815       { return _M_h.erase(__x); }
816 
817       /**
818        *  @brief Erases a [__first,__last) range of elements from an
819        *  %unordered_map.
820        *  @param  __first  Iterator pointing to the start of the range to be
821        *                  erased.
822        *  @param __last  Iterator pointing to the end of the range to
823        *                be erased.
824        *  @return The iterator @a __last.
825        *
826        *  This function erases a sequence of elements from an %unordered_map.
827        *  Note that this function only erases the elements, and that if
828        *  the element is itself a pointer, the pointed-to memory is not touched
829        *  in any way.  Managing the pointer is the user's responsibility.
830        */
831       iterator
832       erase(const_iterator __first, const_iterator __last)
833       { return _M_h.erase(__first, __last); }
834 
835       /**
836        *  Erases all elements in an %unordered_map.
837        *  Note that this function only erases the elements, and that if the
838        *  elements themselves are pointers, the pointed-to memory is not touched
839        *  in any way.  Managing the pointer is the user's responsibility.
840        */
841       void
842       clear() noexcept
843       { _M_h.clear(); }
844 
845       /**
846        *  @brief  Swaps data with another %unordered_map.
847        *  @param  __x  An %unordered_map of the same element and allocator
848        *  types.
849        *
850        *  This exchanges the elements between two %unordered_map in constant
851        *  time.
852        *  Note that the global std::swap() function is specialized such that
853        *  std::swap(m1,m2) will feed to this function.
854        */
855       void
856       swap(unordered_map& __x)
857       noexcept( noexcept(_M_h.swap(__x._M_h)) )
858       { _M_h.swap(__x._M_h); }
859 
860 #if __cplusplus > 201402L
861       template<typename, typename, typename>
862 	friend class std::_Hash_merge_helper;
863 
864       template<typename _H2, typename _P2>
865 	void
866 	merge(unordered_map<_Key, _Tp, _H2, _P2, _Alloc>& __source)
867 	{
868 	  using _Merge_helper = _Hash_merge_helper<unordered_map, _H2, _P2>;
869 	  _M_h._M_merge_unique(_Merge_helper::_S_get_table(__source));
870 	}
871 
872       template<typename _H2, typename _P2>
873 	void
874 	merge(unordered_map<_Key, _Tp, _H2, _P2, _Alloc>&& __source)
875 	{ merge(__source); }
876 
877       template<typename _H2, typename _P2>
878 	void
879 	merge(unordered_multimap<_Key, _Tp, _H2, _P2, _Alloc>& __source)
880 	{
881 	  using _Merge_helper = _Hash_merge_helper<unordered_map, _H2, _P2>;
882 	  _M_h._M_merge_unique(_Merge_helper::_S_get_table(__source));
883 	}
884 
885       template<typename _H2, typename _P2>
886 	void
887 	merge(unordered_multimap<_Key, _Tp, _H2, _P2, _Alloc>&& __source)
888 	{ merge(__source); }
889 #endif // C++17
890 
891       // observers.
892 
893       ///  Returns the hash functor object with which the %unordered_map was
894       ///  constructed.
895       hasher
896       hash_function() const
897       { return _M_h.hash_function(); }
898 
899       ///  Returns the key comparison object with which the %unordered_map was
900       ///  constructed.
901       key_equal
902       key_eq() const
903       { return _M_h.key_eq(); }
904 
905       // lookup.
906 
907       //@{
908       /**
909        *  @brief Tries to locate an element in an %unordered_map.
910        *  @param  __x  Key to be located.
911        *  @return  Iterator pointing to sought-after element, or end() if not
912        *           found.
913        *
914        *  This function takes a key and tries to locate the element with which
915        *  the key matches.  If successful the function returns an iterator
916        *  pointing to the sought after element.  If unsuccessful it returns the
917        *  past-the-end ( @c end() ) iterator.
918        */
919       iterator
920       find(const key_type& __x)
921       { return _M_h.find(__x); }
922 
923       const_iterator
924       find(const key_type& __x) const
925       { return _M_h.find(__x); }
926       //@}
927 
928       /**
929        *  @brief  Finds the number of elements.
930        *  @param  __x  Key to count.
931        *  @return  Number of elements with specified key.
932        *
933        *  This function only makes sense for %unordered_multimap; for
934        *  %unordered_map the result will either be 0 (not present) or 1
935        *  (present).
936        */
937       size_type
938       count(const key_type& __x) const
939       { return _M_h.count(__x); }
940 
941 #if __cplusplus > 201703L
942       /**
943        *  @brief  Finds whether an element with the given key exists.
944        *  @param  __x  Key of elements to be located.
945        *  @return  True if there is any element with the specified key.
946        */
947       bool
948       contains(const key_type& __x) const
949       { return _M_h.find(__x) != _M_h.end(); }
950 #endif
951 
952       //@{
953       /**
954        *  @brief Finds a subsequence matching given key.
955        *  @param  __x  Key to be located.
956        *  @return  Pair of iterators that possibly points to the subsequence
957        *           matching given key.
958        *
959        *  This function probably only makes sense for %unordered_multimap.
960        */
961       std::pair<iterator, iterator>
962       equal_range(const key_type& __x)
963       { return _M_h.equal_range(__x); }
964 
965       std::pair<const_iterator, const_iterator>
966       equal_range(const key_type& __x) const
967       { return _M_h.equal_range(__x); }
968       //@}
969 
970       //@{
971       /**
972        *  @brief  Subscript ( @c [] ) access to %unordered_map data.
973        *  @param  __k  The key for which data should be retrieved.
974        *  @return  A reference to the data of the (key,data) %pair.
975        *
976        *  Allows for easy lookup with the subscript ( @c [] )operator.  Returns
977        *  data associated with the key specified in subscript.  If the key does
978        *  not exist, a pair with that key is created using default values, which
979        *  is then returned.
980        *
981        *  Lookup requires constant time.
982        */
983       mapped_type&
984       operator[](const key_type& __k)
985       { return _M_h[__k]; }
986 
987       mapped_type&
988       operator[](key_type&& __k)
989       { return _M_h[std::move(__k)]; }
990       //@}
991 
992       //@{
993       /**
994        *  @brief  Access to %unordered_map data.
995        *  @param  __k  The key for which data should be retrieved.
996        *  @return  A reference to the data whose key is equal to @a __k, if
997        *           such a data is present in the %unordered_map.
998        *  @throw  std::out_of_range  If no such data is present.
999        */
1000       mapped_type&
1001       at(const key_type& __k)
1002       { return _M_h.at(__k); }
1003 
1004       const mapped_type&
1005       at(const key_type& __k) const
1006       { return _M_h.at(__k); }
1007       //@}
1008 
1009       // bucket interface.
1010 
1011       /// Returns the number of buckets of the %unordered_map.
1012       size_type
1013       bucket_count() const noexcept
1014       { return _M_h.bucket_count(); }
1015 
1016       /// Returns the maximum number of buckets of the %unordered_map.
1017       size_type
1018       max_bucket_count() const noexcept
1019       { return _M_h.max_bucket_count(); }
1020 
1021       /*
1022        * @brief  Returns the number of elements in a given bucket.
1023        * @param  __n  A bucket index.
1024        * @return  The number of elements in the bucket.
1025        */
1026       size_type
1027       bucket_size(size_type __n) const
1028       { return _M_h.bucket_size(__n); }
1029 
1030       /*
1031        * @brief  Returns the bucket index of a given element.
1032        * @param  __key  A key instance.
1033        * @return  The key bucket index.
1034        */
1035       size_type
1036       bucket(const key_type& __key) const
1037       { return _M_h.bucket(__key); }
1038 
1039       /**
1040        *  @brief  Returns a read/write iterator pointing to the first bucket
1041        *         element.
1042        *  @param  __n The bucket index.
1043        *  @return  A read/write local iterator.
1044        */
1045       local_iterator
1046       begin(size_type __n)
1047       { return _M_h.begin(__n); }
1048 
1049       //@{
1050       /**
1051        *  @brief  Returns a read-only (constant) iterator pointing to the first
1052        *         bucket element.
1053        *  @param  __n The bucket index.
1054        *  @return  A read-only local iterator.
1055        */
1056       const_local_iterator
1057       begin(size_type __n) const
1058       { return _M_h.begin(__n); }
1059 
1060       const_local_iterator
1061       cbegin(size_type __n) const
1062       { return _M_h.cbegin(__n); }
1063       //@}
1064 
1065       /**
1066        *  @brief  Returns a read/write iterator pointing to one past the last
1067        *         bucket elements.
1068        *  @param  __n The bucket index.
1069        *  @return  A read/write local iterator.
1070        */
1071       local_iterator
1072       end(size_type __n)
1073       { return _M_h.end(__n); }
1074 
1075       //@{
1076       /**
1077        *  @brief  Returns a read-only (constant) iterator pointing to one past
1078        *         the last bucket elements.
1079        *  @param  __n The bucket index.
1080        *  @return  A read-only local iterator.
1081        */
1082       const_local_iterator
1083       end(size_type __n) const
1084       { return _M_h.end(__n); }
1085 
1086       const_local_iterator
1087       cend(size_type __n) const
1088       { return _M_h.cend(__n); }
1089       //@}
1090 
1091       // hash policy.
1092 
1093       /// Returns the average number of elements per bucket.
1094       float
1095       load_factor() const noexcept
1096       { return _M_h.load_factor(); }
1097 
1098       /// Returns a positive number that the %unordered_map tries to keep the
1099       /// load factor less than or equal to.
1100       float
1101       max_load_factor() const noexcept
1102       { return _M_h.max_load_factor(); }
1103 
1104       /**
1105        *  @brief  Change the %unordered_map maximum load factor.
1106        *  @param  __z The new maximum load factor.
1107        */
1108       void
1109       max_load_factor(float __z)
1110       { _M_h.max_load_factor(__z); }
1111 
1112       /**
1113        *  @brief  May rehash the %unordered_map.
1114        *  @param  __n The new number of buckets.
1115        *
1116        *  Rehash will occur only if the new number of buckets respect the
1117        *  %unordered_map maximum load factor.
1118        */
1119       void
1120       rehash(size_type __n)
1121       { _M_h.rehash(__n); }
1122 
1123       /**
1124        *  @brief  Prepare the %unordered_map for a specified number of
1125        *          elements.
1126        *  @param  __n Number of elements required.
1127        *
1128        *  Same as rehash(ceil(n / max_load_factor())).
1129        */
1130       void
1131       reserve(size_type __n)
1132       { _M_h.reserve(__n); }
1133 
1134       template<typename _Key1, typename _Tp1, typename _Hash1, typename _Pred1,
1135 	       typename _Alloc1>
1136         friend bool
1137 	operator==(const unordered_map<_Key1, _Tp1, _Hash1, _Pred1, _Alloc1>&,
1138 		   const unordered_map<_Key1, _Tp1, _Hash1, _Pred1, _Alloc1>&);
1139     };
1140 
1141 #if __cpp_deduction_guides >= 201606
1142 
1143   template<typename _InputIterator,
1144 	   typename _Hash = hash<__iter_key_t<_InputIterator>>,
1145 	   typename _Pred = equal_to<__iter_key_t<_InputIterator>>,
1146 	   typename _Allocator = allocator<__iter_to_alloc_t<_InputIterator>>,
1147 	   typename = _RequireInputIter<_InputIterator>,
1148 	   typename = _RequireNotAllocatorOrIntegral<_Hash>,
1149 	   typename = _RequireNotAllocator<_Pred>,
1150 	   typename = _RequireAllocator<_Allocator>>
1151     unordered_map(_InputIterator, _InputIterator,
1152 		  typename unordered_map<int, int>::size_type = {},
1153 		  _Hash = _Hash(), _Pred = _Pred(), _Allocator = _Allocator())
1154     -> unordered_map<__iter_key_t<_InputIterator>,
1155 		     __iter_val_t<_InputIterator>,
1156 		     _Hash, _Pred, _Allocator>;
1157 
1158   template<typename _Key, typename _Tp, typename _Hash = hash<_Key>,
1159 	   typename _Pred = equal_to<_Key>,
1160 	   typename _Allocator = allocator<pair<const _Key, _Tp>>,
1161 	   typename = _RequireNotAllocatorOrIntegral<_Hash>,
1162 	   typename = _RequireNotAllocator<_Pred>,
1163 	   typename = _RequireAllocator<_Allocator>>
1164     unordered_map(initializer_list<pair<_Key, _Tp>>,
1165 		  typename unordered_map<int, int>::size_type = {},
1166 		  _Hash = _Hash(), _Pred = _Pred(), _Allocator = _Allocator())
1167     -> unordered_map<_Key, _Tp, _Hash, _Pred, _Allocator>;
1168 
1169   template<typename _InputIterator, typename _Allocator,
1170 	   typename = _RequireInputIter<_InputIterator>,
1171 	   typename = _RequireAllocator<_Allocator>>
1172     unordered_map(_InputIterator, _InputIterator,
1173 		  typename unordered_map<int, int>::size_type, _Allocator)
1174     -> unordered_map<__iter_key_t<_InputIterator>,
1175 		     __iter_val_t<_InputIterator>,
1176 		     hash<__iter_key_t<_InputIterator>>,
1177 		     equal_to<__iter_key_t<_InputIterator>>,
1178 		     _Allocator>;
1179 
1180   template<typename _InputIterator, typename _Allocator,
1181 	   typename = _RequireInputIter<_InputIterator>,
1182 	   typename = _RequireAllocator<_Allocator>>
1183     unordered_map(_InputIterator, _InputIterator, _Allocator)
1184     -> unordered_map<__iter_key_t<_InputIterator>,
1185 		     __iter_val_t<_InputIterator>,
1186 		     hash<__iter_key_t<_InputIterator>>,
1187 		     equal_to<__iter_key_t<_InputIterator>>,
1188 		     _Allocator>;
1189 
1190   template<typename _InputIterator, typename _Hash, typename _Allocator,
1191 	   typename = _RequireInputIter<_InputIterator>,
1192 	   typename = _RequireNotAllocatorOrIntegral<_Hash>,
1193 	   typename = _RequireAllocator<_Allocator>>
1194     unordered_map(_InputIterator, _InputIterator,
1195 		  typename unordered_map<int, int>::size_type,
1196 		  _Hash, _Allocator)
1197     -> unordered_map<__iter_key_t<_InputIterator>,
1198 		     __iter_val_t<_InputIterator>, _Hash,
1199 		     equal_to<__iter_key_t<_InputIterator>>, _Allocator>;
1200 
1201   template<typename _Key, typename _Tp, typename _Allocator,
1202 	   typename = _RequireAllocator<_Allocator>>
1203     unordered_map(initializer_list<pair<_Key, _Tp>>,
1204 		  typename unordered_map<int, int>::size_type,
1205 		  _Allocator)
1206     -> unordered_map<_Key, _Tp, hash<_Key>, equal_to<_Key>, _Allocator>;
1207 
1208   template<typename _Key, typename _Tp, typename _Allocator,
1209 	   typename = _RequireAllocator<_Allocator>>
1210     unordered_map(initializer_list<pair<_Key, _Tp>>, _Allocator)
1211     -> unordered_map<_Key, _Tp, hash<_Key>, equal_to<_Key>, _Allocator>;
1212 
1213   template<typename _Key, typename _Tp, typename _Hash, typename _Allocator,
1214 	   typename = _RequireNotAllocatorOrIntegral<_Hash>,
1215 	   typename = _RequireAllocator<_Allocator>>
1216     unordered_map(initializer_list<pair<_Key, _Tp>>,
1217 		  typename unordered_map<int, int>::size_type,
1218 		  _Hash, _Allocator)
1219     -> unordered_map<_Key, _Tp, _Hash, equal_to<_Key>, _Allocator>;
1220 
1221 #endif
1222 
1223   /**
1224    *  @brief A standard container composed of equivalent keys
1225    *  (possibly containing multiple of each key value) that associates
1226    *  values of another type with the keys.
1227    *
1228    *  @ingroup unordered_associative_containers
1229    *
1230    *  @tparam  _Key    Type of key objects.
1231    *  @tparam  _Tp     Type of mapped objects.
1232    *  @tparam  _Hash   Hashing function object type, defaults to hash<_Value>.
1233    *  @tparam  _Pred   Predicate function object type, defaults
1234    *                   to equal_to<_Value>.
1235    *  @tparam  _Alloc  Allocator type, defaults to
1236    *                   std::allocator<std::pair<const _Key, _Tp>>.
1237    *
1238    *  Meets the requirements of a <a href="tables.html#65">container</a>, and
1239    *  <a href="tables.html#xx">unordered associative container</a>
1240    *
1241    * The resulting value type of the container is std::pair<const _Key, _Tp>.
1242    *
1243    *  Base is _Hashtable, dispatched at compile time via template
1244    *  alias __ummap_hashtable.
1245    */
1246   template<typename _Key, typename _Tp,
1247 	   typename _Hash = hash<_Key>,
1248 	   typename _Pred = equal_to<_Key>,
1249 	   typename _Alloc = allocator<std::pair<const _Key, _Tp>>>
1250     class unordered_multimap
1251     {
1252       typedef __ummap_hashtable<_Key, _Tp, _Hash, _Pred, _Alloc>  _Hashtable;
1253       _Hashtable _M_h;
1254 
1255     public:
1256       // typedefs:
1257       //@{
1258       /// Public typedefs.
1259       typedef typename _Hashtable::key_type	key_type;
1260       typedef typename _Hashtable::value_type	value_type;
1261       typedef typename _Hashtable::mapped_type	mapped_type;
1262       typedef typename _Hashtable::hasher	hasher;
1263       typedef typename _Hashtable::key_equal	key_equal;
1264       typedef typename _Hashtable::allocator_type allocator_type;
1265       //@}
1266 
1267       //@{
1268       ///  Iterator-related typedefs.
1269       typedef typename _Hashtable::pointer		pointer;
1270       typedef typename _Hashtable::const_pointer	const_pointer;
1271       typedef typename _Hashtable::reference		reference;
1272       typedef typename _Hashtable::const_reference	const_reference;
1273       typedef typename _Hashtable::iterator		iterator;
1274       typedef typename _Hashtable::const_iterator	const_iterator;
1275       typedef typename _Hashtable::local_iterator	local_iterator;
1276       typedef typename _Hashtable::const_local_iterator	const_local_iterator;
1277       typedef typename _Hashtable::size_type		size_type;
1278       typedef typename _Hashtable::difference_type	difference_type;
1279       //@}
1280 
1281 #if __cplusplus > 201402L
1282       using node_type = typename _Hashtable::node_type;
1283 #endif
1284 
1285       //construct/destroy/copy
1286 
1287       /// Default constructor.
1288       unordered_multimap() = default;
1289 
1290       /**
1291        *  @brief  Default constructor creates no elements.
1292        *  @param __n  Mnimal initial number of buckets.
1293        *  @param __hf  A hash functor.
1294        *  @param __eql  A key equality functor.
1295        *  @param __a  An allocator object.
1296        */
1297       explicit
1298       unordered_multimap(size_type __n,
1299 			 const hasher& __hf = hasher(),
1300 			 const key_equal& __eql = key_equal(),
1301 			 const allocator_type& __a = allocator_type())
1302       : _M_h(__n, __hf, __eql, __a)
1303       { }
1304 
1305       /**
1306        *  @brief  Builds an %unordered_multimap from a range.
1307        *  @param  __first An input iterator.
1308        *  @param  __last  An input iterator.
1309        *  @param __n      Minimal initial number of buckets.
1310        *  @param __hf     A hash functor.
1311        *  @param __eql    A key equality functor.
1312        *  @param __a      An allocator object.
1313        *
1314        *  Create an %unordered_multimap consisting of copies of the elements
1315        *  from [__first,__last).  This is linear in N (where N is
1316        *  distance(__first,__last)).
1317        */
1318       template<typename _InputIterator>
1319 	unordered_multimap(_InputIterator __first, _InputIterator __last,
1320 			   size_type __n = 0,
1321 			   const hasher& __hf = hasher(),
1322 			   const key_equal& __eql = key_equal(),
1323 			   const allocator_type& __a = allocator_type())
1324 	: _M_h(__first, __last, __n, __hf, __eql, __a)
1325 	{ }
1326 
1327       /// Copy constructor.
1328       unordered_multimap(const unordered_multimap&) = default;
1329 
1330       /// Move constructor.
1331       unordered_multimap(unordered_multimap&&) = default;
1332 
1333       /**
1334        *  @brief Creates an %unordered_multimap with no elements.
1335        *  @param __a An allocator object.
1336        */
1337       explicit
1338       unordered_multimap(const allocator_type& __a)
1339       : _M_h(__a)
1340       { }
1341 
1342       /*
1343        *  @brief Copy constructor with allocator argument.
1344        * @param  __uset  Input %unordered_multimap to copy.
1345        * @param  __a  An allocator object.
1346        */
1347       unordered_multimap(const unordered_multimap& __ummap,
1348 			 const allocator_type& __a)
1349       : _M_h(__ummap._M_h, __a)
1350       { }
1351 
1352       /*
1353        *  @brief  Move constructor with allocator argument.
1354        *  @param  __uset Input %unordered_multimap to move.
1355        *  @param  __a    An allocator object.
1356        */
1357       unordered_multimap(unordered_multimap&& __ummap,
1358 			 const allocator_type& __a)
1359       : _M_h(std::move(__ummap._M_h), __a)
1360       { }
1361 
1362       /**
1363        *  @brief  Builds an %unordered_multimap from an initializer_list.
1364        *  @param  __l  An initializer_list.
1365        *  @param __n  Minimal initial number of buckets.
1366        *  @param __hf  A hash functor.
1367        *  @param __eql  A key equality functor.
1368        *  @param  __a  An allocator object.
1369        *
1370        *  Create an %unordered_multimap consisting of copies of the elements in
1371        *  the list. This is linear in N (where N is @a __l.size()).
1372        */
1373       unordered_multimap(initializer_list<value_type> __l,
1374 			 size_type __n = 0,
1375 			 const hasher& __hf = hasher(),
1376 			 const key_equal& __eql = key_equal(),
1377 			 const allocator_type& __a = allocator_type())
1378       : _M_h(__l, __n, __hf, __eql, __a)
1379       { }
1380 
1381       unordered_multimap(size_type __n, const allocator_type& __a)
1382       : unordered_multimap(__n, hasher(), key_equal(), __a)
1383       { }
1384 
1385       unordered_multimap(size_type __n, const hasher& __hf,
1386 			 const allocator_type& __a)
1387       : unordered_multimap(__n, __hf, key_equal(), __a)
1388       { }
1389 
1390       template<typename _InputIterator>
1391 	unordered_multimap(_InputIterator __first, _InputIterator __last,
1392 			   size_type __n,
1393 			   const allocator_type& __a)
1394 	: unordered_multimap(__first, __last, __n, hasher(), key_equal(), __a)
1395 	{ }
1396 
1397       template<typename _InputIterator>
1398 	unordered_multimap(_InputIterator __first, _InputIterator __last,
1399 			   size_type __n, const hasher& __hf,
1400 			   const allocator_type& __a)
1401 	: unordered_multimap(__first, __last, __n, __hf, key_equal(), __a)
1402 	{ }
1403 
1404       unordered_multimap(initializer_list<value_type> __l,
1405 			 size_type __n,
1406 			 const allocator_type& __a)
1407       : unordered_multimap(__l, __n, hasher(), key_equal(), __a)
1408       { }
1409 
1410       unordered_multimap(initializer_list<value_type> __l,
1411 			 size_type __n, const hasher& __hf,
1412 			 const allocator_type& __a)
1413       : unordered_multimap(__l, __n, __hf, key_equal(), __a)
1414       { }
1415 
1416       /// Copy assignment operator.
1417       unordered_multimap&
1418       operator=(const unordered_multimap&) = default;
1419 
1420       /// Move assignment operator.
1421       unordered_multimap&
1422       operator=(unordered_multimap&&) = default;
1423 
1424       /**
1425        *  @brief  %Unordered_multimap list assignment operator.
1426        *  @param  __l  An initializer_list.
1427        *
1428        *  This function fills an %unordered_multimap with copies of the
1429        *  elements in the initializer list @a __l.
1430        *
1431        *  Note that the assignment completely changes the %unordered_multimap
1432        *  and that the resulting %unordered_multimap's size is the same as the
1433        *  number of elements assigned.
1434        */
1435       unordered_multimap&
1436       operator=(initializer_list<value_type> __l)
1437       {
1438 	_M_h = __l;
1439 	return *this;
1440       }
1441 
1442       ///  Returns the allocator object used by the %unordered_multimap.
1443       allocator_type
1444       get_allocator() const noexcept
1445       { return _M_h.get_allocator(); }
1446 
1447       // size and capacity:
1448 
1449       ///  Returns true if the %unordered_multimap is empty.
1450       _GLIBCXX_NODISCARD bool
1451       empty() const noexcept
1452       { return _M_h.empty(); }
1453 
1454       ///  Returns the size of the %unordered_multimap.
1455       size_type
1456       size() const noexcept
1457       { return _M_h.size(); }
1458 
1459       ///  Returns the maximum size of the %unordered_multimap.
1460       size_type
1461       max_size() const noexcept
1462       { return _M_h.max_size(); }
1463 
1464       // iterators.
1465 
1466       /**
1467        *  Returns a read/write iterator that points to the first element in the
1468        *  %unordered_multimap.
1469        */
1470       iterator
1471       begin() noexcept
1472       { return _M_h.begin(); }
1473 
1474       //@{
1475       /**
1476        *  Returns a read-only (constant) iterator that points to the first
1477        *  element in the %unordered_multimap.
1478        */
1479       const_iterator
1480       begin() const noexcept
1481       { return _M_h.begin(); }
1482 
1483       const_iterator
1484       cbegin() const noexcept
1485       { return _M_h.begin(); }
1486       //@}
1487 
1488       /**
1489        *  Returns a read/write iterator that points one past the last element in
1490        *  the %unordered_multimap.
1491        */
1492       iterator
1493       end() noexcept
1494       { return _M_h.end(); }
1495 
1496       //@{
1497       /**
1498        *  Returns a read-only (constant) iterator that points one past the last
1499        *  element in the %unordered_multimap.
1500        */
1501       const_iterator
1502       end() const noexcept
1503       { return _M_h.end(); }
1504 
1505       const_iterator
1506       cend() const noexcept
1507       { return _M_h.end(); }
1508       //@}
1509 
1510       // modifiers.
1511 
1512       /**
1513        *  @brief Attempts to build and insert a std::pair into the
1514        *  %unordered_multimap.
1515        *
1516        *  @param __args  Arguments used to generate a new pair instance (see
1517        *	        std::piecewise_contruct for passing arguments to each
1518        *	        part of the pair constructor).
1519        *
1520        *  @return  An iterator that points to the inserted pair.
1521        *
1522        *  This function attempts to build and insert a (key, value) %pair into
1523        *  the %unordered_multimap.
1524        *
1525        *  Insertion requires amortized constant time.
1526        */
1527       template<typename... _Args>
1528 	iterator
1529 	emplace(_Args&&... __args)
1530 	{ return _M_h.emplace(std::forward<_Args>(__args)...); }
1531 
1532       /**
1533        *  @brief Attempts to build and insert a std::pair into the
1534        *  %unordered_multimap.
1535        *
1536        *  @param  __pos  An iterator that serves as a hint as to where the pair
1537        *                should be inserted.
1538        *  @param  __args  Arguments used to generate a new pair instance (see
1539        *	         std::piecewise_contruct for passing arguments to each
1540        *	         part of the pair constructor).
1541        *  @return An iterator that points to the element with key of the
1542        *          std::pair built from @a __args.
1543        *
1544        *  Note that the first parameter is only a hint and can potentially
1545        *  improve the performance of the insertion process. A bad hint would
1546        *  cause no gains in efficiency.
1547        *
1548        *  See
1549        *  https://gcc.gnu.org/onlinedocs/libstdc++/manual/associative.html#containers.associative.insert_hints
1550        *  for more on @a hinting.
1551        *
1552        *  Insertion requires amortized constant time.
1553        */
1554       template<typename... _Args>
1555 	iterator
1556 	emplace_hint(const_iterator __pos, _Args&&... __args)
1557 	{ return _M_h.emplace_hint(__pos, std::forward<_Args>(__args)...); }
1558 
1559       //@{
1560       /**
1561        *  @brief Inserts a std::pair into the %unordered_multimap.
1562        *  @param __x Pair to be inserted (see std::make_pair for easy
1563        *	     creation of pairs).
1564        *
1565        *  @return  An iterator that points to the inserted pair.
1566        *
1567        *  Insertion requires amortized constant time.
1568        */
1569       iterator
1570       insert(const value_type& __x)
1571       { return _M_h.insert(__x); }
1572 
1573       iterator
1574       insert(value_type&& __x)
1575       { return _M_h.insert(std::move(__x)); }
1576 
1577       template<typename _Pair>
1578 	__enable_if_t<is_constructible<value_type, _Pair&&>::value, iterator>
1579 	insert(_Pair&& __x)
1580         { return _M_h.emplace(std::forward<_Pair>(__x)); }
1581       //@}
1582 
1583       //@{
1584       /**
1585        *  @brief Inserts a std::pair into the %unordered_multimap.
1586        *  @param  __hint  An iterator that serves as a hint as to where the
1587        *                 pair should be inserted.
1588        *  @param  __x  Pair to be inserted (see std::make_pair for easy creation
1589        *               of pairs).
1590        *  @return An iterator that points to the element with key of
1591        *           @a __x (may or may not be the %pair passed in).
1592        *
1593        *  Note that the first parameter is only a hint and can potentially
1594        *  improve the performance of the insertion process.  A bad hint would
1595        *  cause no gains in efficiency.
1596        *
1597        *  See
1598        *  https://gcc.gnu.org/onlinedocs/libstdc++/manual/associative.html#containers.associative.insert_hints
1599        *  for more on @a hinting.
1600        *
1601        *  Insertion requires amortized constant time.
1602        */
1603       iterator
1604       insert(const_iterator __hint, const value_type& __x)
1605       { return _M_h.insert(__hint, __x); }
1606 
1607       // _GLIBCXX_RESOLVE_LIB_DEFECTS
1608       // 2354. Unnecessary copying when inserting into maps with braced-init
1609       iterator
1610       insert(const_iterator __hint, value_type&& __x)
1611       { return _M_h.insert(__hint, std::move(__x)); }
1612 
1613       template<typename _Pair>
1614 	__enable_if_t<is_constructible<value_type, _Pair&&>::value, iterator>
1615 	insert(const_iterator __hint, _Pair&& __x)
1616         { return _M_h.emplace_hint(__hint, std::forward<_Pair>(__x)); }
1617       //@}
1618 
1619       /**
1620        *  @brief A template function that attempts to insert a range of
1621        *  elements.
1622        *  @param  __first  Iterator pointing to the start of the range to be
1623        *                   inserted.
1624        *  @param  __last  Iterator pointing to the end of the range.
1625        *
1626        *  Complexity similar to that of the range constructor.
1627        */
1628       template<typename _InputIterator>
1629 	void
1630 	insert(_InputIterator __first, _InputIterator __last)
1631 	{ _M_h.insert(__first, __last); }
1632 
1633       /**
1634        *  @brief Attempts to insert a list of elements into the
1635        *  %unordered_multimap.
1636        *  @param  __l  A std::initializer_list<value_type> of elements
1637        *               to be inserted.
1638        *
1639        *  Complexity similar to that of the range constructor.
1640        */
1641       void
1642       insert(initializer_list<value_type> __l)
1643       { _M_h.insert(__l); }
1644 
1645 #if __cplusplus > 201402L
1646       /// Extract a node.
1647       node_type
1648       extract(const_iterator __pos)
1649       {
1650 	__glibcxx_assert(__pos != end());
1651 	return _M_h.extract(__pos);
1652       }
1653 
1654       /// Extract a node.
1655       node_type
1656       extract(const key_type& __key)
1657       { return _M_h.extract(__key); }
1658 
1659       /// Re-insert an extracted node.
1660       iterator
1661       insert(node_type&& __nh)
1662       { return _M_h._M_reinsert_node_multi(cend(), std::move(__nh)); }
1663 
1664       /// Re-insert an extracted node.
1665       iterator
1666       insert(const_iterator __hint, node_type&& __nh)
1667       { return _M_h._M_reinsert_node_multi(__hint, std::move(__nh)); }
1668 #endif // C++17
1669 
1670       //@{
1671       /**
1672        *  @brief Erases an element from an %unordered_multimap.
1673        *  @param  __position  An iterator pointing to the element to be erased.
1674        *  @return An iterator pointing to the element immediately following
1675        *          @a __position prior to the element being erased. If no such
1676        *          element exists, end() is returned.
1677        *
1678        *  This function erases an element, pointed to by the given iterator,
1679        *  from an %unordered_multimap.
1680        *  Note that this function only erases the element, and that if the
1681        *  element is itself a pointer, the pointed-to memory is not touched in
1682        *  any way.  Managing the pointer is the user's responsibility.
1683        */
1684       iterator
1685       erase(const_iterator __position)
1686       { return _M_h.erase(__position); }
1687 
1688       // LWG 2059.
1689       iterator
1690       erase(iterator __position)
1691       { return _M_h.erase(__position); }
1692       //@}
1693 
1694       /**
1695        *  @brief Erases elements according to the provided key.
1696        *  @param  __x  Key of elements to be erased.
1697        *  @return  The number of elements erased.
1698        *
1699        *  This function erases all the elements located by the given key from
1700        *  an %unordered_multimap.
1701        *  Note that this function only erases the element, and that if the
1702        *  element is itself a pointer, the pointed-to memory is not touched in
1703        *  any way.  Managing the pointer is the user's responsibility.
1704        */
1705       size_type
1706       erase(const key_type& __x)
1707       { return _M_h.erase(__x); }
1708 
1709       /**
1710        *  @brief Erases a [__first,__last) range of elements from an
1711        *  %unordered_multimap.
1712        *  @param  __first  Iterator pointing to the start of the range to be
1713        *                  erased.
1714        *  @param __last  Iterator pointing to the end of the range to
1715        *                be erased.
1716        *  @return The iterator @a __last.
1717        *
1718        *  This function erases a sequence of elements from an
1719        *  %unordered_multimap.
1720        *  Note that this function only erases the elements, and that if
1721        *  the element is itself a pointer, the pointed-to memory is not touched
1722        *  in any way.  Managing the pointer is the user's responsibility.
1723        */
1724       iterator
1725       erase(const_iterator __first, const_iterator __last)
1726       { return _M_h.erase(__first, __last); }
1727 
1728       /**
1729        *  Erases all elements in an %unordered_multimap.
1730        *  Note that this function only erases the elements, and that if the
1731        *  elements themselves are pointers, the pointed-to memory is not touched
1732        *  in any way.  Managing the pointer is the user's responsibility.
1733        */
1734       void
1735       clear() noexcept
1736       { _M_h.clear(); }
1737 
1738       /**
1739        *  @brief  Swaps data with another %unordered_multimap.
1740        *  @param  __x  An %unordered_multimap of the same element and allocator
1741        *  types.
1742        *
1743        *  This exchanges the elements between two %unordered_multimap in
1744        *  constant time.
1745        *  Note that the global std::swap() function is specialized such that
1746        *  std::swap(m1,m2) will feed to this function.
1747        */
1748       void
1749       swap(unordered_multimap& __x)
1750       noexcept( noexcept(_M_h.swap(__x._M_h)) )
1751       { _M_h.swap(__x._M_h); }
1752 
1753 #if __cplusplus > 201402L
1754       template<typename, typename, typename>
1755 	friend class std::_Hash_merge_helper;
1756 
1757       template<typename _H2, typename _P2>
1758 	void
1759 	merge(unordered_multimap<_Key, _Tp, _H2, _P2, _Alloc>& __source)
1760 	{
1761 	  using _Merge_helper
1762 	    = _Hash_merge_helper<unordered_multimap, _H2, _P2>;
1763 	  _M_h._M_merge_multi(_Merge_helper::_S_get_table(__source));
1764 	}
1765 
1766       template<typename _H2, typename _P2>
1767 	void
1768 	merge(unordered_multimap<_Key, _Tp, _H2, _P2, _Alloc>&& __source)
1769 	{ merge(__source); }
1770 
1771       template<typename _H2, typename _P2>
1772 	void
1773 	merge(unordered_map<_Key, _Tp, _H2, _P2, _Alloc>& __source)
1774 	{
1775 	  using _Merge_helper
1776 	    = _Hash_merge_helper<unordered_multimap, _H2, _P2>;
1777 	  _M_h._M_merge_multi(_Merge_helper::_S_get_table(__source));
1778 	}
1779 
1780       template<typename _H2, typename _P2>
1781 	void
1782 	merge(unordered_map<_Key, _Tp, _H2, _P2, _Alloc>&& __source)
1783 	{ merge(__source); }
1784 #endif // C++17
1785 
1786       // observers.
1787 
1788       ///  Returns the hash functor object with which the %unordered_multimap
1789       ///  was constructed.
1790       hasher
1791       hash_function() const
1792       { return _M_h.hash_function(); }
1793 
1794       ///  Returns the key comparison object with which the %unordered_multimap
1795       ///  was constructed.
1796       key_equal
1797       key_eq() const
1798       { return _M_h.key_eq(); }
1799 
1800       // lookup.
1801 
1802       //@{
1803       /**
1804        *  @brief Tries to locate an element in an %unordered_multimap.
1805        *  @param  __x  Key to be located.
1806        *  @return  Iterator pointing to sought-after element, or end() if not
1807        *           found.
1808        *
1809        *  This function takes a key and tries to locate the element with which
1810        *  the key matches.  If successful the function returns an iterator
1811        *  pointing to the sought after element.  If unsuccessful it returns the
1812        *  past-the-end ( @c end() ) iterator.
1813        */
1814       iterator
1815       find(const key_type& __x)
1816       { return _M_h.find(__x); }
1817 
1818       const_iterator
1819       find(const key_type& __x) const
1820       { return _M_h.find(__x); }
1821       //@}
1822 
1823       /**
1824        *  @brief  Finds the number of elements.
1825        *  @param  __x  Key to count.
1826        *  @return  Number of elements with specified key.
1827        */
1828       size_type
1829       count(const key_type& __x) const
1830       { return _M_h.count(__x); }
1831 
1832 #if __cplusplus > 201703L
1833       /**
1834        *  @brief  Finds whether an element with the given key exists.
1835        *  @param  __x  Key of elements to be located.
1836        *  @return  True if there is any element with the specified key.
1837        */
1838       bool
1839       contains(const key_type& __x) const
1840       { return _M_h.find(__x) != _M_h.end(); }
1841 #endif
1842 
1843       //@{
1844       /**
1845        *  @brief Finds a subsequence matching given key.
1846        *  @param  __x  Key to be located.
1847        *  @return  Pair of iterators that possibly points to the subsequence
1848        *           matching given key.
1849        */
1850       std::pair<iterator, iterator>
1851       equal_range(const key_type& __x)
1852       { return _M_h.equal_range(__x); }
1853 
1854       std::pair<const_iterator, const_iterator>
1855       equal_range(const key_type& __x) const
1856       { return _M_h.equal_range(__x); }
1857       //@}
1858 
1859       // bucket interface.
1860 
1861       /// Returns the number of buckets of the %unordered_multimap.
1862       size_type
1863       bucket_count() const noexcept
1864       { return _M_h.bucket_count(); }
1865 
1866       /// Returns the maximum number of buckets of the %unordered_multimap.
1867       size_type
1868       max_bucket_count() const noexcept
1869       { return _M_h.max_bucket_count(); }
1870 
1871       /*
1872        * @brief  Returns the number of elements in a given bucket.
1873        * @param  __n  A bucket index.
1874        * @return  The number of elements in the bucket.
1875        */
1876       size_type
1877       bucket_size(size_type __n) const
1878       { return _M_h.bucket_size(__n); }
1879 
1880       /*
1881        * @brief  Returns the bucket index of a given element.
1882        * @param  __key  A key instance.
1883        * @return  The key bucket index.
1884        */
1885       size_type
1886       bucket(const key_type& __key) const
1887       { return _M_h.bucket(__key); }
1888 
1889       /**
1890        *  @brief  Returns a read/write iterator pointing to the first bucket
1891        *         element.
1892        *  @param  __n The bucket index.
1893        *  @return  A read/write local iterator.
1894        */
1895       local_iterator
1896       begin(size_type __n)
1897       { return _M_h.begin(__n); }
1898 
1899       //@{
1900       /**
1901        *  @brief  Returns a read-only (constant) iterator pointing to the first
1902        *         bucket element.
1903        *  @param  __n The bucket index.
1904        *  @return  A read-only local iterator.
1905        */
1906       const_local_iterator
1907       begin(size_type __n) const
1908       { return _M_h.begin(__n); }
1909 
1910       const_local_iterator
1911       cbegin(size_type __n) const
1912       { return _M_h.cbegin(__n); }
1913       //@}
1914 
1915       /**
1916        *  @brief  Returns a read/write iterator pointing to one past the last
1917        *         bucket elements.
1918        *  @param  __n The bucket index.
1919        *  @return  A read/write local iterator.
1920        */
1921       local_iterator
1922       end(size_type __n)
1923       { return _M_h.end(__n); }
1924 
1925       //@{
1926       /**
1927        *  @brief  Returns a read-only (constant) iterator pointing to one past
1928        *         the last bucket elements.
1929        *  @param  __n The bucket index.
1930        *  @return  A read-only local iterator.
1931        */
1932       const_local_iterator
1933       end(size_type __n) const
1934       { return _M_h.end(__n); }
1935 
1936       const_local_iterator
1937       cend(size_type __n) const
1938       { return _M_h.cend(__n); }
1939       //@}
1940 
1941       // hash policy.
1942 
1943       /// Returns the average number of elements per bucket.
1944       float
1945       load_factor() const noexcept
1946       { return _M_h.load_factor(); }
1947 
1948       /// Returns a positive number that the %unordered_multimap tries to keep
1949       /// the load factor less than or equal to.
1950       float
1951       max_load_factor() const noexcept
1952       { return _M_h.max_load_factor(); }
1953 
1954       /**
1955        *  @brief  Change the %unordered_multimap maximum load factor.
1956        *  @param  __z The new maximum load factor.
1957        */
1958       void
1959       max_load_factor(float __z)
1960       { _M_h.max_load_factor(__z); }
1961 
1962       /**
1963        *  @brief  May rehash the %unordered_multimap.
1964        *  @param  __n The new number of buckets.
1965        *
1966        *  Rehash will occur only if the new number of buckets respect the
1967        *  %unordered_multimap maximum load factor.
1968        */
1969       void
1970       rehash(size_type __n)
1971       { _M_h.rehash(__n); }
1972 
1973       /**
1974        *  @brief  Prepare the %unordered_multimap for a specified number of
1975        *          elements.
1976        *  @param  __n Number of elements required.
1977        *
1978        *  Same as rehash(ceil(n / max_load_factor())).
1979        */
1980       void
1981       reserve(size_type __n)
1982       { _M_h.reserve(__n); }
1983 
1984       template<typename _Key1, typename _Tp1, typename _Hash1, typename _Pred1,
1985 	       typename _Alloc1>
1986         friend bool
1987 	operator==(const unordered_multimap<_Key1, _Tp1,
1988 					    _Hash1, _Pred1, _Alloc1>&,
1989 		   const unordered_multimap<_Key1, _Tp1,
1990 					    _Hash1, _Pred1, _Alloc1>&);
1991     };
1992 
1993 #if __cpp_deduction_guides >= 201606
1994 
1995   template<typename _InputIterator,
1996 	   typename _Hash = hash<__iter_key_t<_InputIterator>>,
1997 	   typename _Pred = equal_to<__iter_key_t<_InputIterator>>,
1998 	   typename _Allocator = allocator<__iter_to_alloc_t<_InputIterator>>,
1999 	   typename = _RequireInputIter<_InputIterator>,
2000 	   typename = _RequireNotAllocatorOrIntegral<_Hash>,
2001 	   typename = _RequireNotAllocator<_Pred>,
2002 	   typename = _RequireAllocator<_Allocator>>
2003     unordered_multimap(_InputIterator, _InputIterator,
2004 		       unordered_multimap<int, int>::size_type = {},
2005 		       _Hash = _Hash(), _Pred = _Pred(),
2006 		       _Allocator = _Allocator())
2007     -> unordered_multimap<__iter_key_t<_InputIterator>,
2008 			  __iter_val_t<_InputIterator>, _Hash, _Pred,
2009 			  _Allocator>;
2010 
2011   template<typename _Key, typename _Tp, typename _Hash = hash<_Key>,
2012 	   typename _Pred = equal_to<_Key>,
2013 	   typename _Allocator = allocator<pair<const _Key, _Tp>>,
2014 	   typename = _RequireNotAllocatorOrIntegral<_Hash>,
2015 	   typename = _RequireNotAllocator<_Pred>,
2016 	   typename = _RequireAllocator<_Allocator>>
2017     unordered_multimap(initializer_list<pair<_Key, _Tp>>,
2018 		       unordered_multimap<int, int>::size_type = {},
2019 		       _Hash = _Hash(), _Pred = _Pred(),
2020 		       _Allocator = _Allocator())
2021     -> unordered_multimap<_Key, _Tp, _Hash, _Pred, _Allocator>;
2022 
2023   template<typename _InputIterator, typename _Allocator,
2024 	   typename = _RequireInputIter<_InputIterator>,
2025 	   typename = _RequireAllocator<_Allocator>>
2026     unordered_multimap(_InputIterator, _InputIterator,
2027 		       unordered_multimap<int, int>::size_type, _Allocator)
2028     -> unordered_multimap<__iter_key_t<_InputIterator>,
2029 			  __iter_val_t<_InputIterator>,
2030 			  hash<__iter_key_t<_InputIterator>>,
2031 			  equal_to<__iter_key_t<_InputIterator>>, _Allocator>;
2032 
2033   template<typename _InputIterator, typename _Allocator,
2034 	   typename = _RequireInputIter<_InputIterator>,
2035 	   typename = _RequireAllocator<_Allocator>>
2036     unordered_multimap(_InputIterator, _InputIterator, _Allocator)
2037     -> unordered_multimap<__iter_key_t<_InputIterator>,
2038 			  __iter_val_t<_InputIterator>,
2039 			  hash<__iter_key_t<_InputIterator>>,
2040 			  equal_to<__iter_key_t<_InputIterator>>, _Allocator>;
2041 
2042   template<typename _InputIterator, typename _Hash, typename _Allocator,
2043 	   typename = _RequireInputIter<_InputIterator>,
2044 	   typename = _RequireNotAllocatorOrIntegral<_Hash>,
2045 	   typename = _RequireAllocator<_Allocator>>
2046     unordered_multimap(_InputIterator, _InputIterator,
2047 		       unordered_multimap<int, int>::size_type, _Hash,
2048 		       _Allocator)
2049     -> unordered_multimap<__iter_key_t<_InputIterator>,
2050 			  __iter_val_t<_InputIterator>, _Hash,
2051 			  equal_to<__iter_key_t<_InputIterator>>, _Allocator>;
2052 
2053   template<typename _Key, typename _Tp, typename _Allocator,
2054 	   typename = _RequireAllocator<_Allocator>>
2055     unordered_multimap(initializer_list<pair<_Key, _Tp>>,
2056 		       unordered_multimap<int, int>::size_type,
2057 		       _Allocator)
2058     -> unordered_multimap<_Key, _Tp, hash<_Key>, equal_to<_Key>, _Allocator>;
2059 
2060   template<typename _Key, typename _Tp, typename _Allocator,
2061 	   typename = _RequireAllocator<_Allocator>>
2062     unordered_multimap(initializer_list<pair<_Key, _Tp>>, _Allocator)
2063     -> unordered_multimap<_Key, _Tp, hash<_Key>, equal_to<_Key>, _Allocator>;
2064 
2065   template<typename _Key, typename _Tp, typename _Hash, typename _Allocator,
2066 	   typename = _RequireNotAllocatorOrIntegral<_Hash>,
2067 	   typename = _RequireAllocator<_Allocator>>
2068     unordered_multimap(initializer_list<pair<_Key, _Tp>>,
2069 		       unordered_multimap<int, int>::size_type,
2070 		       _Hash, _Allocator)
2071     -> unordered_multimap<_Key, _Tp, _Hash, equal_to<_Key>, _Allocator>;
2072 
2073 #endif
2074 
2075   template<class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2076     inline void
2077     swap(unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
2078 	 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
2079     noexcept(noexcept(__x.swap(__y)))
2080     { __x.swap(__y); }
2081 
2082   template<class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2083     inline void
2084     swap(unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
2085 	 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
2086     noexcept(noexcept(__x.swap(__y)))
2087     { __x.swap(__y); }
2088 
2089   template<class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2090     inline bool
2091     operator==(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
2092 	       const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
2093     { return __x._M_h._M_equal(__y._M_h); }
2094 
2095   template<class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2096     inline bool
2097     operator!=(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
2098 	       const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
2099     { return !(__x == __y); }
2100 
2101   template<class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2102     inline bool
2103     operator==(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
2104 	       const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
2105     { return __x._M_h._M_equal(__y._M_h); }
2106 
2107   template<class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2108     inline bool
2109     operator!=(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
2110 	       const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
2111     { return !(__x == __y); }
2112 
2113 _GLIBCXX_END_NAMESPACE_CONTAINER
2114 
2115 #if __cplusplus > 201402L
2116   // Allow std::unordered_map access to internals of compatible maps.
2117   template<typename _Key, typename _Val, typename _Hash1, typename _Eq1,
2118 	   typename _Alloc, typename _Hash2, typename _Eq2>
2119     struct _Hash_merge_helper<
2120       _GLIBCXX_STD_C::unordered_map<_Key, _Val, _Hash1, _Eq1, _Alloc>,
2121       _Hash2, _Eq2>
2122     {
2123     private:
2124       template<typename... _Tp>
2125 	using unordered_map = _GLIBCXX_STD_C::unordered_map<_Tp...>;
2126       template<typename... _Tp>
2127 	using unordered_multimap = _GLIBCXX_STD_C::unordered_multimap<_Tp...>;
2128 
2129       friend unordered_map<_Key, _Val, _Hash1, _Eq1, _Alloc>;
2130 
2131       static auto&
2132       _S_get_table(unordered_map<_Key, _Val, _Hash2, _Eq2, _Alloc>& __map)
2133       { return __map._M_h; }
2134 
2135       static auto&
2136       _S_get_table(unordered_multimap<_Key, _Val, _Hash2, _Eq2, _Alloc>& __map)
2137       { return __map._M_h; }
2138     };
2139 
2140   // Allow std::unordered_multimap access to internals of compatible maps.
2141   template<typename _Key, typename _Val, typename _Hash1, typename _Eq1,
2142 	   typename _Alloc, typename _Hash2, typename _Eq2>
2143     struct _Hash_merge_helper<
2144       _GLIBCXX_STD_C::unordered_multimap<_Key, _Val, _Hash1, _Eq1, _Alloc>,
2145       _Hash2, _Eq2>
2146     {
2147     private:
2148       template<typename... _Tp>
2149 	using unordered_map = _GLIBCXX_STD_C::unordered_map<_Tp...>;
2150       template<typename... _Tp>
2151 	using unordered_multimap = _GLIBCXX_STD_C::unordered_multimap<_Tp...>;
2152 
2153       friend unordered_multimap<_Key, _Val, _Hash1, _Eq1, _Alloc>;
2154 
2155       static auto&
2156       _S_get_table(unordered_map<_Key, _Val, _Hash2, _Eq2, _Alloc>& __map)
2157       { return __map._M_h; }
2158 
2159       static auto&
2160       _S_get_table(unordered_multimap<_Key, _Val, _Hash2, _Eq2, _Alloc>& __map)
2161       { return __map._M_h; }
2162     };
2163 #endif // C++17
2164 
2165 _GLIBCXX_END_NAMESPACE_VERSION
2166 } // namespace std
2167 
2168 #endif /* _UNORDERED_MAP_H */
2169