Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. // unordered_map implementation -*- C++ -*-
  2.  
  3. // Copyright (C) 2010-2015 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_CONTAINER
  36.  
  37.   /// Base types for unordered_map.
  38.   template<bool _Cache>
  39.     using __umap_traits = __detail::_Hashtable_traits<_Cache, false, true>;
  40.  
  41.   template<typename _Key,
  42.            typename _Tp,
  43.            typename _Hash = hash<_Key>,
  44.            typename _Pred = std::equal_to<_Key>,
  45.            typename _Alloc = std::allocator<std::pair<const _Key, _Tp> >,
  46.            typename _Tr = __umap_traits<__cache_default<_Key, _Hash>::value>>
  47.     using __umap_hashtable = _Hashtable<_Key, std::pair<const _Key, _Tp>,
  48.                                         _Alloc, __detail::_Select1st,
  49.                                         _Pred, _Hash,
  50.                                         __detail::_Mod_range_hashing,
  51.                                         __detail::_Default_ranged_hash,
  52.                                         __detail::_Prime_rehash_policy, _Tr>;
  53.  
  54.   /// Base types for unordered_multimap.
  55.   template<bool _Cache>
  56.     using __ummap_traits = __detail::_Hashtable_traits<_Cache, false, false>;
  57.  
  58.   template<typename _Key,
  59.            typename _Tp,
  60.            typename _Hash = hash<_Key>,
  61.            typename _Pred = std::equal_to<_Key>,
  62.            typename _Alloc = std::allocator<std::pair<const _Key, _Tp> >,
  63.            typename _Tr = __ummap_traits<__cache_default<_Key, _Hash>::value>>
  64.     using __ummap_hashtable = _Hashtable<_Key, std::pair<const _Key, _Tp>,
  65.                                          _Alloc, __detail::_Select1st,
  66.                                          _Pred, _Hash,
  67.                                          __detail::_Mod_range_hashing,
  68.                                          __detail::_Default_ranged_hash,
  69.                                          __detail::_Prime_rehash_policy, _Tr>;
  70.  
  71.   /**
  72.    *  @brief A standard container composed of unique keys (containing
  73.    *  at most one of each key value) that associates values of another type
  74.    *  with the keys.
  75.    *
  76.    *  @ingroup unordered_associative_containers
  77.    *
  78.    *  @tparam  _Key    Type of key objects.
  79.    *  @tparam  _Tp     Type of mapped objects.
  80.    *  @tparam  _Hash   Hashing function object type, defaults to hash<_Value>.
  81.    *  @tparam  _Pred   Predicate function object type, defaults
  82.    *                   to equal_to<_Value>.
  83.    *  @tparam  _Alloc  Allocator type, defaults to
  84.    *                   std::allocator<std::pair<const _Key, _Tp>>.
  85.    *
  86.    *  Meets the requirements of a <a href="tables.html#65">container</a>, and
  87.    *  <a href="tables.html#xx">unordered associative container</a>
  88.    *
  89.    * The resulting value type of the container is std::pair<const _Key, _Tp>.
  90.    *
  91.    *  Base is _Hashtable, dispatched at compile time via template
  92.    *  alias __umap_hashtable.
  93.    */
  94.   template<class _Key, class _Tp,
  95.            class _Hash = hash<_Key>,
  96.            class _Pred = std::equal_to<_Key>,
  97.            class _Alloc = std::allocator<std::pair<const _Key, _Tp> > >
  98.     class unordered_map
  99.     {
  100.       typedef __umap_hashtable<_Key, _Tp, _Hash, _Pred, _Alloc>  _Hashtable;
  101.       _Hashtable _M_h;
  102.  
  103.     public:
  104.       // typedefs:
  105.       //@{
  106.       /// Public typedefs.
  107.       typedef typename _Hashtable::key_type     key_type;
  108.       typedef typename _Hashtable::value_type   value_type;
  109.       typedef typename _Hashtable::mapped_type  mapped_type;
  110.       typedef typename _Hashtable::hasher       hasher;
  111.       typedef typename _Hashtable::key_equal    key_equal;
  112.       typedef typename _Hashtable::allocator_type allocator_type;
  113.       //@}
  114.  
  115.       //@{
  116.       ///  Iterator-related typedefs.
  117.       typedef typename _Hashtable::pointer              pointer;
  118.       typedef typename _Hashtable::const_pointer        const_pointer;
  119.       typedef typename _Hashtable::reference            reference;
  120.       typedef typename _Hashtable::const_reference      const_reference;
  121.       typedef typename _Hashtable::iterator             iterator;
  122.       typedef typename _Hashtable::const_iterator       const_iterator;
  123.       typedef typename _Hashtable::local_iterator       local_iterator;
  124.       typedef typename _Hashtable::const_local_iterator const_local_iterator;
  125.       typedef typename _Hashtable::size_type            size_type;
  126.       typedef typename _Hashtable::difference_type      difference_type;
  127.       //@}
  128.  
  129.       //construct/destroy/copy
  130.  
  131.       /// Default constructor.
  132.       unordered_map() = default;
  133.  
  134.       /**
  135.        *  @brief  Default constructor creates no elements.
  136.        *  @param __n  Minimal initial number of buckets.
  137.        *  @param __hf  A hash functor.
  138.        *  @param __eql  A key equality functor.
  139.        *  @param __a  An allocator object.
  140.        */
  141.       explicit
  142.       unordered_map(size_type __n,
  143.                     const hasher& __hf = hasher(),
  144.                     const key_equal& __eql = key_equal(),
  145.                     const allocator_type& __a = allocator_type())
  146.       : _M_h(__n, __hf, __eql, __a)
  147.       { }
  148.  
  149.       /**
  150.        *  @brief  Builds an %unordered_map from a range.
  151.        *  @param  __first  An input iterator.
  152.        *  @param  __last  An input iterator.
  153.        *  @param __n  Minimal initial number of buckets.
  154.        *  @param __hf  A hash functor.
  155.        *  @param __eql  A key equality functor.
  156.        *  @param __a  An allocator object.
  157.        *
  158.        *  Create an %unordered_map consisting of copies of the elements from
  159.        *  [__first,__last).  This is linear in N (where N is
  160.        *  distance(__first,__last)).
  161.        */
  162.       template<typename _InputIterator>
  163.         unordered_map(_InputIterator __first, _InputIterator __last,
  164.                       size_type __n = 0,
  165.                       const hasher& __hf = hasher(),
  166.                       const key_equal& __eql = key_equal(),
  167.                       const allocator_type& __a = allocator_type())
  168.         : _M_h(__first, __last, __n, __hf, __eql, __a)
  169.         { }
  170.  
  171.       /// Copy constructor.
  172.       unordered_map(const unordered_map&) = default;
  173.  
  174.       /// Move constructor.
  175.       unordered_map(unordered_map&&) = default;
  176.  
  177.       /**
  178.        *  @brief Creates an %unordered_map with no elements.
  179.        *  @param __a An allocator object.
  180.        */
  181.       explicit
  182.       unordered_map(const allocator_type& __a)
  183.         : _M_h(__a)
  184.       { }
  185.  
  186.       /*
  187.        *  @brief Copy constructor with allocator argument.
  188.        * @param  __uset  Input %unordered_map to copy.
  189.        * @param  __a  An allocator object.
  190.        */
  191.       unordered_map(const unordered_map& __umap,
  192.                     const allocator_type& __a)
  193.       : _M_h(__umap._M_h, __a)
  194.       { }
  195.  
  196.       /*
  197.        *  @brief  Move constructor with allocator argument.
  198.        *  @param  __uset Input %unordered_map to move.
  199.        *  @param  __a    An allocator object.
  200.        */
  201.       unordered_map(unordered_map&& __umap,
  202.                     const allocator_type& __a)
  203.       : _M_h(std::move(__umap._M_h), __a)
  204.       { }
  205.  
  206.       /**
  207.        *  @brief  Builds an %unordered_map from an initializer_list.
  208.        *  @param  __l  An initializer_list.
  209.        *  @param __n  Minimal initial number of buckets.
  210.        *  @param __hf  A hash functor.
  211.        *  @param __eql  A key equality functor.
  212.        *  @param  __a  An allocator object.
  213.        *
  214.        *  Create an %unordered_map consisting of copies of the elements in the
  215.        *  list. This is linear in N (where N is @a __l.size()).
  216.        */
  217.       unordered_map(initializer_list<value_type> __l,
  218.                     size_type __n = 0,
  219.                     const hasher& __hf = hasher(),
  220.                     const key_equal& __eql = key_equal(),
  221.                     const allocator_type& __a = allocator_type())
  222.       : _M_h(__l, __n, __hf, __eql, __a)
  223.       { }
  224.  
  225.       unordered_map(size_type __n, const allocator_type& __a)
  226.       : unordered_map(__n, hasher(), key_equal(), __a)
  227.       { }
  228.  
  229.       unordered_map(size_type __n, const hasher& __hf,
  230.                     const allocator_type& __a)
  231.       : unordered_map(__n, __hf, key_equal(), __a)
  232.       { }
  233.  
  234.       template<typename _InputIterator>
  235.         unordered_map(_InputIterator __first, _InputIterator __last,
  236.                       size_type __n,
  237.                       const allocator_type& __a)
  238.         : unordered_map(__first, __last, __n, hasher(), key_equal(), __a)
  239.         { }
  240.  
  241.       template<typename _InputIterator>
  242.         unordered_map(_InputIterator __first, _InputIterator __last,
  243.                       size_type __n, const hasher& __hf,
  244.                       const allocator_type& __a)
  245.           : unordered_map(__first, __last, __n, __hf, key_equal(), __a)
  246.         { }
  247.  
  248.       unordered_map(initializer_list<value_type> __l,
  249.                     size_type __n,
  250.                     const allocator_type& __a)
  251.       : unordered_map(__l, __n, hasher(), key_equal(), __a)
  252.       { }
  253.  
  254.       unordered_map(initializer_list<value_type> __l,
  255.                     size_type __n, const hasher& __hf,
  256.                     const allocator_type& __a)
  257.       : unordered_map(__l, __n, __hf, key_equal(), __a)
  258.       { }
  259.  
  260.       /// Copy assignment operator.
  261.       unordered_map&
  262.       operator=(const unordered_map&) = default;
  263.  
  264.       /// Move assignment operator.
  265.       unordered_map&
  266.       operator=(unordered_map&&) = default;
  267.  
  268.       /**
  269.        *  @brief  %Unordered_map list assignment operator.
  270.        *  @param  __l  An initializer_list.
  271.        *
  272.        *  This function fills an %unordered_map with copies of the elements in
  273.        *  the initializer list @a __l.
  274.        *
  275.        *  Note that the assignment completely changes the %unordered_map and
  276.        *  that the resulting %unordered_map's size is the same as the number
  277.        *  of elements assigned.  Old data may be lost.
  278.        */
  279.       unordered_map&
  280.       operator=(initializer_list<value_type> __l)
  281.       {
  282.         _M_h = __l;
  283.         return *this;
  284.       }
  285.  
  286.       ///  Returns the allocator object with which the %unordered_map was
  287.       ///  constructed.
  288.       allocator_type
  289.       get_allocator() const noexcept
  290.       { return _M_h.get_allocator(); }
  291.  
  292.       // size and capacity:
  293.  
  294.       ///  Returns true if the %unordered_map is empty.
  295.       bool
  296.       empty() const noexcept
  297.       { return _M_h.empty(); }
  298.  
  299.       ///  Returns the size of the %unordered_map.
  300.       size_type
  301.       size() const noexcept
  302.       { return _M_h.size(); }
  303.  
  304.       ///  Returns the maximum size of the %unordered_map.
  305.       size_type
  306.       max_size() const noexcept
  307.       { return _M_h.max_size(); }
  308.  
  309.       // iterators.
  310.  
  311.       /**
  312.        *  Returns a read/write iterator that points to the first element in the
  313.        *  %unordered_map.
  314.        */
  315.       iterator
  316.       begin() noexcept
  317.       { return _M_h.begin(); }
  318.  
  319.       //@{
  320.       /**
  321.        *  Returns a read-only (constant) iterator that points to the first
  322.        *  element in the %unordered_map.
  323.        */
  324.       const_iterator
  325.       begin() const noexcept
  326.       { return _M_h.begin(); }
  327.  
  328.       const_iterator
  329.       cbegin() const noexcept
  330.       { return _M_h.begin(); }
  331.       //@}
  332.  
  333.       /**
  334.        *  Returns a read/write iterator that points one past the last element in
  335.        *  the %unordered_map.
  336.        */
  337.       iterator
  338.       end() noexcept
  339.       { return _M_h.end(); }
  340.  
  341.       //@{
  342.       /**
  343.        *  Returns a read-only (constant) iterator that points one past the last
  344.        *  element in the %unordered_map.
  345.        */
  346.       const_iterator
  347.       end() const noexcept
  348.       { return _M_h.end(); }
  349.  
  350.       const_iterator
  351.       cend() const noexcept
  352.       { return _M_h.end(); }
  353.       //@}
  354.  
  355.       // modifiers.
  356.  
  357.       /**
  358.        *  @brief Attempts to build and insert a std::pair into the
  359.        *  %unordered_map.
  360.        *
  361.        *  @param __args  Arguments used to generate a new pair instance (see
  362.        *                std::piecewise_contruct for passing arguments to each
  363.        *                part of the pair constructor).
  364.        *
  365.        *  @return  A pair, of which the first element is an iterator that points
  366.        *           to the possibly inserted pair, and the second is a bool that
  367.        *           is true if the pair was actually inserted.
  368.        *
  369.        *  This function attempts to build and insert a (key, value) %pair into
  370.        *  the %unordered_map.
  371.        *  An %unordered_map relies on unique keys and thus a %pair is only
  372.        *  inserted if its first element (the key) is not already present in the
  373.        *  %unordered_map.
  374.        *
  375.        *  Insertion requires amortized constant time.
  376.        */
  377.       template<typename... _Args>
  378.         std::pair<iterator, bool>
  379.         emplace(_Args&&... __args)
  380.         { return _M_h.emplace(std::forward<_Args>(__args)...); }
  381.  
  382.       /**
  383.        *  @brief Attempts to build and insert a std::pair into the
  384.        *  %unordered_map.
  385.        *
  386.        *  @param  __pos  An iterator that serves as a hint as to where the pair
  387.        *                should be inserted.
  388.        *  @param  __args  Arguments used to generate a new pair instance (see
  389.        *                 std::piecewise_contruct for passing arguments to each
  390.        *                 part of the pair constructor).
  391.        *  @return An iterator that points to the element with key of the
  392.        *          std::pair built from @a __args (may or may not be that
  393.        *          std::pair).
  394.        *
  395.        *  This function is not concerned about whether the insertion took place,
  396.        *  and thus does not return a boolean like the single-argument emplace()
  397.        *  does.
  398.        *  Note that the first parameter is only a hint and can potentially
  399.        *  improve the performance of the insertion process. A bad hint would
  400.        *  cause no gains in efficiency.
  401.        *
  402.        *  See
  403.        *  https://gcc.gnu.org/onlinedocs/libstdc++/manual/associative.html#containers.associative.insert_hints
  404.        *  for more on @a hinting.
  405.        *
  406.        *  Insertion requires amortized constant time.
  407.        */
  408.       template<typename... _Args>
  409.         iterator
  410.         emplace_hint(const_iterator __pos, _Args&&... __args)
  411.         { return _M_h.emplace_hint(__pos, std::forward<_Args>(__args)...); }
  412.  
  413.       //@{
  414.       /**
  415.        *  @brief Attempts to insert a std::pair into the %unordered_map.
  416.  
  417.        *  @param __x Pair to be inserted (see std::make_pair for easy
  418.        *             creation of pairs).
  419.        *
  420.        *  @return  A pair, of which the first element is an iterator that
  421.        *           points to the possibly inserted pair, and the second is
  422.        *           a bool that is true if the pair was actually inserted.
  423.        *
  424.        *  This function attempts to insert a (key, value) %pair into the
  425.        *  %unordered_map. An %unordered_map relies on unique keys and thus a
  426.        *  %pair is only inserted if its first element (the key) is not already
  427.        *  present in the %unordered_map.
  428.        *
  429.        *  Insertion requires amortized constant time.
  430.        */
  431.       std::pair<iterator, bool>
  432.       insert(const value_type& __x)
  433.       { return _M_h.insert(__x); }
  434.  
  435.       template<typename _Pair, typename = typename
  436.                std::enable_if<std::is_constructible<value_type,
  437.                                                     _Pair&&>::value>::type>
  438.         std::pair<iterator, bool>
  439.         insert(_Pair&& __x)
  440.         { return _M_h.insert(std::forward<_Pair>(__x)); }
  441.       //@}
  442.  
  443.       //@{
  444.       /**
  445.        *  @brief Attempts to insert a std::pair into the %unordered_map.
  446.        *  @param  __hint  An iterator that serves as a hint as to where the
  447.        *                 pair should be inserted.
  448.        *  @param  __x  Pair to be inserted (see std::make_pair for easy creation
  449.        *               of pairs).
  450.        *  @return An iterator that points to the element with key of
  451.        *           @a __x (may or may not be the %pair passed in).
  452.        *
  453.        *  This function is not concerned about whether the insertion took place,
  454.        *  and thus does not return a boolean like the single-argument insert()
  455.        *  does.  Note that the first parameter is only a hint and can
  456.        *  potentially improve the performance of the insertion process.  A bad
  457.        *  hint would cause no gains in efficiency.
  458.        *
  459.        *  See
  460.        *  https://gcc.gnu.org/onlinedocs/libstdc++/manual/associative.html#containers.associative.insert_hints
  461.        *  for more on @a hinting.
  462.        *
  463.        *  Insertion requires amortized constant time.
  464.        */
  465.       iterator
  466.       insert(const_iterator __hint, const value_type& __x)
  467.       { return _M_h.insert(__hint, __x); }
  468.  
  469.       template<typename _Pair, typename = typename
  470.                std::enable_if<std::is_constructible<value_type,
  471.                                                     _Pair&&>::value>::type>
  472.         iterator
  473.         insert(const_iterator __hint, _Pair&& __x)
  474.         { return _M_h.insert(__hint, std::forward<_Pair>(__x)); }
  475.       //@}
  476.  
  477.       /**
  478.        *  @brief A template function that attempts to insert a range of
  479.        *  elements.
  480.        *  @param  __first  Iterator pointing to the start of the range to be
  481.        *                   inserted.
  482.        *  @param  __last  Iterator pointing to the end of the range.
  483.        *
  484.        *  Complexity similar to that of the range constructor.
  485.        */
  486.       template<typename _InputIterator>
  487.         void
  488.         insert(_InputIterator __first, _InputIterator __last)
  489.         { _M_h.insert(__first, __last); }
  490.  
  491.       /**
  492.        *  @brief Attempts to insert a list of elements into the %unordered_map.
  493.        *  @param  __l  A std::initializer_list<value_type> of elements
  494.        *               to be inserted.
  495.        *
  496.        *  Complexity similar to that of the range constructor.
  497.        */
  498.       void
  499.       insert(initializer_list<value_type> __l)
  500.       { _M_h.insert(__l); }
  501.  
  502.       //@{
  503.       /**
  504.        *  @brief Erases an element from an %unordered_map.
  505.        *  @param  __position  An iterator pointing to the element to be erased.
  506.        *  @return An iterator pointing to the element immediately following
  507.        *          @a __position prior to the element being erased. If no such
  508.        *          element exists, end() is returned.
  509.        *
  510.        *  This function erases an element, pointed to by the given iterator,
  511.        *  from an %unordered_map.
  512.        *  Note that this function only erases the element, and that if the
  513.        *  element is itself a pointer, the pointed-to memory is not touched in
  514.        *  any way.  Managing the pointer is the user's responsibility.
  515.        */
  516.       iterator
  517.       erase(const_iterator __position)
  518.       { return _M_h.erase(__position); }
  519.  
  520.       // LWG 2059.
  521.       iterator
  522.       erase(iterator __position)
  523.       { return _M_h.erase(__position); }
  524.       //@}
  525.  
  526.       /**
  527.        *  @brief Erases elements according to the provided key.
  528.        *  @param  __x  Key of element to be erased.
  529.        *  @return  The number of elements erased.
  530.        *
  531.        *  This function erases all the elements located by the given key from
  532.        *  an %unordered_map. For an %unordered_map the result of this function
  533.        *  can only be 0 (not present) or 1 (present).
  534.        *  Note that this function only erases the element, and that if the
  535.        *  element is itself a pointer, the pointed-to memory is not touched in
  536.        *  any way.  Managing the pointer is the user's responsibility.
  537.        */
  538.       size_type
  539.       erase(const key_type& __x)
  540.       { return _M_h.erase(__x); }
  541.  
  542.       /**
  543.        *  @brief Erases a [__first,__last) range of elements from an
  544.        *  %unordered_map.
  545.        *  @param  __first  Iterator pointing to the start of the range to be
  546.        *                  erased.
  547.        *  @param __last  Iterator pointing to the end of the range to
  548.        *                be erased.
  549.        *  @return The iterator @a __last.
  550.        *
  551.        *  This function erases a sequence of elements from an %unordered_map.
  552.        *  Note that this function only erases the elements, and that if
  553.        *  the element is itself a pointer, the pointed-to memory is not touched
  554.        *  in any way.  Managing the pointer is the user's responsibility.
  555.        */
  556.       iterator
  557.       erase(const_iterator __first, const_iterator __last)
  558.       { return _M_h.erase(__first, __last); }
  559.  
  560.       /**
  561.        *  Erases all elements in an %unordered_map.
  562.        *  Note that this function only erases the elements, and that if the
  563.        *  elements themselves are pointers, the pointed-to memory is not touched
  564.        *  in any way.  Managing the pointer is the user's responsibility.
  565.        */
  566.       void
  567.       clear() noexcept
  568.       { _M_h.clear(); }
  569.  
  570.       /**
  571.        *  @brief  Swaps data with another %unordered_map.
  572.        *  @param  __x  An %unordered_map of the same element and allocator
  573.        *  types.
  574.        *
  575.        *  This exchanges the elements between two %unordered_map in constant
  576.        *  time.
  577.        *  Note that the global std::swap() function is specialized such that
  578.        *  std::swap(m1,m2) will feed to this function.
  579.        */
  580.       void
  581.       swap(unordered_map& __x)
  582.       noexcept( noexcept(_M_h.swap(__x._M_h)) )
  583.       { _M_h.swap(__x._M_h); }
  584.  
  585.       // observers.
  586.  
  587.       ///  Returns the hash functor object with which the %unordered_map was
  588.       ///  constructed.
  589.       hasher
  590.       hash_function() const
  591.       { return _M_h.hash_function(); }
  592.  
  593.       ///  Returns the key comparison object with which the %unordered_map was
  594.       ///  constructed.
  595.       key_equal
  596.       key_eq() const
  597.       { return _M_h.key_eq(); }
  598.  
  599.       // lookup.
  600.  
  601.       //@{
  602.       /**
  603.        *  @brief Tries to locate an element in an %unordered_map.
  604.        *  @param  __x  Key to be located.
  605.        *  @return  Iterator pointing to sought-after element, or end() if not
  606.        *           found.
  607.        *
  608.        *  This function takes a key and tries to locate the element with which
  609.        *  the key matches.  If successful the function returns an iterator
  610.        *  pointing to the sought after element.  If unsuccessful it returns the
  611.        *  past-the-end ( @c end() ) iterator.
  612.        */
  613.       iterator
  614.       find(const key_type& __x)
  615.       { return _M_h.find(__x); }
  616.  
  617.       const_iterator
  618.       find(const key_type& __x) const
  619.       { return _M_h.find(__x); }
  620.       //@}
  621.  
  622.       /**
  623.        *  @brief  Finds the number of elements.
  624.        *  @param  __x  Key to count.
  625.        *  @return  Number of elements with specified key.
  626.        *
  627.        *  This function only makes sense for %unordered_multimap; for
  628.        *  %unordered_map the result will either be 0 (not present) or 1
  629.        *  (present).
  630.        */
  631.       size_type
  632.       count(const key_type& __x) const
  633.       { return _M_h.count(__x); }
  634.  
  635.       //@{
  636.       /**
  637.        *  @brief Finds a subsequence matching given key.
  638.        *  @param  __x  Key to be located.
  639.        *  @return  Pair of iterators that possibly points to the subsequence
  640.        *           matching given key.
  641.        *
  642.        *  This function probably only makes sense for %unordered_multimap.
  643.        */
  644.       std::pair<iterator, iterator>
  645.       equal_range(const key_type& __x)
  646.       { return _M_h.equal_range(__x); }
  647.  
  648.       std::pair<const_iterator, const_iterator>
  649.       equal_range(const key_type& __x) const
  650.       { return _M_h.equal_range(__x); }
  651.       //@}
  652.  
  653.       //@{
  654.       /**
  655.        *  @brief  Subscript ( @c [] ) access to %unordered_map data.
  656.        *  @param  __k  The key for which data should be retrieved.
  657.        *  @return  A reference to the data of the (key,data) %pair.
  658.        *
  659.        *  Allows for easy lookup with the subscript ( @c [] )operator.  Returns
  660.        *  data associated with the key specified in subscript.  If the key does
  661.        *  not exist, a pair with that key is created using default values, which
  662.        *  is then returned.
  663.        *
  664.        *  Lookup requires constant time.
  665.        */
  666.       mapped_type&
  667.       operator[](const key_type& __k)
  668.       { return _M_h[__k]; }
  669.  
  670.       mapped_type&
  671.       operator[](key_type&& __k)
  672.       { return _M_h[std::move(__k)]; }
  673.       //@}
  674.  
  675.       //@{
  676.       /**
  677.        *  @brief  Access to %unordered_map data.
  678.        *  @param  __k  The key for which data should be retrieved.
  679.        *  @return  A reference to the data whose key is equal to @a __k, if
  680.        *           such a data is present in the %unordered_map.
  681.        *  @throw  std::out_of_range  If no such data is present.
  682.        */
  683.       mapped_type&
  684.       at(const key_type& __k)
  685.       { return _M_h.at(__k); }
  686.  
  687.       const mapped_type&
  688.       at(const key_type& __k) const
  689.       { return _M_h.at(__k); }
  690.       //@}
  691.  
  692.       // bucket interface.
  693.  
  694.       /// Returns the number of buckets of the %unordered_map.
  695.       size_type
  696.       bucket_count() const noexcept
  697.       { return _M_h.bucket_count(); }
  698.  
  699.       /// Returns the maximum number of buckets of the %unordered_map.
  700.       size_type
  701.       max_bucket_count() const noexcept
  702.       { return _M_h.max_bucket_count(); }
  703.  
  704.       /*
  705.        * @brief  Returns the number of elements in a given bucket.
  706.        * @param  __n  A bucket index.
  707.        * @return  The number of elements in the bucket.
  708.        */
  709.       size_type
  710.       bucket_size(size_type __n) const
  711.       { return _M_h.bucket_size(__n); }
  712.  
  713.       /*
  714.        * @brief  Returns the bucket index of a given element.
  715.        * @param  __key  A key instance.
  716.        * @return  The key bucket index.
  717.        */
  718.       size_type
  719.       bucket(const key_type& __key) const
  720.       { return _M_h.bucket(__key); }
  721.      
  722.       /**
  723.        *  @brief  Returns a read/write iterator pointing to the first bucket
  724.        *         element.
  725.        *  @param  __n The bucket index.
  726.        *  @return  A read/write local iterator.
  727.        */
  728.       local_iterator
  729.       begin(size_type __n)
  730.       { return _M_h.begin(__n); }
  731.  
  732.       //@{
  733.       /**
  734.        *  @brief  Returns a read-only (constant) iterator pointing to the first
  735.        *         bucket element.
  736.        *  @param  __n The bucket index.
  737.        *  @return  A read-only local iterator.
  738.        */
  739.       const_local_iterator
  740.       begin(size_type __n) const
  741.       { return _M_h.begin(__n); }
  742.  
  743.       const_local_iterator
  744.       cbegin(size_type __n) const
  745.       { return _M_h.cbegin(__n); }
  746.       //@}
  747.  
  748.       /**
  749.        *  @brief  Returns a read/write iterator pointing to one past the last
  750.        *         bucket elements.
  751.        *  @param  __n The bucket index.
  752.        *  @return  A read/write local iterator.
  753.        */
  754.       local_iterator
  755.       end(size_type __n)
  756.       { return _M_h.end(__n); }
  757.  
  758.       //@{
  759.       /**
  760.        *  @brief  Returns a read-only (constant) iterator pointing to one past
  761.        *         the last bucket elements.
  762.        *  @param  __n The bucket index.
  763.        *  @return  A read-only local iterator.
  764.        */
  765.       const_local_iterator
  766.       end(size_type __n) const
  767.       { return _M_h.end(__n); }
  768.  
  769.       const_local_iterator
  770.       cend(size_type __n) const
  771.       { return _M_h.cend(__n); }
  772.       //@}
  773.  
  774.       // hash policy.
  775.  
  776.       /// Returns the average number of elements per bucket.
  777.       float
  778.       load_factor() const noexcept
  779.       { return _M_h.load_factor(); }
  780.  
  781.       /// Returns a positive number that the %unordered_map tries to keep the
  782.       /// load factor less than or equal to.
  783.       float
  784.       max_load_factor() const noexcept
  785.       { return _M_h.max_load_factor(); }
  786.  
  787.       /**
  788.        *  @brief  Change the %unordered_map maximum load factor.
  789.        *  @param  __z The new maximum load factor.
  790.        */
  791.       void
  792.       max_load_factor(float __z)
  793.       { _M_h.max_load_factor(__z); }
  794.  
  795.       /**
  796.        *  @brief  May rehash the %unordered_map.
  797.        *  @param  __n The new number of buckets.
  798.        *
  799.        *  Rehash will occur only if the new number of buckets respect the
  800.        *  %unordered_map maximum load factor.
  801.        */
  802.       void
  803.       rehash(size_type __n)
  804.       { _M_h.rehash(__n); }
  805.  
  806.       /**
  807.        *  @brief  Prepare the %unordered_map for a specified number of
  808.        *          elements.
  809.        *  @param  __n Number of elements required.
  810.        *
  811.        *  Same as rehash(ceil(n / max_load_factor())).
  812.        */
  813.       void
  814.       reserve(size_type __n)
  815.       { _M_h.reserve(__n); }
  816.  
  817.       template<typename _Key1, typename _Tp1, typename _Hash1, typename _Pred1,
  818.                typename _Alloc1>
  819.         friend bool
  820.       operator==(const unordered_map<_Key1, _Tp1, _Hash1, _Pred1, _Alloc1>&,
  821.                  const unordered_map<_Key1, _Tp1, _Hash1, _Pred1, _Alloc1>&);
  822.     };
  823.  
  824.   /**
  825.    *  @brief A standard container composed of equivalent keys
  826.    *  (possibly containing multiple of each key value) that associates
  827.    *  values of another type with the keys.
  828.    *
  829.    *  @ingroup unordered_associative_containers
  830.    *
  831.    *  @tparam  _Key    Type of key objects.
  832.    *  @tparam  _Tp     Type of mapped objects.
  833.    *  @tparam  _Hash   Hashing function object type, defaults to hash<_Value>.
  834.    *  @tparam  _Pred   Predicate function object type, defaults
  835.    *                   to equal_to<_Value>.
  836.    *  @tparam  _Alloc  Allocator type, defaults to
  837.    *                   std::allocator<std::pair<const _Key, _Tp>>.
  838.    *
  839.    *  Meets the requirements of a <a href="tables.html#65">container</a>, and
  840.    *  <a href="tables.html#xx">unordered associative container</a>
  841.    *
  842.    * The resulting value type of the container is std::pair<const _Key, _Tp>.
  843.    *
  844.    *  Base is _Hashtable, dispatched at compile time via template
  845.    *  alias __ummap_hashtable.
  846.    */
  847.   template<class _Key, class _Tp,
  848.            class _Hash = hash<_Key>,
  849.            class _Pred = std::equal_to<_Key>,
  850.            class _Alloc = std::allocator<std::pair<const _Key, _Tp> > >
  851.     class unordered_multimap
  852.     {
  853.       typedef __ummap_hashtable<_Key, _Tp, _Hash, _Pred, _Alloc>  _Hashtable;
  854.       _Hashtable _M_h;
  855.  
  856.     public:
  857.       // typedefs:
  858.       //@{
  859.       /// Public typedefs.
  860.       typedef typename _Hashtable::key_type     key_type;
  861.       typedef typename _Hashtable::value_type   value_type;
  862.       typedef typename _Hashtable::mapped_type  mapped_type;
  863.       typedef typename _Hashtable::hasher       hasher;
  864.       typedef typename _Hashtable::key_equal    key_equal;
  865.       typedef typename _Hashtable::allocator_type allocator_type;
  866.       //@}
  867.  
  868.       //@{
  869.       ///  Iterator-related typedefs.
  870.       typedef typename _Hashtable::pointer              pointer;
  871.       typedef typename _Hashtable::const_pointer        const_pointer;
  872.       typedef typename _Hashtable::reference            reference;
  873.       typedef typename _Hashtable::const_reference      const_reference;
  874.       typedef typename _Hashtable::iterator             iterator;
  875.       typedef typename _Hashtable::const_iterator       const_iterator;
  876.       typedef typename _Hashtable::local_iterator       local_iterator;
  877.       typedef typename _Hashtable::const_local_iterator const_local_iterator;
  878.       typedef typename _Hashtable::size_type            size_type;
  879.       typedef typename _Hashtable::difference_type      difference_type;
  880.       //@}
  881.  
  882.       //construct/destroy/copy
  883.  
  884.       /// Default constructor.
  885.       unordered_multimap() = default;
  886.  
  887.       /**
  888.        *  @brief  Default constructor creates no elements.
  889.        *  @param __n  Mnimal initial number of buckets.
  890.        *  @param __hf  A hash functor.
  891.        *  @param __eql  A key equality functor.
  892.        *  @param __a  An allocator object.
  893.        */
  894.       explicit
  895.       unordered_multimap(size_type __n,
  896.                          const hasher& __hf = hasher(),
  897.                          const key_equal& __eql = key_equal(),
  898.                          const allocator_type& __a = allocator_type())
  899.       : _M_h(__n, __hf, __eql, __a)
  900.       { }
  901.  
  902.       /**
  903.        *  @brief  Builds an %unordered_multimap from a range.
  904.        *  @param  __first An input iterator.
  905.        *  @param  __last  An input iterator.
  906.        *  @param __n      Minimal initial number of buckets.
  907.        *  @param __hf     A hash functor.
  908.        *  @param __eql    A key equality functor.
  909.        *  @param __a      An allocator object.
  910.        *
  911.        *  Create an %unordered_multimap consisting of copies of the elements
  912.        *  from [__first,__last).  This is linear in N (where N is
  913.        *  distance(__first,__last)).
  914.        */
  915.       template<typename _InputIterator>
  916.         unordered_multimap(_InputIterator __first, _InputIterator __last,
  917.                            size_type __n = 0,
  918.                            const hasher& __hf = hasher(),
  919.                            const key_equal& __eql = key_equal(),
  920.                            const allocator_type& __a = allocator_type())
  921.         : _M_h(__first, __last, __n, __hf, __eql, __a)
  922.         { }
  923.  
  924.       /// Copy constructor.
  925.       unordered_multimap(const unordered_multimap&) = default;
  926.  
  927.       /// Move constructor.
  928.       unordered_multimap(unordered_multimap&&) = default;
  929.  
  930.       /**
  931.        *  @brief Creates an %unordered_multimap with no elements.
  932.        *  @param __a An allocator object.
  933.        */
  934.       explicit
  935.       unordered_multimap(const allocator_type& __a)
  936.       : _M_h(__a)
  937.       { }
  938.  
  939.       /*
  940.        *  @brief Copy constructor with allocator argument.
  941.        * @param  __uset  Input %unordered_multimap to copy.
  942.        * @param  __a  An allocator object.
  943.        */
  944.       unordered_multimap(const unordered_multimap& __ummap,
  945.                          const allocator_type& __a)
  946.       : _M_h(__ummap._M_h, __a)
  947.       { }
  948.  
  949.       /*
  950.        *  @brief  Move constructor with allocator argument.
  951.        *  @param  __uset Input %unordered_multimap to move.
  952.        *  @param  __a    An allocator object.
  953.        */
  954.       unordered_multimap(unordered_multimap&& __ummap,
  955.                          const allocator_type& __a)
  956.       : _M_h(std::move(__ummap._M_h), __a)
  957.       { }
  958.  
  959.       /**
  960.        *  @brief  Builds an %unordered_multimap from an initializer_list.
  961.        *  @param  __l  An initializer_list.
  962.        *  @param __n  Minimal initial number of buckets.
  963.        *  @param __hf  A hash functor.
  964.        *  @param __eql  A key equality functor.
  965.        *  @param  __a  An allocator object.
  966.        *
  967.        *  Create an %unordered_multimap consisting of copies of the elements in
  968.        *  the list. This is linear in N (where N is @a __l.size()).
  969.        */
  970.       unordered_multimap(initializer_list<value_type> __l,
  971.                          size_type __n = 0,
  972.                          const hasher& __hf = hasher(),
  973.                          const key_equal& __eql = key_equal(),
  974.                          const allocator_type& __a = allocator_type())
  975.       : _M_h(__l, __n, __hf, __eql, __a)
  976.       { }
  977.  
  978.       unordered_multimap(size_type __n, const allocator_type& __a)
  979.       : unordered_multimap(__n, hasher(), key_equal(), __a)
  980.       { }
  981.  
  982.       unordered_multimap(size_type __n, const hasher& __hf,
  983.                          const allocator_type& __a)
  984.       : unordered_multimap(__n, __hf, key_equal(), __a)
  985.       { }
  986.  
  987.       template<typename _InputIterator>
  988.         unordered_multimap(_InputIterator __first, _InputIterator __last,
  989.                            size_type __n,
  990.                            const allocator_type& __a)
  991.         : unordered_multimap(__first, __last, __n, hasher(), key_equal(), __a)
  992.         { }
  993.  
  994.       template<typename _InputIterator>
  995.         unordered_multimap(_InputIterator __first, _InputIterator __last,
  996.                            size_type __n, const hasher& __hf,
  997.                            const allocator_type& __a)
  998.         : unordered_multimap(__first, __last, __n, __hf, key_equal(), __a)
  999.         { }
  1000.  
  1001.       unordered_multimap(initializer_list<value_type> __l,
  1002.                          size_type __n,
  1003.                          const allocator_type& __a)
  1004.       : unordered_multimap(__l, __n, hasher(), key_equal(), __a)
  1005.       { }
  1006.  
  1007.       unordered_multimap(initializer_list<value_type> __l,
  1008.                          size_type __n, const hasher& __hf,
  1009.                          const allocator_type& __a)
  1010.       : unordered_multimap(__l, __n, __hf, key_equal(), __a)
  1011.       { }
  1012.  
  1013.       /// Copy assignment operator.
  1014.       unordered_multimap&
  1015.       operator=(const unordered_multimap&) = default;
  1016.  
  1017.       /// Move assignment operator.
  1018.       unordered_multimap&
  1019.       operator=(unordered_multimap&&) = default;
  1020.  
  1021.       /**
  1022.        *  @brief  %Unordered_multimap list assignment operator.
  1023.        *  @param  __l  An initializer_list.
  1024.        *
  1025.        *  This function fills an %unordered_multimap with copies of the elements
  1026.        *  in the initializer list @a __l.
  1027.        *
  1028.        *  Note that the assignment completely changes the %unordered_multimap
  1029.        *  and that the resulting %unordered_multimap's size is the same as the
  1030.        *  number of elements assigned.  Old data may be lost.
  1031.        */
  1032.       unordered_multimap&
  1033.       operator=(initializer_list<value_type> __l)
  1034.       {
  1035.         _M_h = __l;
  1036.         return *this;
  1037.       }
  1038.  
  1039.       ///  Returns the allocator object with which the %unordered_multimap was
  1040.       ///  constructed.
  1041.       allocator_type
  1042.       get_allocator() const noexcept
  1043.       { return _M_h.get_allocator(); }
  1044.  
  1045.       // size and capacity:
  1046.  
  1047.       ///  Returns true if the %unordered_multimap is empty.
  1048.       bool
  1049.       empty() const noexcept
  1050.       { return _M_h.empty(); }
  1051.  
  1052.       ///  Returns the size of the %unordered_multimap.
  1053.       size_type
  1054.       size() const noexcept
  1055.       { return _M_h.size(); }
  1056.  
  1057.       ///  Returns the maximum size of the %unordered_multimap.
  1058.       size_type
  1059.       max_size() const noexcept
  1060.       { return _M_h.max_size(); }
  1061.  
  1062.       // iterators.
  1063.  
  1064.       /**
  1065.        *  Returns a read/write iterator that points to the first element in the
  1066.        *  %unordered_multimap.
  1067.        */
  1068.       iterator
  1069.       begin() noexcept
  1070.       { return _M_h.begin(); }
  1071.  
  1072.       //@{
  1073.       /**
  1074.        *  Returns a read-only (constant) iterator that points to the first
  1075.        *  element in the %unordered_multimap.
  1076.        */
  1077.       const_iterator
  1078.       begin() const noexcept
  1079.       { return _M_h.begin(); }
  1080.  
  1081.       const_iterator
  1082.       cbegin() const noexcept
  1083.       { return _M_h.begin(); }
  1084.       //@}
  1085.  
  1086.       /**
  1087.        *  Returns a read/write iterator that points one past the last element in
  1088.        *  the %unordered_multimap.
  1089.        */
  1090.       iterator
  1091.       end() noexcept
  1092.       { return _M_h.end(); }
  1093.  
  1094.       //@{
  1095.       /**
  1096.        *  Returns a read-only (constant) iterator that points one past the last
  1097.        *  element in the %unordered_multimap.
  1098.        */
  1099.       const_iterator
  1100.       end() const noexcept
  1101.       { return _M_h.end(); }
  1102.  
  1103.       const_iterator
  1104.       cend() const noexcept
  1105.       { return _M_h.end(); }
  1106.       //@}
  1107.  
  1108.       // modifiers.
  1109.  
  1110.       /**
  1111.        *  @brief Attempts to build and insert a std::pair into the
  1112.        *  %unordered_multimap.
  1113.        *
  1114.        *  @param __args  Arguments used to generate a new pair instance (see
  1115.        *                std::piecewise_contruct for passing arguments to each
  1116.        *                part of the pair constructor).
  1117.        *
  1118.        *  @return  An iterator that points to the inserted pair.
  1119.        *
  1120.        *  This function attempts to build and insert a (key, value) %pair into
  1121.        *  the %unordered_multimap.
  1122.        *
  1123.        *  Insertion requires amortized constant time.
  1124.        */
  1125.       template<typename... _Args>
  1126.         iterator
  1127.         emplace(_Args&&... __args)
  1128.         { return _M_h.emplace(std::forward<_Args>(__args)...); }
  1129.  
  1130.       /**
  1131.        *  @brief Attempts to build and insert a std::pair into the
  1132.        *  %unordered_multimap.
  1133.        *
  1134.        *  @param  __pos  An iterator that serves as a hint as to where the pair
  1135.        *                should be inserted.
  1136.        *  @param  __args  Arguments used to generate a new pair instance (see
  1137.        *                 std::piecewise_contruct for passing arguments to each
  1138.        *                 part of the pair constructor).
  1139.        *  @return An iterator that points to the element with key of the
  1140.        *          std::pair built from @a __args.
  1141.        *
  1142.        *  Note that the first parameter is only a hint and can potentially
  1143.        *  improve the performance of the insertion process. A bad hint would
  1144.        *  cause no gains in efficiency.
  1145.        *
  1146.        *  See
  1147.        *  https://gcc.gnu.org/onlinedocs/libstdc++/manual/associative.html#containers.associative.insert_hints
  1148.        *  for more on @a hinting.
  1149.        *
  1150.        *  Insertion requires amortized constant time.
  1151.        */
  1152.       template<typename... _Args>
  1153.         iterator
  1154.         emplace_hint(const_iterator __pos, _Args&&... __args)
  1155.         { return _M_h.emplace_hint(__pos, std::forward<_Args>(__args)...); }
  1156.  
  1157.       //@{
  1158.       /**
  1159.        *  @brief Inserts a std::pair into the %unordered_multimap.
  1160.        *  @param __x Pair to be inserted (see std::make_pair for easy
  1161.        *             creation of pairs).
  1162.        *
  1163.        *  @return  An iterator that points to the inserted pair.
  1164.        *
  1165.        *  Insertion requires amortized constant time.
  1166.        */
  1167.       iterator
  1168.       insert(const value_type& __x)
  1169.       { return _M_h.insert(__x); }
  1170.  
  1171.       template<typename _Pair, typename = typename
  1172.                std::enable_if<std::is_constructible<value_type,
  1173.                                                     _Pair&&>::value>::type>
  1174.         iterator
  1175.         insert(_Pair&& __x)
  1176.         { return _M_h.insert(std::forward<_Pair>(__x)); }
  1177.       //@}
  1178.  
  1179.       //@{
  1180.       /**
  1181.        *  @brief Inserts a std::pair into the %unordered_multimap.
  1182.        *  @param  __hint  An iterator that serves as a hint as to where the
  1183.        *                 pair should be inserted.
  1184.        *  @param  __x  Pair to be inserted (see std::make_pair for easy creation
  1185.        *               of pairs).
  1186.        *  @return An iterator that points to the element with key of
  1187.        *           @a __x (may or may not be the %pair passed in).
  1188.        *
  1189.        *  Note that the first parameter is only a hint and can potentially
  1190.        *  improve the performance of the insertion process.  A bad hint would
  1191.        *  cause no gains in efficiency.
  1192.        *
  1193.        *  See
  1194.        *  https://gcc.gnu.org/onlinedocs/libstdc++/manual/associative.html#containers.associative.insert_hints
  1195.        *  for more on @a hinting.
  1196.        *
  1197.        *  Insertion requires amortized constant time.
  1198.        */
  1199.       iterator
  1200.       insert(const_iterator __hint, const value_type& __x)
  1201.       { return _M_h.insert(__hint, __x); }
  1202.  
  1203.       template<typename _Pair, typename = typename
  1204.                std::enable_if<std::is_constructible<value_type,
  1205.                                                     _Pair&&>::value>::type>
  1206.         iterator
  1207.         insert(const_iterator __hint, _Pair&& __x)
  1208.         { return _M_h.insert(__hint, std::forward<_Pair>(__x)); }
  1209.       //@}
  1210.  
  1211.       /**
  1212.        *  @brief A template function that attempts to insert a range of
  1213.        *  elements.
  1214.        *  @param  __first  Iterator pointing to the start of the range to be
  1215.        *                   inserted.
  1216.        *  @param  __last  Iterator pointing to the end of the range.
  1217.        *
  1218.        *  Complexity similar to that of the range constructor.
  1219.        */
  1220.       template<typename _InputIterator>
  1221.         void
  1222.         insert(_InputIterator __first, _InputIterator __last)
  1223.         { _M_h.insert(__first, __last); }
  1224.  
  1225.       /**
  1226.        *  @brief Attempts to insert a list of elements into the
  1227.        *  %unordered_multimap.
  1228.        *  @param  __l  A std::initializer_list<value_type> of elements
  1229.        *               to be inserted.
  1230.        *
  1231.        *  Complexity similar to that of the range constructor.
  1232.        */
  1233.       void
  1234.       insert(initializer_list<value_type> __l)
  1235.       { _M_h.insert(__l); }
  1236.  
  1237.       //@{
  1238.       /**
  1239.        *  @brief Erases an element from an %unordered_multimap.
  1240.        *  @param  __position  An iterator pointing to the element to be erased.
  1241.        *  @return An iterator pointing to the element immediately following
  1242.        *          @a __position prior to the element being erased. If no such
  1243.        *          element exists, end() is returned.
  1244.        *
  1245.        *  This function erases an element, pointed to by the given iterator,
  1246.        *  from an %unordered_multimap.
  1247.        *  Note that this function only erases the element, and that if the
  1248.        *  element is itself a pointer, the pointed-to memory is not touched in
  1249.        *  any way.  Managing the pointer is the user's responsibility.
  1250.        */
  1251.       iterator
  1252.       erase(const_iterator __position)
  1253.       { return _M_h.erase(__position); }
  1254.  
  1255.       // LWG 2059.
  1256.       iterator
  1257.       erase(iterator __position)
  1258.       { return _M_h.erase(__position); }
  1259.       //@}
  1260.  
  1261.       /**
  1262.        *  @brief Erases elements according to the provided key.
  1263.        *  @param  __x  Key of elements to be erased.
  1264.        *  @return  The number of elements erased.
  1265.        *
  1266.        *  This function erases all the elements located by the given key from
  1267.        *  an %unordered_multimap.
  1268.        *  Note that this function only erases the element, and that if the
  1269.        *  element is itself a pointer, the pointed-to memory is not touched in
  1270.        *  any way.  Managing the pointer is the user's responsibility.
  1271.        */
  1272.       size_type
  1273.       erase(const key_type& __x)
  1274.       { return _M_h.erase(__x); }
  1275.  
  1276.       /**
  1277.        *  @brief Erases a [__first,__last) range of elements from an
  1278.        *  %unordered_multimap.
  1279.        *  @param  __first  Iterator pointing to the start of the range to be
  1280.        *                  erased.
  1281.        *  @param __last  Iterator pointing to the end of the range to
  1282.        *                be erased.
  1283.        *  @return The iterator @a __last.
  1284.        *
  1285.        *  This function erases a sequence of elements from an
  1286.        *  %unordered_multimap.
  1287.        *  Note that this function only erases the elements, and that if
  1288.        *  the element is itself a pointer, the pointed-to memory is not touched
  1289.        *  in any way.  Managing the pointer is the user's responsibility.
  1290.        */
  1291.       iterator
  1292.       erase(const_iterator __first, const_iterator __last)
  1293.       { return _M_h.erase(__first, __last); }
  1294.  
  1295.       /**
  1296.        *  Erases all elements in an %unordered_multimap.
  1297.        *  Note that this function only erases the elements, and that if the
  1298.        *  elements themselves are pointers, the pointed-to memory is not touched
  1299.        *  in any way.  Managing the pointer is the user's responsibility.
  1300.        */
  1301.       void
  1302.       clear() noexcept
  1303.       { _M_h.clear(); }
  1304.  
  1305.       /**
  1306.        *  @brief  Swaps data with another %unordered_multimap.
  1307.        *  @param  __x  An %unordered_multimap of the same element and allocator
  1308.        *  types.
  1309.        *
  1310.        *  This exchanges the elements between two %unordered_multimap in
  1311.        *  constant time.
  1312.        *  Note that the global std::swap() function is specialized such that
  1313.        *  std::swap(m1,m2) will feed to this function.
  1314.        */
  1315.       void
  1316.       swap(unordered_multimap& __x)
  1317.       noexcept( noexcept(_M_h.swap(__x._M_h)) )
  1318.       { _M_h.swap(__x._M_h); }
  1319.  
  1320.       // observers.
  1321.  
  1322.       ///  Returns the hash functor object with which the %unordered_multimap
  1323.       ///  was constructed.
  1324.       hasher
  1325.       hash_function() const
  1326.       { return _M_h.hash_function(); }
  1327.  
  1328.       ///  Returns the key comparison object with which the %unordered_multimap
  1329.       ///  was constructed.
  1330.       key_equal
  1331.       key_eq() const
  1332.       { return _M_h.key_eq(); }
  1333.  
  1334.       // lookup.
  1335.  
  1336.       //@{
  1337.       /**
  1338.        *  @brief Tries to locate an element in an %unordered_multimap.
  1339.        *  @param  __x  Key to be located.
  1340.        *  @return  Iterator pointing to sought-after element, or end() if not
  1341.        *           found.
  1342.        *
  1343.        *  This function takes a key and tries to locate the element with which
  1344.        *  the key matches.  If successful the function returns an iterator
  1345.        *  pointing to the sought after element.  If unsuccessful it returns the
  1346.        *  past-the-end ( @c end() ) iterator.
  1347.        */
  1348.       iterator
  1349.       find(const key_type& __x)
  1350.       { return _M_h.find(__x); }
  1351.  
  1352.       const_iterator
  1353.       find(const key_type& __x) const
  1354.       { return _M_h.find(__x); }
  1355.       //@}
  1356.  
  1357.       /**
  1358.        *  @brief  Finds the number of elements.
  1359.        *  @param  __x  Key to count.
  1360.        *  @return  Number of elements with specified key.
  1361.        */
  1362.       size_type
  1363.       count(const key_type& __x) const
  1364.       { return _M_h.count(__x); }
  1365.  
  1366.       //@{
  1367.       /**
  1368.        *  @brief Finds a subsequence matching given key.
  1369.        *  @param  __x  Key to be located.
  1370.        *  @return  Pair of iterators that possibly points to the subsequence
  1371.        *           matching given key.
  1372.        */
  1373.       std::pair<iterator, iterator>
  1374.       equal_range(const key_type& __x)
  1375.       { return _M_h.equal_range(__x); }
  1376.  
  1377.       std::pair<const_iterator, const_iterator>
  1378.       equal_range(const key_type& __x) const
  1379.       { return _M_h.equal_range(__x); }
  1380.       //@}
  1381.  
  1382.       // bucket interface.
  1383.  
  1384.       /// Returns the number of buckets of the %unordered_multimap.
  1385.       size_type
  1386.       bucket_count() const noexcept
  1387.       { return _M_h.bucket_count(); }
  1388.  
  1389.       /// Returns the maximum number of buckets of the %unordered_multimap.
  1390.       size_type
  1391.       max_bucket_count() const noexcept
  1392.       { return _M_h.max_bucket_count(); }
  1393.  
  1394.       /*
  1395.        * @brief  Returns the number of elements in a given bucket.
  1396.        * @param  __n  A bucket index.
  1397.        * @return  The number of elements in the bucket.
  1398.        */
  1399.       size_type
  1400.       bucket_size(size_type __n) const
  1401.       { return _M_h.bucket_size(__n); }
  1402.  
  1403.       /*
  1404.        * @brief  Returns the bucket index of a given element.
  1405.        * @param  __key  A key instance.
  1406.        * @return  The key bucket index.
  1407.        */
  1408.       size_type
  1409.       bucket(const key_type& __key) const
  1410.       { return _M_h.bucket(__key); }
  1411.      
  1412.       /**
  1413.        *  @brief  Returns a read/write iterator pointing to the first bucket
  1414.        *         element.
  1415.        *  @param  __n The bucket index.
  1416.        *  @return  A read/write local iterator.
  1417.        */
  1418.       local_iterator
  1419.       begin(size_type __n)
  1420.       { return _M_h.begin(__n); }
  1421.  
  1422.       //@{
  1423.       /**
  1424.        *  @brief  Returns a read-only (constant) iterator pointing to the first
  1425.        *         bucket element.
  1426.        *  @param  __n The bucket index.
  1427.        *  @return  A read-only local iterator.
  1428.        */
  1429.       const_local_iterator
  1430.       begin(size_type __n) const
  1431.       { return _M_h.begin(__n); }
  1432.  
  1433.       const_local_iterator
  1434.       cbegin(size_type __n) const
  1435.       { return _M_h.cbegin(__n); }
  1436.       //@}
  1437.  
  1438.       /**
  1439.        *  @brief  Returns a read/write iterator pointing to one past the last
  1440.        *         bucket elements.
  1441.        *  @param  __n The bucket index.
  1442.        *  @return  A read/write local iterator.
  1443.        */
  1444.       local_iterator
  1445.       end(size_type __n)
  1446.       { return _M_h.end(__n); }
  1447.  
  1448.       //@{
  1449.       /**
  1450.        *  @brief  Returns a read-only (constant) iterator pointing to one past
  1451.        *         the last bucket elements.
  1452.        *  @param  __n The bucket index.
  1453.        *  @return  A read-only local iterator.
  1454.        */
  1455.       const_local_iterator
  1456.       end(size_type __n) const
  1457.       { return _M_h.end(__n); }
  1458.  
  1459.       const_local_iterator
  1460.       cend(size_type __n) const
  1461.       { return _M_h.cend(__n); }
  1462.       //@}
  1463.  
  1464.       // hash policy.
  1465.  
  1466.       /// Returns the average number of elements per bucket.
  1467.       float
  1468.       load_factor() const noexcept
  1469.       { return _M_h.load_factor(); }
  1470.  
  1471.       /// Returns a positive number that the %unordered_multimap tries to keep
  1472.       /// the load factor less than or equal to.
  1473.       float
  1474.       max_load_factor() const noexcept
  1475.       { return _M_h.max_load_factor(); }
  1476.  
  1477.       /**
  1478.        *  @brief  Change the %unordered_multimap maximum load factor.
  1479.        *  @param  __z The new maximum load factor.
  1480.        */
  1481.       void
  1482.       max_load_factor(float __z)
  1483.       { _M_h.max_load_factor(__z); }
  1484.  
  1485.       /**
  1486.        *  @brief  May rehash the %unordered_multimap.
  1487.        *  @param  __n The new number of buckets.
  1488.        *
  1489.        *  Rehash will occur only if the new number of buckets respect the
  1490.        *  %unordered_multimap maximum load factor.
  1491.        */
  1492.       void
  1493.       rehash(size_type __n)
  1494.       { _M_h.rehash(__n); }
  1495.  
  1496.       /**
  1497.        *  @brief  Prepare the %unordered_multimap for a specified number of
  1498.        *          elements.
  1499.        *  @param  __n Number of elements required.
  1500.        *
  1501.        *  Same as rehash(ceil(n / max_load_factor())).
  1502.        */
  1503.       void
  1504.       reserve(size_type __n)
  1505.       { _M_h.reserve(__n); }
  1506.  
  1507.       template<typename _Key1, typename _Tp1, typename _Hash1, typename _Pred1,
  1508.                typename _Alloc1>
  1509.         friend bool
  1510.         operator==(const unordered_multimap<_Key1, _Tp1,
  1511.                                             _Hash1, _Pred1, _Alloc1>&,
  1512.                    const unordered_multimap<_Key1, _Tp1,
  1513.                                             _Hash1, _Pred1, _Alloc1>&);
  1514.     };
  1515.  
  1516.   template<class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
  1517.     inline void
  1518.     swap(unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
  1519.          unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
  1520.     { __x.swap(__y); }
  1521.  
  1522.   template<class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
  1523.     inline void
  1524.     swap(unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
  1525.          unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
  1526.     { __x.swap(__y); }
  1527.  
  1528.   template<class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
  1529.     inline bool
  1530.     operator==(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
  1531.                const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
  1532.     { return __x._M_h._M_equal(__y._M_h); }
  1533.  
  1534.   template<class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
  1535.     inline bool
  1536.     operator!=(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
  1537.                const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
  1538.     { return !(__x == __y); }
  1539.  
  1540.   template<class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
  1541.     inline bool
  1542.     operator==(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
  1543.                const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
  1544.     { return __x._M_h._M_equal(__y._M_h); }
  1545.  
  1546.   template<class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
  1547.     inline bool
  1548.     operator!=(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
  1549.                const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
  1550.     { return !(__x == __y); }
  1551.  
  1552. _GLIBCXX_END_NAMESPACE_CONTAINER
  1553. } // namespace std
  1554.  
  1555. #endif /* _UNORDERED_MAP_H */
  1556.