Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

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