xref: /netbsd-src/external/gpl3/gcc.old/dist/libstdc++-v3/include/bits/unordered_map.h (revision 946379e7b37692fc43f68eb0d1c10daa0a7f3b6c)
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