libstdc++
unordered_map.h
Go to the documentation of this file.
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>
40 
41  template<typename _Key,
42  typename _Tp,
43  typename _Hash = hash<_Key>,
44  typename _Pred = std::equal_to<_Key>,
48  _Alloc, __detail::_Select1st,
49  _Pred, _Hash,
53 
54  /// Base types for unordered_multimap.
55  template<bool _Cache>
57 
58  template<typename _Key,
59  typename _Tp,
60  typename _Hash = hash<_Key>,
61  typename _Pred = std::equal_to<_Key>,
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>,
97  class unordered_map : __check_copy_constructible<_Alloc>
98  {
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.
194  operator=(const unordered_map&) = default;
195 
196  /// Move assignment operator.
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  */
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>
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  */
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>
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
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
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  */
573  equal_range(const key_type& __x)
574  { return _M_h.equal_range(__x); }
575 
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
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>,
778  class unordered_multimap : __check_copy_constructible<_Alloc>
779  {
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.
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.
875  operator=(const unordered_multimap&) = default;
876 
877  /// Move assignment operator.
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  */
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
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
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  */
1232  equal_range(const key_type& __x)
1233  { return _M_h.equal_range(__x); }
1234 
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 */
_Hashtable::key_type key_type
Public typedefs.
size_type max_size() const noexcept
Returns the maximum size of the unordered_multimap.
float load_factor() const noexcept
Returns the average number of elements per bucket.
hasher hash_function() const
Returns the hash functor object with which the unordered_multimap was constructed.
unordered_multimap & operator=(const unordered_multimap &)=default
Copy assignment operator.
void insert(_InputIterator __first, _InputIterator __last)
A template function that attempts to insert a range of elements.
void max_load_factor(float __z)
Change the unordered_map maximum load factor.
unordered_multimap(initializer_list< value_type > __l, size_type __n=0, const hasher &__hf=hasher(), const key_equal &__eql=key_equal(), const allocator_type &__a=allocator_type())
Builds an unordered_multimap from an initializer_list.
unordered_multimap(_InputIterator __f, _InputIterator __l, size_type __n=0, const hasher &__hf=hasher(), const key_equal &__eql=key_equal(), const allocator_type &__a=allocator_type())
Builds an unordered_multimap from a range.
size_type size() const noexcept
Returns the size of the unordered_map.
size_type max_bucket_count() const noexcept
Returns the maximum number of buckets of the unordered_map.
std::pair< iterator, iterator > equal_range(const key_type &__x)
Finds a subsequence matching given key.
A standard container composed of unique keys (containing at most one of each key value) that associat...
Definition: unordered_map.h:97
_Hashtable::iterator iterator
Iterator-related typedefs.
const_local_iterator end(size_type __n) const
Returns a read-only (constant) iterator pointing to one past the last bucket elements.
size_type max_bucket_count() const noexcept
Returns the maximum number of buckets of the unordered_multimap.
Default ranged hash function H. In principle it should be a function object composed from objects of ...
_Hashtable::hasher hasher
Public typedefs.
void clear() noexcept
const_iterator begin() const noexcept
const_local_iterator cbegin(size_type __n) const
Returns a read-only (constant) iterator pointing to the first bucket element.
const_local_iterator cbegin(size_type __n) const
Returns a read-only (constant) iterator pointing to the first bucket element.
unordered_map(initializer_list< value_type > __l, size_type __n=0, const hasher &__hf=hasher(), const key_equal &__eql=key_equal(), const allocator_type &__a=allocator_type())
Builds an unordered_map from an initializer_list.
const_iterator begin() const noexcept
_Hashtable::const_local_iterator const_local_iterator
Iterator-related typedefs.
One of the comparison functors.
Definition: stl_function.h:204
const_local_iterator end(size_type __n) const
Returns a read-only (constant) iterator pointing to one past the last bucket elements.
_Hashtable::allocator_type allocator_type
Public typedefs.
iterator insert(const_iterator __hint, _Pair &&__x)
Inserts a std::pair into the unordered_multimap.
iterator begin() noexcept
void insert(initializer_list< value_type > __l)
Attempts to insert a list of elements into the unordered_map.
const_iterator end() const noexcept
allocator_type::const_reference const_reference
Iterator-related typedefs.
float max_load_factor() const noexcept
Returns a positive number that the unordered_multimap tries to keep the load factor less than or equa...
size_type count(const key_type &__x) const
Finds the number of elements.
void rehash(size_type __n)
May rehash the unordered_map.
const_iterator cend() const noexcept
size_type erase(const key_type &__x)
Erases elements according to the provided key.
iterator erase(const_iterator __first, const_iterator __last)
Erases a [__first,__last) range of elements from an unordered_multimap.
std::pair< const_iterator, const_iterator > equal_range(const key_type &__x) const
Finds a subsequence matching given key.
const_local_iterator begin(size_type __n) const
Returns a read-only (constant) iterator pointing to the first bucket element.
void max_load_factor(float __z)
Change the unordered_multimap maximum load factor.
_Hashtable::value_type value_type
Public typedefs.
local_iterator begin(size_type __n)
Returns a read/write iterator pointing to the first bucket element.
local_iterator begin(size_type __n)
Returns a read/write iterator pointing to the first bucket element.
size_type erase(const key_type &__x)
Erases elements according to the provided key.
float max_load_factor() const noexcept
Returns a positive number that the unordered_map tries to keep the load factor less than or equal to...
constexpr std::remove_reference< _Tp >::type && move(_Tp &&__t) noexcept
Convert a value to an rvalue.
Definition: move.h:101
const_iterator find(const key_type &__x) const
Tries to locate an element in an unordered_multimap.
_Hashtable::size_type size_type
Iterator-related typedefs.
iterator insert(const_iterator __hint, const value_type &__x)
Inserts a std::pair into the unordered_multimap.
allocator_type::pointer pointer
Iterator-related typedefs.
key_equal key_eq() const
Returns the key comparison object with which the unordered_map was constructed.
local_iterator end(size_type __n)
Returns a read/write iterator pointing to one past the last bucket elements.
_Hashtable::const_iterator const_iterator
Iterator-related typedefs.
Default range hashing function: use division to fold a large number into the range [0...
iterator emplace(_Args &&...__args)
Attempts to build and insert a std::pair into the unordered_multimap.
std::pair< iterator, iterator > equal_range(const key_type &__x)
Finds a subsequence matching given key.
allocator_type get_allocator() const noexcept
Returns the allocator object with which the unordered_map was constructed.
_Hashtable::difference_type difference_type
Iterator-related typedefs.
iterator end() noexcept
ISO C++ entities toplevel namespace is std.
size_type bucket_count() const noexcept
Returns the number of buckets of the unordered_map.
const_iterator cbegin() const noexcept
iterator erase(iterator __it)
Erases an element from an unordered_multimap.
std::pair< iterator, bool > emplace(_Args &&...__args)
Attempts to build and insert a std::pair into the unordered_map.
size_type size() const noexcept
Returns the size of the unordered_multimap.
_Hashtable::allocator_type allocator_type
Public typedefs.
_Hashtable::key_equal key_equal
Public typedefs.
allocator_type::const_reference const_reference
Iterator-related typedefs.
mapped_type & operator[](const key_type &__k)
Subscript ( [] ) access to unordered_map data.
iterator end() noexcept
unordered_map(_InputIterator __f, _InputIterator __l, size_type __n=0, const hasher &__hf=hasher(), const key_equal &__eql=key_equal(), const allocator_type &__a=allocator_type())
Builds an unordered_map from a range.
_Hashtable::const_iterator const_iterator
Iterator-related typedefs.
void rehash(size_type __n)
May rehash the unordered_multimap.
iterator insert(_Pair &&__x)
Inserts a std::pair into the unordered_multimap.
unordered_map & operator=(initializer_list< value_type > __l)
Unordered_map list assignment operator.
allocator_type::const_pointer const_pointer
Iterator-related typedefs.
allocator_type::reference reference
Iterator-related typedefs.
size_type count(const key_type &__x) const
Finds the number of elements.
_Hashtable::value_type value_type
Public typedefs.
iterator insert(const value_type &__x)
Inserts a std::pair into the unordered_multimap.
mapped_type & operator[](key_type &&__k)
Subscript ( [] ) access to unordered_map data.
const_iterator end() const noexcept
void insert(_InputIterator __first, _InputIterator __last)
A template function that attempts to insert a range of elements.
_Hashtable::const_local_iterator const_local_iterator
Iterator-related typedefs.
void insert(initializer_list< value_type > __l)
Attempts to insert a list of elements into the unordered_multimap.
_Hashtable::mapped_type mapped_type
Public typedefs.
const_iterator cbegin() const noexcept
iterator erase(const_iterator __first, const_iterator __last)
Erases a [__first,__last) range of elements from an unordered_map.
iterator insert(const_iterator __hint, _Pair &&__x)
Attempts to insert a std::pair into the unordered_map.
_Hashtable::local_iterator local_iterator
Iterator-related typedefs.
_Hashtable::local_iterator local_iterator
Iterator-related typedefs.
void reserve(size_type __n)
Prepare the unordered_multimap for a specified number of elements.
iterator erase(const_iterator __position)
Erases an element from an unordered_map.
_Hashtable::size_type size_type
Iterator-related typedefs.
const_local_iterator cend(size_type __n) const
Returns a read-only (constant) iterator pointing to one past the last bucket elements.
allocator_type::pointer pointer
Iterator-related typedefs.
iterator find(const key_type &__x)
Tries to locate an element in an unordered_map.
iterator insert(const_iterator __hint, const value_type &__x)
Attempts to insert a std::pair into the unordered_map.
_Hashtable::hasher hasher
Public typedefs.
_Hashtable::difference_type difference_type
Iterator-related typedefs.
const_local_iterator begin(size_type __n) const
Returns a read-only (constant) iterator pointing to the first bucket element.
A standard container composed of equivalent keys (possibly containing multiple of each key value) tha...
std::pair< iterator, bool > insert(const value_type &__x)
Attempts to insert a std::pair into the unordered_map.
iterator begin() noexcept
bool empty() const noexcept
Returns true if the unordered_map is empty.
const_iterator cend() const noexcept
_Hashtable::mapped_type mapped_type
Public typedefs.
const_local_iterator cend(size_type __n) const
Returns a read-only (constant) iterator pointing to one past the last bucket elements.
void swap(_Tp &, _Tp &) noexcept(__and_< is_nothrow_move_constructible< _Tp >, is_nothrow_move_assignable< _Tp >>::value)
Swaps two values.
Definition: move.h:166
iterator emplace_hint(const_iterator __pos, _Args &&...__args)
Attempts to build and insert a std::pair into the unordered_map.
_Hashtable::key_equal key_equal
Public typedefs.
bool empty() const noexcept
Returns true if the unordered_multimap is empty.
allocator_type::const_pointer const_pointer
Iterator-related typedefs.
_Hashtable::key_type key_type
Public typedefs.
std::pair< const_iterator, const_iterator > equal_range(const key_type &__x) const
Finds a subsequence matching given key.
hasher hash_function() const
Returns the hash functor object with which the unordered_map was constructed.
iterator erase(iterator __it)
Erases an element from an unordered_map.
unordered_map & operator=(const unordered_map &)=default
Copy assignment operator.
Primary class template hash.
std::pair< iterator, bool > insert(_Pair &&__x)
Attempts to insert a std::pair into the unordered_map.
const mapped_type & at(const key_type &__k) const
Access to unordered_map data.
key_equal key_eq() const
Returns the key comparison object with which the unordered_multimap was constructed.
Struct holding two objects of arbitrary type.
Definition: stl_pair.h:96
const_iterator find(const key_type &__x) const
Tries to locate an element in an unordered_map.
Default value for rehash policy. Bucket size is (usually) the smallest prime that keeps the load fact...
float load_factor() const noexcept
Returns the average number of elements per bucket.
iterator emplace_hint(const_iterator __pos, _Args &&...__args)
Attempts to build and insert a std::pair into the unordered_multimap.
The standard allocator, as per [20.4].
Definition: allocator.h:92
unordered_multimap & operator=(initializer_list< value_type > __l)
Unordered_multimap list assignment operator.
iterator erase(const_iterator __position)
Erases an element from an unordered_multimap.
allocator_type::reference reference
Iterator-related typedefs.
void swap(unordered_multimap &__x)
Swaps data with another unordered_multimap.
unordered_multimap(size_type __n=10, const hasher &__hf=hasher(), const key_equal &__eql=key_equal(), const allocator_type &__a=allocator_type())
Default constructor creates no elements.
size_type max_size() const noexcept
Returns the maximum size of the unordered_map.
allocator_type get_allocator() const noexcept
Returns the allocator object with which the unordered_multimap was constructed.
void swap(unordered_map &__x)
Swaps data with another unordered_map.
size_type bucket_count() const noexcept
Returns the number of buckets of the unordered_multimap.
void reserve(size_type __n)
Prepare the unordered_map for a specified number of elements.
local_iterator end(size_type __n)
Returns a read/write iterator pointing to one past the last bucket elements.
unordered_map(size_type __n=10, const hasher &__hf=hasher(), const key_equal &__eql=key_equal(), const allocator_type &__a=allocator_type())
Default constructor creates no elements.
iterator find(const key_type &__x)
Tries to locate an element in an unordered_multimap.
_Hashtable::iterator iterator
Iterator-related typedefs.
mapped_type & at(const key_type &__k)
Access to unordered_map data.