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