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