libstdc++
unordered_map.h
Go to the documentation of this file.
1// unordered_map implementation -*- C++ -*-
2
3// Copyright (C) 2010-2022 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
33namespace std _GLIBCXX_VISIBILITY(default)
34{
35_GLIBCXX_BEGIN_NAMESPACE_VERSION
36_GLIBCXX_BEGIN_NAMESPACE_CONTAINER
37
38 /// Base types for unordered_map.
39 template<bool _Cache>
40 using __umap_traits = __detail::_Hashtable_traits<_Cache, false, true>;
41
42 template<typename _Key,
43 typename _Tp,
44 typename _Hash = hash<_Key>,
45 typename _Pred = std::equal_to<_Key>,
48 using __umap_hashtable = _Hashtable<_Key, std::pair<const _Key, _Tp>,
49 _Alloc, __detail::_Select1st,
50 _Pred, _Hash,
51 __detail::_Mod_range_hashing,
52 __detail::_Default_ranged_hash,
53 __detail::_Prime_rehash_policy, _Tr>;
54
55 /// Base types for unordered_multimap.
56 template<bool _Cache>
57 using __ummap_traits = __detail::_Hashtable_traits<_Cache, false, false>;
58
59 template<typename _Key,
60 typename _Tp,
61 typename _Hash = hash<_Key>,
62 typename _Pred = std::equal_to<_Key>,
65 using __ummap_hashtable = _Hashtable<_Key, std::pair<const _Key, _Tp>,
66 _Alloc, __detail::_Select1st,
67 _Pred, _Hash,
68 __detail::_Mod_range_hashing,
69 __detail::_Default_ranged_hash,
70 __detail::_Prime_rehash_policy, _Tr>;
71
72 template<class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
74
75 /**
76 * @brief A standard container composed of unique keys (containing
77 * at most one of each key value) that associates values of another type
78 * with the keys.
79 *
80 * @ingroup unordered_associative_containers
81 *
82 * @tparam _Key Type of key objects.
83 * @tparam _Tp Type of mapped objects.
84 * @tparam _Hash Hashing function object type, defaults to hash<_Value>.
85 * @tparam _Pred Predicate function object type, defaults
86 * to equal_to<_Value>.
87 * @tparam _Alloc Allocator type, defaults to
88 * std::allocator<std::pair<const _Key, _Tp>>.
89 *
90 * Meets the requirements of a <a href="tables.html#65">container</a>, and
91 * <a href="tables.html#xx">unordered associative container</a>
92 *
93 * The resulting value type of the container is std::pair<const _Key, _Tp>.
94 *
95 * Base is _Hashtable, dispatched at compile time via template
96 * alias __umap_hashtable.
97 */
98 template<typename _Key, typename _Tp,
99 typename _Hash = hash<_Key>,
100 typename _Pred = equal_to<_Key>,
101 typename _Alloc = allocator<std::pair<const _Key, _Tp>>>
103 {
104 typedef __umap_hashtable<_Key, _Tp, _Hash, _Pred, _Alloc> _Hashtable;
105 _Hashtable _M_h;
106
107 public:
108 // typedefs:
109 ///@{
110 /// Public typedefs.
111 typedef typename _Hashtable::key_type key_type;
112 typedef typename _Hashtable::value_type value_type;
113 typedef typename _Hashtable::mapped_type mapped_type;
114 typedef typename _Hashtable::hasher hasher;
115 typedef typename _Hashtable::key_equal key_equal;
116 typedef typename _Hashtable::allocator_type allocator_type;
117 ///@}
118
119 ///@{
120 /// Iterator-related typedefs.
121 typedef typename _Hashtable::pointer pointer;
122 typedef typename _Hashtable::const_pointer const_pointer;
123 typedef typename _Hashtable::reference reference;
124 typedef typename _Hashtable::const_reference const_reference;
125 typedef typename _Hashtable::iterator iterator;
126 typedef typename _Hashtable::const_iterator const_iterator;
127 typedef typename _Hashtable::local_iterator local_iterator;
128 typedef typename _Hashtable::const_local_iterator const_local_iterator;
129 typedef typename _Hashtable::size_type size_type;
130 typedef typename _Hashtable::difference_type difference_type;
131 ///@}
132
133#if __cplusplus > 201402L
134 using node_type = typename _Hashtable::node_type;
135 using insert_return_type = typename _Hashtable::insert_return_type;
136#endif
137
138 //construct/destroy/copy
139
140 /// Default constructor.
141 unordered_map() = default;
142
143 /**
144 * @brief Default constructor creates no elements.
145 * @param __n Minimal initial number of buckets.
146 * @param __hf A hash functor.
147 * @param __eql A key equality functor.
148 * @param __a An allocator object.
149 */
150 explicit
152 const hasher& __hf = hasher(),
153 const key_equal& __eql = key_equal(),
154 const allocator_type& __a = allocator_type())
155 : _M_h(__n, __hf, __eql, __a)
156 { }
157
158 /**
159 * @brief Builds an %unordered_map from a range.
160 * @param __first An input iterator.
161 * @param __last An input iterator.
162 * @param __n Minimal initial number of buckets.
163 * @param __hf A hash functor.
164 * @param __eql A key equality functor.
165 * @param __a An allocator object.
166 *
167 * Create an %unordered_map consisting of copies of the elements from
168 * [__first,__last). This is linear in N (where N is
169 * distance(__first,__last)).
170 */
171 template<typename _InputIterator>
172 unordered_map(_InputIterator __first, _InputIterator __last,
173 size_type __n = 0,
174 const hasher& __hf = hasher(),
175 const key_equal& __eql = key_equal(),
176 const allocator_type& __a = allocator_type())
177 : _M_h(__first, __last, __n, __hf, __eql, __a)
178 { }
179
180 /// Copy constructor.
181 unordered_map(const unordered_map&) = default;
182
183 /// Move constructor.
185
186 /**
187 * @brief Creates an %unordered_map with no elements.
188 * @param __a An allocator object.
189 */
190 explicit
192 : _M_h(__a)
193 { }
194
195 /*
196 * @brief Copy constructor with allocator argument.
197 * @param __uset Input %unordered_map to copy.
198 * @param __a An allocator object.
199 */
200 unordered_map(const unordered_map& __umap,
201 const allocator_type& __a)
202 : _M_h(__umap._M_h, __a)
203 { }
204
205 /*
206 * @brief Move constructor with allocator argument.
207 * @param __uset Input %unordered_map to move.
208 * @param __a An allocator object.
209 */
211 const allocator_type& __a)
212 noexcept( noexcept(_Hashtable(std::move(__umap._M_h), __a)) )
213 : _M_h(std::move(__umap._M_h), __a)
214 { }
215
216 /**
217 * @brief Builds an %unordered_map from an initializer_list.
218 * @param __l An initializer_list.
219 * @param __n Minimal initial number of buckets.
220 * @param __hf A hash functor.
221 * @param __eql A key equality functor.
222 * @param __a An allocator object.
223 *
224 * Create an %unordered_map consisting of copies of the elements in the
225 * list. This is linear in N (where N is @a __l.size()).
226 */
228 size_type __n = 0,
229 const hasher& __hf = hasher(),
230 const key_equal& __eql = key_equal(),
231 const allocator_type& __a = allocator_type())
232 : _M_h(__l, __n, __hf, __eql, __a)
233 { }
234
235 unordered_map(size_type __n, const allocator_type& __a)
236 : unordered_map(__n, hasher(), key_equal(), __a)
237 { }
238
239 unordered_map(size_type __n, const hasher& __hf,
240 const allocator_type& __a)
241 : unordered_map(__n, __hf, key_equal(), __a)
242 { }
243
244 template<typename _InputIterator>
245 unordered_map(_InputIterator __first, _InputIterator __last,
246 size_type __n,
247 const allocator_type& __a)
248 : unordered_map(__first, __last, __n, hasher(), key_equal(), __a)
249 { }
250
251 template<typename _InputIterator>
252 unordered_map(_InputIterator __first, _InputIterator __last,
253 size_type __n, const hasher& __hf,
254 const allocator_type& __a)
255 : unordered_map(__first, __last, __n, __hf, key_equal(), __a)
256 { }
257
258 unordered_map(initializer_list<value_type> __l,
259 size_type __n,
260 const allocator_type& __a)
261 : unordered_map(__l, __n, hasher(), key_equal(), __a)
262 { }
263
264 unordered_map(initializer_list<value_type> __l,
265 size_type __n, const hasher& __hf,
266 const allocator_type& __a)
267 : unordered_map(__l, __n, __hf, key_equal(), __a)
268 { }
269
270 /// Copy assignment operator.
272 operator=(const unordered_map&) = default;
273
274 /// Move assignment operator.
277
278 /**
279 * @brief %Unordered_map list assignment operator.
280 * @param __l An initializer_list.
281 *
282 * This function fills an %unordered_map with copies of the elements in
283 * the initializer list @a __l.
284 *
285 * Note that the assignment completely changes the %unordered_map and
286 * that the resulting %unordered_map's size is the same as the number
287 * of elements assigned.
288 */
291 {
292 _M_h = __l;
293 return *this;
294 }
295
296 /// Returns the allocator object used by the %unordered_map.
298 get_allocator() const noexcept
299 { return _M_h.get_allocator(); }
300
301 // size and capacity:
302
303 /// Returns true if the %unordered_map is empty.
304 _GLIBCXX_NODISCARD bool
305 empty() const noexcept
306 { return _M_h.empty(); }
307
308 /// Returns the size of the %unordered_map.
310 size() const noexcept
311 { return _M_h.size(); }
312
313 /// Returns the maximum size of the %unordered_map.
315 max_size() const noexcept
316 { return _M_h.max_size(); }
317
318 // iterators.
319
320 /**
321 * Returns a read/write iterator that points to the first element in the
322 * %unordered_map.
323 */
325 begin() noexcept
326 { return _M_h.begin(); }
327
328 ///@{
329 /**
330 * Returns a read-only (constant) iterator that points to the first
331 * element in the %unordered_map.
332 */
334 begin() const noexcept
335 { return _M_h.begin(); }
336
338 cbegin() const noexcept
339 { return _M_h.begin(); }
340 ///@}
341
342 /**
343 * Returns a read/write iterator that points one past the last element in
344 * the %unordered_map.
345 */
347 end() noexcept
348 { return _M_h.end(); }
349
350 ///@{
351 /**
352 * Returns a read-only (constant) iterator that points one past the last
353 * element in the %unordered_map.
354 */
356 end() const noexcept
357 { return _M_h.end(); }
358
360 cend() const noexcept
361 { return _M_h.end(); }
362 ///@}
363
364 // modifiers.
365
366 /**
367 * @brief Attempts to build and insert a std::pair into the
368 * %unordered_map.
369 *
370 * @param __args Arguments used to generate a new pair instance (see
371 * std::piecewise_contruct for passing arguments to each
372 * part of the pair constructor).
373 *
374 * @return A pair, of which the first element is an iterator that points
375 * to the possibly inserted pair, and the second is a bool that
376 * is true if the pair was actually inserted.
377 *
378 * This function attempts to build and insert a (key, value) %pair into
379 * the %unordered_map.
380 * An %unordered_map relies on unique keys and thus a %pair is only
381 * inserted if its first element (the key) is not already present in the
382 * %unordered_map.
383 *
384 * Insertion requires amortized constant time.
385 */
386 template<typename... _Args>
388 emplace(_Args&&... __args)
389 { return _M_h.emplace(std::forward<_Args>(__args)...); }
390
391 /**
392 * @brief Attempts to build and insert a std::pair into the
393 * %unordered_map.
394 *
395 * @param __pos An iterator that serves as a hint as to where the pair
396 * should be inserted.
397 * @param __args Arguments used to generate a new pair instance (see
398 * std::piecewise_contruct for passing arguments to each
399 * part of the pair constructor).
400 * @return An iterator that points to the element with key of the
401 * std::pair built from @a __args (may or may not be that
402 * std::pair).
403 *
404 * This function is not concerned about whether the insertion took place,
405 * and thus does not return a boolean like the single-argument emplace()
406 * does.
407 * Note that the first parameter is only a hint and can potentially
408 * improve the performance of the insertion process. A bad hint would
409 * cause no gains in efficiency.
410 *
411 * See
412 * https://gcc.gnu.org/onlinedocs/libstdc++/manual/associative.html#containers.associative.insert_hints
413 * for more on @a hinting.
414 *
415 * Insertion requires amortized constant time.
416 */
417 template<typename... _Args>
419 emplace_hint(const_iterator __pos, _Args&&... __args)
420 { return _M_h.emplace_hint(__pos, std::forward<_Args>(__args)...); }
421
422#if __cplusplus > 201402L
423 /// Extract a node.
424 node_type
426 {
427 __glibcxx_assert(__pos != end());
428 return _M_h.extract(__pos);
429 }
430
431 /// Extract a node.
432 node_type
433 extract(const key_type& __key)
434 { return _M_h.extract(__key); }
435
436 /// Re-insert an extracted node.
437 insert_return_type
438 insert(node_type&& __nh)
439 { return _M_h._M_reinsert_node(std::move(__nh)); }
440
441 /// Re-insert an extracted node.
443 insert(const_iterator, node_type&& __nh)
444 { return _M_h._M_reinsert_node(std::move(__nh)).position; }
445
446#define __cpp_lib_unordered_map_try_emplace 201411L
447 /**
448 * @brief Attempts to build and insert a std::pair into the
449 * %unordered_map.
450 *
451 * @param __k Key to use for finding a possibly existing pair in
452 * the unordered_map.
453 * @param __args Arguments used to generate the .second for a
454 * new pair instance.
455 *
456 * @return A pair, of which the first element is an iterator that points
457 * to the possibly inserted pair, and the second is a bool that
458 * is true if the pair was actually inserted.
459 *
460 * This function attempts to build and insert a (key, value) %pair into
461 * the %unordered_map.
462 * An %unordered_map relies on unique keys and thus a %pair is only
463 * inserted if its first element (the key) is not already present in the
464 * %unordered_map.
465 * If a %pair is not inserted, this function has no effect.
466 *
467 * Insertion requires amortized constant time.
468 */
469 template <typename... _Args>
471 try_emplace(const key_type& __k, _Args&&... __args)
472 {
473 return _M_h.try_emplace(cend(), __k, std::forward<_Args>(__args)...);
474 }
475
476 // move-capable overload
477 template <typename... _Args>
479 try_emplace(key_type&& __k, _Args&&... __args)
480 {
481 return _M_h.try_emplace(cend(), std::move(__k),
482 std::forward<_Args>(__args)...);
483 }
484
485 /**
486 * @brief Attempts to build and insert a std::pair into the
487 * %unordered_map.
488 *
489 * @param __hint An iterator that serves as a hint as to where the pair
490 * should be inserted.
491 * @param __k Key to use for finding a possibly existing pair in
492 * the unordered_map.
493 * @param __args Arguments used to generate the .second for a
494 * new pair instance.
495 * @return An iterator that points to the element with key of the
496 * std::pair built from @a __args (may or may not be that
497 * std::pair).
498 *
499 * This function is not concerned about whether the insertion took place,
500 * and thus does not return a boolean like the single-argument emplace()
501 * does. However, if insertion did not take place,
502 * this function has no effect.
503 * Note that the first parameter is only a hint and can potentially
504 * improve the performance of the insertion process. A bad hint would
505 * cause no gains in efficiency.
506 *
507 * See
508 * https://gcc.gnu.org/onlinedocs/libstdc++/manual/associative.html#containers.associative.insert_hints
509 * for more on @a hinting.
510 *
511 * Insertion requires amortized constant time.
512 */
513 template <typename... _Args>
516 _Args&&... __args)
517 {
518 return _M_h.try_emplace(__hint, __k,
519 std::forward<_Args>(__args)...).first;
520 }
521
522 // move-capable overload
523 template <typename... _Args>
525 try_emplace(const_iterator __hint, key_type&& __k, _Args&&... __args)
526 {
527 return _M_h.try_emplace(__hint, std::move(__k),
528 std::forward<_Args>(__args)...).first;
529 }
530#endif // C++17
531
532 ///@{
533 /**
534 * @brief Attempts to insert a std::pair into the %unordered_map.
535
536 * @param __x Pair to be inserted (see std::make_pair for easy
537 * creation of pairs).
538 *
539 * @return A pair, of which the first element is an iterator that
540 * points to the possibly inserted pair, and the second is
541 * a bool that is true if the pair was actually inserted.
542 *
543 * This function attempts to insert a (key, value) %pair into the
544 * %unordered_map. An %unordered_map relies on unique keys and thus a
545 * %pair is only inserted if its first element (the key) is not already
546 * present in the %unordered_map.
547 *
548 * Insertion requires amortized constant time.
549 */
551 insert(const value_type& __x)
552 { return _M_h.insert(__x); }
553
554 // _GLIBCXX_RESOLVE_LIB_DEFECTS
555 // 2354. Unnecessary copying when inserting into maps with braced-init
558 { return _M_h.insert(std::move(__x)); }
559
560 template<typename _Pair>
561 __enable_if_t<is_constructible<value_type, _Pair&&>::value,
563 insert(_Pair&& __x)
564 { return _M_h.emplace(std::forward<_Pair>(__x)); }
565 ///@}
566
567 ///@{
568 /**
569 * @brief Attempts to insert a std::pair into the %unordered_map.
570 * @param __hint An iterator that serves as a hint as to where the
571 * pair should be inserted.
572 * @param __x Pair to be inserted (see std::make_pair for easy creation
573 * of pairs).
574 * @return An iterator that points to the element with key of
575 * @a __x (may or may not be the %pair passed in).
576 *
577 * This function is not concerned about whether the insertion took place,
578 * and thus does not return a boolean like the single-argument insert()
579 * does. Note that the first parameter is only a hint and can
580 * potentially improve the performance of the insertion process. A bad
581 * hint would cause no gains in efficiency.
582 *
583 * See
584 * https://gcc.gnu.org/onlinedocs/libstdc++/manual/associative.html#containers.associative.insert_hints
585 * for more on @a hinting.
586 *
587 * Insertion requires amortized constant time.
588 */
590 insert(const_iterator __hint, const value_type& __x)
591 { return _M_h.insert(__hint, __x); }
592
593 // _GLIBCXX_RESOLVE_LIB_DEFECTS
594 // 2354. Unnecessary copying when inserting into maps with braced-init
597 { return _M_h.insert(__hint, std::move(__x)); }
598
599 template<typename _Pair>
600 __enable_if_t<is_constructible<value_type, _Pair&&>::value, iterator>
601 insert(const_iterator __hint, _Pair&& __x)
602 { return _M_h.emplace_hint(__hint, std::forward<_Pair>(__x)); }
603 ///@}
604
605 /**
606 * @brief A template function that attempts to insert a range of
607 * elements.
608 * @param __first Iterator pointing to the start of the range to be
609 * inserted.
610 * @param __last Iterator pointing to the end of the range.
611 *
612 * Complexity similar to that of the range constructor.
613 */
614 template<typename _InputIterator>
615 void
616 insert(_InputIterator __first, _InputIterator __last)
617 { _M_h.insert(__first, __last); }
618
619 /**
620 * @brief Attempts to insert a list of elements into the %unordered_map.
621 * @param __l A std::initializer_list<value_type> of elements
622 * to be inserted.
623 *
624 * Complexity similar to that of the range constructor.
625 */
626 void
628 { _M_h.insert(__l); }
629
630
631#if __cplusplus > 201402L
632 /**
633 * @brief Attempts to insert a std::pair into the %unordered_map.
634 * @param __k Key to use for finding a possibly existing pair in
635 * the map.
636 * @param __obj Argument used to generate the .second for a pair
637 * instance.
638 *
639 * @return A pair, of which the first element is an iterator that
640 * points to the possibly inserted pair, and the second is
641 * a bool that is true if the pair was actually inserted.
642 *
643 * This function attempts to insert a (key, value) %pair into the
644 * %unordered_map. An %unordered_map relies on unique keys and thus a
645 * %pair is only inserted if its first element (the key) is not already
646 * present in the %unordered_map.
647 * If the %pair was already in the %unordered_map, the .second of
648 * the %pair is assigned from __obj.
649 *
650 * Insertion requires amortized constant time.
651 */
652 template <typename _Obj>
654 insert_or_assign(const key_type& __k, _Obj&& __obj)
655 {
656 auto __ret = _M_h.try_emplace(cend(), __k,
657 std::forward<_Obj>(__obj));
658 if (!__ret.second)
659 __ret.first->second = std::forward<_Obj>(__obj);
660 return __ret;
661 }
662
663 // move-capable overload
664 template <typename _Obj>
666 insert_or_assign(key_type&& __k, _Obj&& __obj)
667 {
668 auto __ret = _M_h.try_emplace(cend(), std::move(__k),
669 std::forward<_Obj>(__obj));
670 if (!__ret.second)
671 __ret.first->second = std::forward<_Obj>(__obj);
672 return __ret;
673 }
674
675 /**
676 * @brief Attempts to insert a std::pair into the %unordered_map.
677 * @param __hint An iterator that serves as a hint as to where the
678 * pair should be inserted.
679 * @param __k Key to use for finding a possibly existing pair in
680 * the unordered_map.
681 * @param __obj Argument used to generate the .second for a pair
682 * instance.
683 * @return An iterator that points to the element with key of
684 * @a __x (may or may not be the %pair passed in).
685 *
686 * This function is not concerned about whether the insertion took place,
687 * and thus does not return a boolean like the single-argument insert()
688 * does.
689 * If the %pair was already in the %unordered map, the .second of
690 * the %pair is assigned from __obj.
691 * Note that the first parameter is only a hint and can
692 * potentially improve the performance of the insertion process. A bad
693 * hint would cause no gains in efficiency.
694 *
695 * See
696 * https://gcc.gnu.org/onlinedocs/libstdc++/manual/associative.html#containers.associative.insert_hints
697 * for more on @a hinting.
698 *
699 * Insertion requires amortized constant time.
700 */
701 template <typename _Obj>
704 _Obj&& __obj)
705 {
706 auto __ret = _M_h.try_emplace(__hint, __k, std::forward<_Obj>(__obj));
707 if (!__ret.second)
708 __ret.first->second = std::forward<_Obj>(__obj);
709 return __ret.first;
710 }
711
712 // move-capable overload
713 template <typename _Obj>
715 insert_or_assign(const_iterator __hint, key_type&& __k, _Obj&& __obj)
716 {
717 auto __ret = _M_h.try_emplace(__hint, std::move(__k),
718 std::forward<_Obj>(__obj));
719 if (!__ret.second)
720 __ret.first->second = std::forward<_Obj>(__obj);
721 return __ret.first;
722 }
723#endif
724
725 ///@{
726 /**
727 * @brief Erases an element from an %unordered_map.
728 * @param __position An iterator pointing to the element to be erased.
729 * @return An iterator pointing to the element immediately following
730 * @a __position prior to the element being erased. If no such
731 * element exists, end() is returned.
732 *
733 * This function erases an element, pointed to by the given iterator,
734 * from an %unordered_map.
735 * Note that this function only erases the element, and that if the
736 * element is itself a pointer, the pointed-to memory is not touched in
737 * any way. Managing the pointer is the user's responsibility.
738 */
741 { return _M_h.erase(__position); }
742
743 // LWG 2059.
745 erase(iterator __position)
746 { return _M_h.erase(__position); }
747 ///@}
748
749 /**
750 * @brief Erases elements according to the provided key.
751 * @param __x Key of element to be erased.
752 * @return The number of elements erased.
753 *
754 * This function erases all the elements located by the given key from
755 * an %unordered_map. For an %unordered_map the result of this function
756 * can only be 0 (not present) or 1 (present).
757 * Note that this function only erases the element, and that if the
758 * element is itself a pointer, the pointed-to memory is not touched in
759 * any way. Managing the pointer is the user's responsibility.
760 */
762 erase(const key_type& __x)
763 { return _M_h.erase(__x); }
764
765 /**
766 * @brief Erases a [__first,__last) range of elements from an
767 * %unordered_map.
768 * @param __first Iterator pointing to the start of the range to be
769 * erased.
770 * @param __last Iterator pointing to the end of the range to
771 * be erased.
772 * @return The iterator @a __last.
773 *
774 * This function erases a sequence of elements from an %unordered_map.
775 * Note that this function only erases the elements, and that if
776 * the element is itself a pointer, the pointed-to memory is not touched
777 * in any way. Managing the pointer is the user's responsibility.
778 */
781 { return _M_h.erase(__first, __last); }
782
783 /**
784 * Erases all elements in an %unordered_map.
785 * Note that this function only erases the elements, and that if the
786 * elements themselves are pointers, the pointed-to memory is not touched
787 * in any way. Managing the pointer is the user's responsibility.
788 */
789 void
790 clear() noexcept
791 { _M_h.clear(); }
792
793 /**
794 * @brief Swaps data with another %unordered_map.
795 * @param __x An %unordered_map of the same element and allocator
796 * types.
797 *
798 * This exchanges the elements between two %unordered_map in constant
799 * time.
800 * Note that the global std::swap() function is specialized such that
801 * std::swap(m1,m2) will feed to this function.
802 */
803 void
805 noexcept( noexcept(_M_h.swap(__x._M_h)) )
806 { _M_h.swap(__x._M_h); }
807
808#if __cplusplus > 201402L
809 template<typename, typename, typename>
810 friend class std::_Hash_merge_helper;
811
812 template<typename _H2, typename _P2>
813 void
815 {
816 using _Merge_helper = _Hash_merge_helper<unordered_map, _H2, _P2>;
817 _M_h._M_merge_unique(_Merge_helper::_S_get_table(__source));
818 }
819
820 template<typename _H2, typename _P2>
821 void
822 merge(unordered_map<_Key, _Tp, _H2, _P2, _Alloc>&& __source)
823 { merge(__source); }
824
825 template<typename _H2, typename _P2>
826 void
827 merge(unordered_multimap<_Key, _Tp, _H2, _P2, _Alloc>& __source)
828 {
829 using _Merge_helper = _Hash_merge_helper<unordered_map, _H2, _P2>;
830 _M_h._M_merge_unique(_Merge_helper::_S_get_table(__source));
831 }
832
833 template<typename _H2, typename _P2>
834 void
835 merge(unordered_multimap<_Key, _Tp, _H2, _P2, _Alloc>&& __source)
836 { merge(__source); }
837#endif // C++17
838
839 // observers.
840
841 /// Returns the hash functor object with which the %unordered_map was
842 /// constructed.
843 hasher
845 { return _M_h.hash_function(); }
846
847 /// Returns the key comparison object with which the %unordered_map was
848 /// constructed.
850 key_eq() const
851 { return _M_h.key_eq(); }
852
853 // lookup.
854
855 ///@{
856 /**
857 * @brief Tries to locate an element in an %unordered_map.
858 * @param __x Key to be located.
859 * @return Iterator pointing to sought-after element, or end() if not
860 * found.
861 *
862 * This function takes a key and tries to locate the element with which
863 * the key matches. If successful the function returns an iterator
864 * pointing to the sought after element. If unsuccessful it returns the
865 * past-the-end ( @c end() ) iterator.
866 */
868 find(const key_type& __x)
869 { return _M_h.find(__x); }
870
871#if __cplusplus > 201703L
872 template<typename _Kt>
873 auto
874 find(const _Kt& __x) -> decltype(_M_h._M_find_tr(__x))
875 { return _M_h._M_find_tr(__x); }
876#endif
877
879 find(const key_type& __x) const
880 { return _M_h.find(__x); }
881
882#if __cplusplus > 201703L
883 template<typename _Kt>
884 auto
885 find(const _Kt& __x) const -> decltype(_M_h._M_find_tr(__x))
886 { return _M_h._M_find_tr(__x); }
887#endif
888 ///@}
889
890 ///@{
891 /**
892 * @brief Finds the number of elements.
893 * @param __x Key to count.
894 * @return Number of elements with specified key.
895 *
896 * This function only makes sense for %unordered_multimap; for
897 * %unordered_map the result will either be 0 (not present) or 1
898 * (present).
899 */
901 count(const key_type& __x) const
902 { return _M_h.count(__x); }
903
904#if __cplusplus > 201703L
905 template<typename _Kt>
906 auto
907 count(const _Kt& __x) const -> decltype(_M_h._M_count_tr(__x))
908 { return _M_h._M_count_tr(__x); }
909#endif
910 ///@}
911
912#if __cplusplus > 201703L
913 ///@{
914 /**
915 * @brief Finds whether an element with the given key exists.
916 * @param __x Key of elements to be located.
917 * @return True if there is any element with the specified key.
918 */
919 bool
920 contains(const key_type& __x) const
921 { return _M_h.find(__x) != _M_h.end(); }
922
923 template<typename _Kt>
924 auto
925 contains(const _Kt& __x) const
926 -> decltype(_M_h._M_find_tr(__x), void(), true)
927 { return _M_h._M_find_tr(__x) != _M_h.end(); }
928 ///@}
929#endif
930
931 ///@{
932 /**
933 * @brief Finds a subsequence matching given key.
934 * @param __x Key to be located.
935 * @return Pair of iterators that possibly points to the subsequence
936 * matching given key.
937 *
938 * This function probably only makes sense for %unordered_multimap.
939 */
942 { return _M_h.equal_range(__x); }
943
944#if __cplusplus > 201703L
945 template<typename _Kt>
946 auto
947 equal_range(const _Kt& __x)
948 -> decltype(_M_h._M_equal_range_tr(__x))
949 { return _M_h._M_equal_range_tr(__x); }
950#endif
951
953 equal_range(const key_type& __x) const
954 { return _M_h.equal_range(__x); }
955
956#if __cplusplus > 201703L
957 template<typename _Kt>
958 auto
959 equal_range(const _Kt& __x) const
960 -> decltype(_M_h._M_equal_range_tr(__x))
961 { return _M_h._M_equal_range_tr(__x); }
962#endif
963 ///@}
964
965 ///@{
966 /**
967 * @brief Subscript ( @c [] ) access to %unordered_map data.
968 * @param __k The key for which data should be retrieved.
969 * @return A reference to the data of the (key,data) %pair.
970 *
971 * Allows for easy lookup with the subscript ( @c [] )operator. Returns
972 * data associated with the key specified in subscript. If the key does
973 * not exist, a pair with that key is created using default values, which
974 * is then returned.
975 *
976 * Lookup requires constant time.
977 */
980 { return _M_h[__k]; }
981
984 { return _M_h[std::move(__k)]; }
985 ///@}
986
987 ///@{
988 /**
989 * @brief Access to %unordered_map data.
990 * @param __k The key for which data should be retrieved.
991 * @return A reference to the data whose key is equal to @a __k, if
992 * such a data is present in the %unordered_map.
993 * @throw std::out_of_range If no such data is present.
994 */
996 at(const key_type& __k)
997 { return _M_h.at(__k); }
998
999 const mapped_type&
1000 at(const key_type& __k) const
1001 { return _M_h.at(__k); }
1002 ///@}
1003
1004 // bucket interface.
1005
1006 /// Returns the number of buckets of the %unordered_map.
1007 size_type
1008 bucket_count() const noexcept
1009 { return _M_h.bucket_count(); }
1010
1011 /// Returns the maximum number of buckets of the %unordered_map.
1012 size_type
1013 max_bucket_count() const noexcept
1014 { return _M_h.max_bucket_count(); }
1015
1016 /*
1017 * @brief Returns the number of elements in a given bucket.
1018 * @param __n A bucket index.
1019 * @return The number of elements in the bucket.
1020 */
1021 size_type
1022 bucket_size(size_type __n) const
1023 { return _M_h.bucket_size(__n); }
1024
1025 /*
1026 * @brief Returns the bucket index of a given element.
1027 * @param __key A key instance.
1028 * @return The key bucket index.
1029 */
1030 size_type
1031 bucket(const key_type& __key) const
1032 { return _M_h.bucket(__key); }
1033
1034 /**
1035 * @brief Returns a read/write iterator pointing to the first bucket
1036 * element.
1037 * @param __n The bucket index.
1038 * @return A read/write local iterator.
1039 */
1042 { return _M_h.begin(__n); }
1043
1044 ///@{
1045 /**
1046 * @brief Returns a read-only (constant) iterator pointing to the first
1047 * bucket element.
1048 * @param __n The bucket index.
1049 * @return A read-only local iterator.
1050 */
1052 begin(size_type __n) const
1053 { return _M_h.begin(__n); }
1054
1057 { return _M_h.cbegin(__n); }
1058 ///@}
1059
1060 /**
1061 * @brief Returns a read/write iterator pointing to one past the last
1062 * bucket elements.
1063 * @param __n The bucket index.
1064 * @return A read/write local iterator.
1065 */
1068 { return _M_h.end(__n); }
1069
1070 ///@{
1071 /**
1072 * @brief Returns a read-only (constant) iterator pointing to one past
1073 * the last bucket elements.
1074 * @param __n The bucket index.
1075 * @return A read-only local iterator.
1076 */
1078 end(size_type __n) const
1079 { return _M_h.end(__n); }
1080
1082 cend(size_type __n) const
1083 { return _M_h.cend(__n); }
1084 ///@}
1085
1086 // hash policy.
1087
1088 /// Returns the average number of elements per bucket.
1089 float
1090 load_factor() const noexcept
1091 { return _M_h.load_factor(); }
1092
1093 /// Returns a positive number that the %unordered_map tries to keep the
1094 /// load factor less than or equal to.
1095 float
1096 max_load_factor() const noexcept
1097 { return _M_h.max_load_factor(); }
1098
1099 /**
1100 * @brief Change the %unordered_map maximum load factor.
1101 * @param __z The new maximum load factor.
1102 */
1103 void
1105 { _M_h.max_load_factor(__z); }
1106
1107 /**
1108 * @brief May rehash the %unordered_map.
1109 * @param __n The new number of buckets.
1110 *
1111 * Rehash will occur only if the new number of buckets respect the
1112 * %unordered_map maximum load factor.
1113 */
1114 void
1116 { _M_h.rehash(__n); }
1117
1118 /**
1119 * @brief Prepare the %unordered_map for a specified number of
1120 * elements.
1121 * @param __n Number of elements required.
1122 *
1123 * Same as rehash(ceil(n / max_load_factor())).
1124 */
1125 void
1127 { _M_h.reserve(__n); }
1128
1129 template<typename _Key1, typename _Tp1, typename _Hash1, typename _Pred1,
1130 typename _Alloc1>
1131 friend bool
1134 };
1135
1136#if __cpp_deduction_guides >= 201606
1137
1138 template<typename _InputIterator,
1139 typename _Hash = hash<__iter_key_t<_InputIterator>>,
1140 typename _Pred = equal_to<__iter_key_t<_InputIterator>>,
1141 typename _Allocator = allocator<__iter_to_alloc_t<_InputIterator>>,
1142 typename = _RequireInputIter<_InputIterator>,
1143 typename = _RequireNotAllocatorOrIntegral<_Hash>,
1144 typename = _RequireNotAllocator<_Pred>,
1145 typename = _RequireAllocator<_Allocator>>
1146 unordered_map(_InputIterator, _InputIterator,
1148 _Hash = _Hash(), _Pred = _Pred(), _Allocator = _Allocator())
1149 -> unordered_map<__iter_key_t<_InputIterator>,
1150 __iter_val_t<_InputIterator>,
1151 _Hash, _Pred, _Allocator>;
1152
1153 template<typename _Key, typename _Tp, typename _Hash = hash<_Key>,
1154 typename _Pred = equal_to<_Key>,
1155 typename _Allocator = allocator<pair<const _Key, _Tp>>,
1156 typename = _RequireNotAllocatorOrIntegral<_Hash>,
1157 typename = _RequireNotAllocator<_Pred>,
1158 typename = _RequireAllocator<_Allocator>>
1159 unordered_map(initializer_list<pair<_Key, _Tp>>,
1161 _Hash = _Hash(), _Pred = _Pred(), _Allocator = _Allocator())
1162 -> unordered_map<_Key, _Tp, _Hash, _Pred, _Allocator>;
1163
1164 template<typename _InputIterator, typename _Allocator,
1165 typename = _RequireInputIter<_InputIterator>,
1166 typename = _RequireAllocator<_Allocator>>
1167 unordered_map(_InputIterator, _InputIterator,
1168 typename unordered_map<int, int>::size_type, _Allocator)
1169 -> unordered_map<__iter_key_t<_InputIterator>,
1170 __iter_val_t<_InputIterator>,
1171 hash<__iter_key_t<_InputIterator>>,
1172 equal_to<__iter_key_t<_InputIterator>>,
1173 _Allocator>;
1174
1175 template<typename _InputIterator, typename _Allocator,
1176 typename = _RequireInputIter<_InputIterator>,
1177 typename = _RequireAllocator<_Allocator>>
1178 unordered_map(_InputIterator, _InputIterator, _Allocator)
1179 -> unordered_map<__iter_key_t<_InputIterator>,
1180 __iter_val_t<_InputIterator>,
1181 hash<__iter_key_t<_InputIterator>>,
1182 equal_to<__iter_key_t<_InputIterator>>,
1183 _Allocator>;
1184
1185 template<typename _InputIterator, typename _Hash, typename _Allocator,
1186 typename = _RequireInputIter<_InputIterator>,
1187 typename = _RequireNotAllocatorOrIntegral<_Hash>,
1188 typename = _RequireAllocator<_Allocator>>
1189 unordered_map(_InputIterator, _InputIterator,
1191 _Hash, _Allocator)
1192 -> unordered_map<__iter_key_t<_InputIterator>,
1193 __iter_val_t<_InputIterator>, _Hash,
1194 equal_to<__iter_key_t<_InputIterator>>, _Allocator>;
1195
1196 template<typename _Key, typename _Tp, typename _Allocator,
1197 typename = _RequireAllocator<_Allocator>>
1198 unordered_map(initializer_list<pair<_Key, _Tp>>,
1200 _Allocator)
1201 -> unordered_map<_Key, _Tp, hash<_Key>, equal_to<_Key>, _Allocator>;
1202
1203 template<typename _Key, typename _Tp, typename _Allocator,
1204 typename = _RequireAllocator<_Allocator>>
1205 unordered_map(initializer_list<pair<_Key, _Tp>>, _Allocator)
1206 -> unordered_map<_Key, _Tp, hash<_Key>, equal_to<_Key>, _Allocator>;
1207
1208 template<typename _Key, typename _Tp, typename _Hash, typename _Allocator,
1209 typename = _RequireNotAllocatorOrIntegral<_Hash>,
1210 typename = _RequireAllocator<_Allocator>>
1211 unordered_map(initializer_list<pair<_Key, _Tp>>,
1213 _Hash, _Allocator)
1214 -> unordered_map<_Key, _Tp, _Hash, equal_to<_Key>, _Allocator>;
1215
1216#endif
1217
1218 /**
1219 * @brief A standard container composed of equivalent keys
1220 * (possibly containing multiple of each key value) that associates
1221 * values of another type with the keys.
1222 *
1223 * @ingroup unordered_associative_containers
1224 *
1225 * @tparam _Key Type of key objects.
1226 * @tparam _Tp Type of mapped objects.
1227 * @tparam _Hash Hashing function object type, defaults to hash<_Value>.
1228 * @tparam _Pred Predicate function object type, defaults
1229 * to equal_to<_Value>.
1230 * @tparam _Alloc Allocator type, defaults to
1231 * std::allocator<std::pair<const _Key, _Tp>>.
1232 *
1233 * Meets the requirements of a <a href="tables.html#65">container</a>, and
1234 * <a href="tables.html#xx">unordered associative container</a>
1235 *
1236 * The resulting value type of the container is std::pair<const _Key, _Tp>.
1237 *
1238 * Base is _Hashtable, dispatched at compile time via template
1239 * alias __ummap_hashtable.
1240 */
1241 template<typename _Key, typename _Tp,
1242 typename _Hash = hash<_Key>,
1243 typename _Pred = equal_to<_Key>,
1244 typename _Alloc = allocator<std::pair<const _Key, _Tp>>>
1246 {
1247 typedef __ummap_hashtable<_Key, _Tp, _Hash, _Pred, _Alloc> _Hashtable;
1248 _Hashtable _M_h;
1249
1250 public:
1251 // typedefs:
1252 ///@{
1253 /// Public typedefs.
1254 typedef typename _Hashtable::key_type key_type;
1255 typedef typename _Hashtable::value_type value_type;
1256 typedef typename _Hashtable::mapped_type mapped_type;
1257 typedef typename _Hashtable::hasher hasher;
1258 typedef typename _Hashtable::key_equal key_equal;
1259 typedef typename _Hashtable::allocator_type allocator_type;
1260 ///@}
1261
1262 ///@{
1263 /// Iterator-related typedefs.
1264 typedef typename _Hashtable::pointer pointer;
1265 typedef typename _Hashtable::const_pointer const_pointer;
1266 typedef typename _Hashtable::reference reference;
1267 typedef typename _Hashtable::const_reference const_reference;
1268 typedef typename _Hashtable::iterator iterator;
1269 typedef typename _Hashtable::const_iterator const_iterator;
1270 typedef typename _Hashtable::local_iterator local_iterator;
1271 typedef typename _Hashtable::const_local_iterator const_local_iterator;
1272 typedef typename _Hashtable::size_type size_type;
1273 typedef typename _Hashtable::difference_type difference_type;
1274 ///@}
1275
1276#if __cplusplus > 201402L
1277 using node_type = typename _Hashtable::node_type;
1278#endif
1279
1280 //construct/destroy/copy
1281
1282 /// Default constructor.
1284
1285 /**
1286 * @brief Default constructor creates no elements.
1287 * @param __n Mnimal initial number of buckets.
1288 * @param __hf A hash functor.
1289 * @param __eql A key equality functor.
1290 * @param __a An allocator object.
1291 */
1292 explicit
1294 const hasher& __hf = hasher(),
1295 const key_equal& __eql = key_equal(),
1296 const allocator_type& __a = allocator_type())
1297 : _M_h(__n, __hf, __eql, __a)
1298 { }
1299
1300 /**
1301 * @brief Builds an %unordered_multimap from a range.
1302 * @param __first An input iterator.
1303 * @param __last An input iterator.
1304 * @param __n Minimal initial number of buckets.
1305 * @param __hf A hash functor.
1306 * @param __eql A key equality functor.
1307 * @param __a An allocator object.
1308 *
1309 * Create an %unordered_multimap consisting of copies of the elements
1310 * from [__first,__last). This is linear in N (where N is
1311 * distance(__first,__last)).
1312 */
1313 template<typename _InputIterator>
1314 unordered_multimap(_InputIterator __first, _InputIterator __last,
1315 size_type __n = 0,
1316 const hasher& __hf = hasher(),
1317 const key_equal& __eql = key_equal(),
1318 const allocator_type& __a = allocator_type())
1319 : _M_h(__first, __last, __n, __hf, __eql, __a)
1320 { }
1321
1322 /// Copy constructor.
1324
1325 /// Move constructor.
1327
1328 /**
1329 * @brief Creates an %unordered_multimap with no elements.
1330 * @param __a An allocator object.
1331 */
1332 explicit
1334 : _M_h(__a)
1335 { }
1336
1337 /*
1338 * @brief Copy constructor with allocator argument.
1339 * @param __uset Input %unordered_multimap to copy.
1340 * @param __a An allocator object.
1341 */
1343 const allocator_type& __a)
1344 : _M_h(__ummap._M_h, __a)
1345 { }
1346
1347 /*
1348 * @brief Move constructor with allocator argument.
1349 * @param __uset Input %unordered_multimap to move.
1350 * @param __a An allocator object.
1351 */
1353 const allocator_type& __a)
1354 noexcept( noexcept(_Hashtable(std::move(__ummap._M_h), __a)) )
1355 : _M_h(std::move(__ummap._M_h), __a)
1356 { }
1357
1358 /**
1359 * @brief Builds an %unordered_multimap from an initializer_list.
1360 * @param __l An initializer_list.
1361 * @param __n Minimal initial number of buckets.
1362 * @param __hf A hash functor.
1363 * @param __eql A key equality functor.
1364 * @param __a An allocator object.
1365 *
1366 * Create an %unordered_multimap consisting of copies of the elements in
1367 * the list. This is linear in N (where N is @a __l.size()).
1368 */
1370 size_type __n = 0,
1371 const hasher& __hf = hasher(),
1372 const key_equal& __eql = key_equal(),
1373 const allocator_type& __a = allocator_type())
1374 : _M_h(__l, __n, __hf, __eql, __a)
1375 { }
1376
1378 : unordered_multimap(__n, hasher(), key_equal(), __a)
1379 { }
1380
1381 unordered_multimap(size_type __n, const hasher& __hf,
1382 const allocator_type& __a)
1383 : unordered_multimap(__n, __hf, key_equal(), __a)
1384 { }
1385
1386 template<typename _InputIterator>
1387 unordered_multimap(_InputIterator __first, _InputIterator __last,
1388 size_type __n,
1389 const allocator_type& __a)
1390 : unordered_multimap(__first, __last, __n, hasher(), key_equal(), __a)
1391 { }
1392
1393 template<typename _InputIterator>
1394 unordered_multimap(_InputIterator __first, _InputIterator __last,
1395 size_type __n, const hasher& __hf,
1396 const allocator_type& __a)
1397 : unordered_multimap(__first, __last, __n, __hf, key_equal(), __a)
1398 { }
1399
1400 unordered_multimap(initializer_list<value_type> __l,
1401 size_type __n,
1402 const allocator_type& __a)
1403 : unordered_multimap(__l, __n, hasher(), key_equal(), __a)
1404 { }
1405
1406 unordered_multimap(initializer_list<value_type> __l,
1407 size_type __n, const hasher& __hf,
1408 const allocator_type& __a)
1409 : unordered_multimap(__l, __n, __hf, key_equal(), __a)
1410 { }
1411
1412 /// Copy assignment operator.
1415
1416 /// Move assignment operator.
1419
1420 /**
1421 * @brief %Unordered_multimap list assignment operator.
1422 * @param __l An initializer_list.
1423 *
1424 * This function fills an %unordered_multimap with copies of the
1425 * elements in the initializer list @a __l.
1426 *
1427 * Note that the assignment completely changes the %unordered_multimap
1428 * and that the resulting %unordered_multimap's size is the same as the
1429 * number of elements assigned.
1430 */
1433 {
1434 _M_h = __l;
1435 return *this;
1436 }
1437
1438 /// Returns the allocator object used by the %unordered_multimap.
1440 get_allocator() const noexcept
1441 { return _M_h.get_allocator(); }
1442
1443 // size and capacity:
1444
1445 /// Returns true if the %unordered_multimap is empty.
1446 _GLIBCXX_NODISCARD bool
1447 empty() const noexcept
1448 { return _M_h.empty(); }
1449
1450 /// Returns the size of the %unordered_multimap.
1451 size_type
1452 size() const noexcept
1453 { return _M_h.size(); }
1454
1455 /// Returns the maximum size of the %unordered_multimap.
1456 size_type
1457 max_size() const noexcept
1458 { return _M_h.max_size(); }
1459
1460 // iterators.
1461
1462 /**
1463 * Returns a read/write iterator that points to the first element in the
1464 * %unordered_multimap.
1465 */
1466 iterator
1467 begin() noexcept
1468 { return _M_h.begin(); }
1469
1470 ///@{
1471 /**
1472 * Returns a read-only (constant) iterator that points to the first
1473 * element in the %unordered_multimap.
1474 */
1476 begin() const noexcept
1477 { return _M_h.begin(); }
1478
1480 cbegin() const noexcept
1481 { return _M_h.begin(); }
1482 ///@}
1483
1484 /**
1485 * Returns a read/write iterator that points one past the last element in
1486 * the %unordered_multimap.
1487 */
1488 iterator
1489 end() noexcept
1490 { return _M_h.end(); }
1491
1492 ///@{
1493 /**
1494 * Returns a read-only (constant) iterator that points one past the last
1495 * element in the %unordered_multimap.
1496 */
1498 end() const noexcept
1499 { return _M_h.end(); }
1500
1502 cend() const noexcept
1503 { return _M_h.end(); }
1504 ///@}
1505
1506 // modifiers.
1507
1508 /**
1509 * @brief Attempts to build and insert a std::pair into the
1510 * %unordered_multimap.
1511 *
1512 * @param __args Arguments used to generate a new pair instance (see
1513 * std::piecewise_contruct for passing arguments to each
1514 * part of the pair constructor).
1515 *
1516 * @return An iterator that points to the inserted pair.
1517 *
1518 * This function attempts to build and insert a (key, value) %pair into
1519 * the %unordered_multimap.
1520 *
1521 * Insertion requires amortized constant time.
1522 */
1523 template<typename... _Args>
1524 iterator
1525 emplace(_Args&&... __args)
1526 { return _M_h.emplace(std::forward<_Args>(__args)...); }
1527
1528 /**
1529 * @brief Attempts to build and insert a std::pair into the
1530 * %unordered_multimap.
1531 *
1532 * @param __pos An iterator that serves as a hint as to where the pair
1533 * should be inserted.
1534 * @param __args Arguments used to generate a new pair instance (see
1535 * std::piecewise_contruct for passing arguments to each
1536 * part of the pair constructor).
1537 * @return An iterator that points to the element with key of the
1538 * std::pair built from @a __args.
1539 *
1540 * Note that the first parameter is only a hint and can potentially
1541 * improve the performance of the insertion process. A bad hint would
1542 * cause no gains in efficiency.
1543 *
1544 * See
1545 * https://gcc.gnu.org/onlinedocs/libstdc++/manual/associative.html#containers.associative.insert_hints
1546 * for more on @a hinting.
1547 *
1548 * Insertion requires amortized constant time.
1549 */
1550 template<typename... _Args>
1551 iterator
1552 emplace_hint(const_iterator __pos, _Args&&... __args)
1553 { return _M_h.emplace_hint(__pos, std::forward<_Args>(__args)...); }
1554
1555 ///@{
1556 /**
1557 * @brief Inserts a std::pair into the %unordered_multimap.
1558 * @param __x Pair to be inserted (see std::make_pair for easy
1559 * creation of pairs).
1560 *
1561 * @return An iterator that points to the inserted pair.
1562 *
1563 * Insertion requires amortized constant time.
1564 */
1565 iterator
1566 insert(const value_type& __x)
1567 { return _M_h.insert(__x); }
1568
1569 iterator
1571 { return _M_h.insert(std::move(__x)); }
1572
1573 template<typename _Pair>
1574 __enable_if_t<is_constructible<value_type, _Pair&&>::value, iterator>
1575 insert(_Pair&& __x)
1576 { return _M_h.emplace(std::forward<_Pair>(__x)); }
1577 ///@}
1578
1579 ///@{
1580 /**
1581 * @brief Inserts a std::pair into the %unordered_multimap.
1582 * @param __hint An iterator that serves as a hint as to where the
1583 * pair should be inserted.
1584 * @param __x Pair to be inserted (see std::make_pair for easy creation
1585 * of pairs).
1586 * @return An iterator that points to the element with key of
1587 * @a __x (may or may not be the %pair passed in).
1588 *
1589 * Note that the first parameter is only a hint and can potentially
1590 * improve the performance of the insertion process. A bad hint would
1591 * cause no gains in efficiency.
1592 *
1593 * See
1594 * https://gcc.gnu.org/onlinedocs/libstdc++/manual/associative.html#containers.associative.insert_hints
1595 * for more on @a hinting.
1596 *
1597 * Insertion requires amortized constant time.
1598 */
1599 iterator
1601 { return _M_h.insert(__hint, __x); }
1602
1603 // _GLIBCXX_RESOLVE_LIB_DEFECTS
1604 // 2354. Unnecessary copying when inserting into maps with braced-init
1605 iterator
1607 { return _M_h.insert(__hint, std::move(__x)); }
1608
1609 template<typename _Pair>
1610 __enable_if_t<is_constructible<value_type, _Pair&&>::value, iterator>
1611 insert(const_iterator __hint, _Pair&& __x)
1612 { return _M_h.emplace_hint(__hint, std::forward<_Pair>(__x)); }
1613 ///@}
1614
1615 /**
1616 * @brief A template function that attempts to insert a range of
1617 * elements.
1618 * @param __first Iterator pointing to the start of the range to be
1619 * inserted.
1620 * @param __last Iterator pointing to the end of the range.
1621 *
1622 * Complexity similar to that of the range constructor.
1623 */
1624 template<typename _InputIterator>
1625 void
1626 insert(_InputIterator __first, _InputIterator __last)
1627 { _M_h.insert(__first, __last); }
1628
1629 /**
1630 * @brief Attempts to insert a list of elements into the
1631 * %unordered_multimap.
1632 * @param __l A std::initializer_list<value_type> of elements
1633 * to be inserted.
1634 *
1635 * Complexity similar to that of the range constructor.
1636 */
1637 void
1639 { _M_h.insert(__l); }
1640
1641#if __cplusplus > 201402L
1642 /// Extract a node.
1643 node_type
1645 {
1646 __glibcxx_assert(__pos != end());
1647 return _M_h.extract(__pos);
1648 }
1649
1650 /// Extract a node.
1651 node_type
1652 extract(const key_type& __key)
1653 { return _M_h.extract(__key); }
1654
1655 /// Re-insert an extracted node.
1656 iterator
1657 insert(node_type&& __nh)
1658 { return _M_h._M_reinsert_node_multi(cend(), std::move(__nh)); }
1659
1660 /// Re-insert an extracted node.
1661 iterator
1662 insert(const_iterator __hint, node_type&& __nh)
1663 { return _M_h._M_reinsert_node_multi(__hint, std::move(__nh)); }
1664#endif // C++17
1665
1666 ///@{
1667 /**
1668 * @brief Erases an element from an %unordered_multimap.
1669 * @param __position An iterator pointing to the element to be erased.
1670 * @return An iterator pointing to the element immediately following
1671 * @a __position prior to the element being erased. If no such
1672 * element exists, end() is returned.
1673 *
1674 * This function erases an element, pointed to by the given iterator,
1675 * from an %unordered_multimap.
1676 * Note that this function only erases the element, and that if the
1677 * element is itself a pointer, the pointed-to memory is not touched in
1678 * any way. Managing the pointer is the user's responsibility.
1679 */
1680 iterator
1682 { return _M_h.erase(__position); }
1683
1684 // LWG 2059.
1685 iterator
1686 erase(iterator __position)
1687 { return _M_h.erase(__position); }
1688 ///@}
1689
1690 /**
1691 * @brief Erases elements according to the provided key.
1692 * @param __x Key of elements to be erased.
1693 * @return The number of elements erased.
1694 *
1695 * This function erases all the elements located by the given key from
1696 * an %unordered_multimap.
1697 * Note that this function only erases the element, and that if the
1698 * element is itself a pointer, the pointed-to memory is not touched in
1699 * any way. Managing the pointer is the user's responsibility.
1700 */
1701 size_type
1702 erase(const key_type& __x)
1703 { return _M_h.erase(__x); }
1704
1705 /**
1706 * @brief Erases a [__first,__last) range of elements from an
1707 * %unordered_multimap.
1708 * @param __first Iterator pointing to the start of the range to be
1709 * erased.
1710 * @param __last Iterator pointing to the end of the range to
1711 * be erased.
1712 * @return The iterator @a __last.
1713 *
1714 * This function erases a sequence of elements from an
1715 * %unordered_multimap.
1716 * Note that this function only erases the elements, and that if
1717 * the element is itself a pointer, the pointed-to memory is not touched
1718 * in any way. Managing the pointer is the user's responsibility.
1719 */
1720 iterator
1722 { return _M_h.erase(__first, __last); }
1723
1724 /**
1725 * Erases all elements in an %unordered_multimap.
1726 * Note that this function only erases the elements, and that if the
1727 * elements themselves are pointers, the pointed-to memory is not touched
1728 * in any way. Managing the pointer is the user's responsibility.
1729 */
1730 void
1731 clear() noexcept
1732 { _M_h.clear(); }
1733
1734 /**
1735 * @brief Swaps data with another %unordered_multimap.
1736 * @param __x An %unordered_multimap of the same element and allocator
1737 * types.
1738 *
1739 * This exchanges the elements between two %unordered_multimap in
1740 * constant time.
1741 * Note that the global std::swap() function is specialized such that
1742 * std::swap(m1,m2) will feed to this function.
1743 */
1744 void
1746 noexcept( noexcept(_M_h.swap(__x._M_h)) )
1747 { _M_h.swap(__x._M_h); }
1748
1749#if __cplusplus > 201402L
1750 template<typename, typename, typename>
1751 friend class std::_Hash_merge_helper;
1752
1753 template<typename _H2, typename _P2>
1754 void
1756 {
1757 using _Merge_helper
1758 = _Hash_merge_helper<unordered_multimap, _H2, _P2>;
1759 _M_h._M_merge_multi(_Merge_helper::_S_get_table(__source));
1760 }
1761
1762 template<typename _H2, typename _P2>
1763 void
1764 merge(unordered_multimap<_Key, _Tp, _H2, _P2, _Alloc>&& __source)
1765 { merge(__source); }
1766
1767 template<typename _H2, typename _P2>
1768 void
1769 merge(unordered_map<_Key, _Tp, _H2, _P2, _Alloc>& __source)
1770 {
1771 using _Merge_helper
1772 = _Hash_merge_helper<unordered_multimap, _H2, _P2>;
1773 _M_h._M_merge_multi(_Merge_helper::_S_get_table(__source));
1774 }
1775
1776 template<typename _H2, typename _P2>
1777 void
1778 merge(unordered_map<_Key, _Tp, _H2, _P2, _Alloc>&& __source)
1779 { merge(__source); }
1780#endif // C++17
1781
1782 // observers.
1783
1784 /// Returns the hash functor object with which the %unordered_multimap
1785 /// was constructed.
1786 hasher
1788 { return _M_h.hash_function(); }
1789
1790 /// Returns the key comparison object with which the %unordered_multimap
1791 /// was constructed.
1792 key_equal
1793 key_eq() const
1794 { return _M_h.key_eq(); }
1795
1796 // lookup.
1797
1798 ///@{
1799 /**
1800 * @brief Tries to locate an element in an %unordered_multimap.
1801 * @param __x Key to be located.
1802 * @return Iterator pointing to sought-after element, or end() if not
1803 * found.
1804 *
1805 * This function takes a key and tries to locate the element with which
1806 * the key matches. If successful the function returns an iterator
1807 * pointing to the sought after element. If unsuccessful it returns the
1808 * past-the-end ( @c end() ) iterator.
1809 */
1810 iterator
1811 find(const key_type& __x)
1812 { return _M_h.find(__x); }
1813
1814#if __cplusplus > 201703L
1815 template<typename _Kt>
1816 auto
1817 find(const _Kt& __x) -> decltype(_M_h._M_find_tr(__x))
1818 { return _M_h._M_find_tr(__x); }
1819#endif
1820
1822 find(const key_type& __x) const
1823 { return _M_h.find(__x); }
1824
1825#if __cplusplus > 201703L
1826 template<typename _Kt>
1827 auto
1828 find(const _Kt& __x) const -> decltype(_M_h._M_find_tr(__x))
1829 { return _M_h._M_find_tr(__x); }
1830#endif
1831 ///@}
1832
1833 ///@{
1834 /**
1835 * @brief Finds the number of elements.
1836 * @param __x Key to count.
1837 * @return Number of elements with specified key.
1838 */
1839 size_type
1840 count(const key_type& __x) const
1841 { return _M_h.count(__x); }
1842
1843#if __cplusplus > 201703L
1844 template<typename _Kt>
1845 auto
1846 count(const _Kt& __x) const -> decltype(_M_h._M_count_tr(__x))
1847 { return _M_h._M_count_tr(__x); }
1848#endif
1849 ///@}
1850
1851#if __cplusplus > 201703L
1852 ///@{
1853 /**
1854 * @brief Finds whether an element with the given key exists.
1855 * @param __x Key of elements to be located.
1856 * @return True if there is any element with the specified key.
1857 */
1858 bool
1859 contains(const key_type& __x) const
1860 { return _M_h.find(__x) != _M_h.end(); }
1861
1862 template<typename _Kt>
1863 auto
1864 contains(const _Kt& __x) const
1865 -> decltype(_M_h._M_find_tr(__x), void(), true)
1866 { return _M_h._M_find_tr(__x) != _M_h.end(); }
1867 ///@}
1868#endif
1869
1870 ///@{
1871 /**
1872 * @brief Finds a subsequence matching given key.
1873 * @param __x Key to be located.
1874 * @return Pair of iterators that possibly points to the subsequence
1875 * matching given key.
1876 */
1879 { return _M_h.equal_range(__x); }
1880
1881#if __cplusplus > 201703L
1882 template<typename _Kt>
1883 auto
1884 equal_range(const _Kt& __x)
1885 -> decltype(_M_h._M_equal_range_tr(__x))
1886 { return _M_h._M_equal_range_tr(__x); }
1887#endif
1888
1890 equal_range(const key_type& __x) const
1891 { return _M_h.equal_range(__x); }
1892
1893#if __cplusplus > 201703L
1894 template<typename _Kt>
1895 auto
1896 equal_range(const _Kt& __x) const
1897 -> decltype(_M_h._M_equal_range_tr(__x))
1898 { return _M_h._M_equal_range_tr(__x); }
1899#endif
1900 ///@}
1901
1902 // bucket interface.
1903
1904 /// Returns the number of buckets of the %unordered_multimap.
1905 size_type
1906 bucket_count() const noexcept
1907 { return _M_h.bucket_count(); }
1908
1909 /// Returns the maximum number of buckets of the %unordered_multimap.
1910 size_type
1911 max_bucket_count() const noexcept
1912 { return _M_h.max_bucket_count(); }
1913
1914 /*
1915 * @brief Returns the number of elements in a given bucket.
1916 * @param __n A bucket index.
1917 * @return The number of elements in the bucket.
1918 */
1919 size_type
1920 bucket_size(size_type __n) const
1921 { return _M_h.bucket_size(__n); }
1922
1923 /*
1924 * @brief Returns the bucket index of a given element.
1925 * @param __key A key instance.
1926 * @return The key bucket index.
1927 */
1928 size_type
1929 bucket(const key_type& __key) const
1930 { return _M_h.bucket(__key); }
1931
1932 /**
1933 * @brief Returns a read/write iterator pointing to the first bucket
1934 * element.
1935 * @param __n The bucket index.
1936 * @return A read/write local iterator.
1937 */
1940 { return _M_h.begin(__n); }
1941
1942 ///@{
1943 /**
1944 * @brief Returns a read-only (constant) iterator pointing to the first
1945 * bucket element.
1946 * @param __n The bucket index.
1947 * @return A read-only local iterator.
1948 */
1950 begin(size_type __n) const
1951 { return _M_h.begin(__n); }
1952
1955 { return _M_h.cbegin(__n); }
1956 ///@}
1957
1958 /**
1959 * @brief Returns a read/write iterator pointing to one past the last
1960 * bucket elements.
1961 * @param __n The bucket index.
1962 * @return A read/write local iterator.
1963 */
1966 { return _M_h.end(__n); }
1967
1968 ///@{
1969 /**
1970 * @brief Returns a read-only (constant) iterator pointing to one past
1971 * the last bucket elements.
1972 * @param __n The bucket index.
1973 * @return A read-only local iterator.
1974 */
1976 end(size_type __n) const
1977 { return _M_h.end(__n); }
1978
1980 cend(size_type __n) const
1981 { return _M_h.cend(__n); }
1982 ///@}
1983
1984 // hash policy.
1985
1986 /// Returns the average number of elements per bucket.
1987 float
1988 load_factor() const noexcept
1989 { return _M_h.load_factor(); }
1990
1991 /// Returns a positive number that the %unordered_multimap tries to keep
1992 /// the load factor less than or equal to.
1993 float
1994 max_load_factor() const noexcept
1995 { return _M_h.max_load_factor(); }
1996
1997 /**
1998 * @brief Change the %unordered_multimap maximum load factor.
1999 * @param __z The new maximum load factor.
2000 */
2001 void
2003 { _M_h.max_load_factor(__z); }
2004
2005 /**
2006 * @brief May rehash the %unordered_multimap.
2007 * @param __n The new number of buckets.
2008 *
2009 * Rehash will occur only if the new number of buckets respect the
2010 * %unordered_multimap maximum load factor.
2011 */
2012 void
2014 { _M_h.rehash(__n); }
2015
2016 /**
2017 * @brief Prepare the %unordered_multimap for a specified number of
2018 * elements.
2019 * @param __n Number of elements required.
2020 *
2021 * Same as rehash(ceil(n / max_load_factor())).
2022 */
2023 void
2025 { _M_h.reserve(__n); }
2026
2027 template<typename _Key1, typename _Tp1, typename _Hash1, typename _Pred1,
2028 typename _Alloc1>
2029 friend bool
2030 operator==(const unordered_multimap<_Key1, _Tp1,
2031 _Hash1, _Pred1, _Alloc1>&,
2032 const unordered_multimap<_Key1, _Tp1,
2033 _Hash1, _Pred1, _Alloc1>&);
2034 };
2035
2036#if __cpp_deduction_guides >= 201606
2037
2038 template<typename _InputIterator,
2039 typename _Hash = hash<__iter_key_t<_InputIterator>>,
2040 typename _Pred = equal_to<__iter_key_t<_InputIterator>>,
2041 typename _Allocator = allocator<__iter_to_alloc_t<_InputIterator>>,
2042 typename = _RequireInputIter<_InputIterator>,
2043 typename = _RequireNotAllocatorOrIntegral<_Hash>,
2044 typename = _RequireNotAllocator<_Pred>,
2045 typename = _RequireAllocator<_Allocator>>
2046 unordered_multimap(_InputIterator, _InputIterator,
2048 _Hash = _Hash(), _Pred = _Pred(),
2049 _Allocator = _Allocator())
2050 -> unordered_multimap<__iter_key_t<_InputIterator>,
2051 __iter_val_t<_InputIterator>, _Hash, _Pred,
2052 _Allocator>;
2053
2054 template<typename _Key, typename _Tp, typename _Hash = hash<_Key>,
2055 typename _Pred = equal_to<_Key>,
2056 typename _Allocator = allocator<pair<const _Key, _Tp>>,
2057 typename = _RequireNotAllocatorOrIntegral<_Hash>,
2058 typename = _RequireNotAllocator<_Pred>,
2059 typename = _RequireAllocator<_Allocator>>
2060 unordered_multimap(initializer_list<pair<_Key, _Tp>>,
2062 _Hash = _Hash(), _Pred = _Pred(),
2063 _Allocator = _Allocator())
2064 -> unordered_multimap<_Key, _Tp, _Hash, _Pred, _Allocator>;
2065
2066 template<typename _InputIterator, typename _Allocator,
2067 typename = _RequireInputIter<_InputIterator>,
2068 typename = _RequireAllocator<_Allocator>>
2069 unordered_multimap(_InputIterator, _InputIterator,
2071 -> unordered_multimap<__iter_key_t<_InputIterator>,
2072 __iter_val_t<_InputIterator>,
2073 hash<__iter_key_t<_InputIterator>>,
2074 equal_to<__iter_key_t<_InputIterator>>, _Allocator>;
2075
2076 template<typename _InputIterator, typename _Allocator,
2077 typename = _RequireInputIter<_InputIterator>,
2078 typename = _RequireAllocator<_Allocator>>
2079 unordered_multimap(_InputIterator, _InputIterator, _Allocator)
2080 -> unordered_multimap<__iter_key_t<_InputIterator>,
2081 __iter_val_t<_InputIterator>,
2082 hash<__iter_key_t<_InputIterator>>,
2083 equal_to<__iter_key_t<_InputIterator>>, _Allocator>;
2084
2085 template<typename _InputIterator, typename _Hash, typename _Allocator,
2086 typename = _RequireInputIter<_InputIterator>,
2087 typename = _RequireNotAllocatorOrIntegral<_Hash>,
2088 typename = _RequireAllocator<_Allocator>>
2089 unordered_multimap(_InputIterator, _InputIterator,
2091 _Allocator)
2092 -> unordered_multimap<__iter_key_t<_InputIterator>,
2093 __iter_val_t<_InputIterator>, _Hash,
2094 equal_to<__iter_key_t<_InputIterator>>, _Allocator>;
2095
2096 template<typename _Key, typename _Tp, typename _Allocator,
2097 typename = _RequireAllocator<_Allocator>>
2098 unordered_multimap(initializer_list<pair<_Key, _Tp>>,
2100 _Allocator)
2101 -> unordered_multimap<_Key, _Tp, hash<_Key>, equal_to<_Key>, _Allocator>;
2102
2103 template<typename _Key, typename _Tp, typename _Allocator,
2104 typename = _RequireAllocator<_Allocator>>
2105 unordered_multimap(initializer_list<pair<_Key, _Tp>>, _Allocator)
2106 -> unordered_multimap<_Key, _Tp, hash<_Key>, equal_to<_Key>, _Allocator>;
2107
2108 template<typename _Key, typename _Tp, typename _Hash, typename _Allocator,
2109 typename = _RequireNotAllocatorOrIntegral<_Hash>,
2110 typename = _RequireAllocator<_Allocator>>
2111 unordered_multimap(initializer_list<pair<_Key, _Tp>>,
2113 _Hash, _Allocator)
2114 -> unordered_multimap<_Key, _Tp, _Hash, equal_to<_Key>, _Allocator>;
2115
2116#endif
2117
2118 template<class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2119 inline void
2120 swap(unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
2121 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
2122 noexcept(noexcept(__x.swap(__y)))
2123 { __x.swap(__y); }
2124
2125 template<class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2126 inline void
2127 swap(unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
2128 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
2129 noexcept(noexcept(__x.swap(__y)))
2130 { __x.swap(__y); }
2131
2132 template<class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2133 inline bool
2134 operator==(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
2135 const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
2136 { return __x._M_h._M_equal(__y._M_h); }
2137
2138#if __cpp_impl_three_way_comparison < 201907L
2139 template<class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2140 inline bool
2141 operator!=(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
2142 const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
2143 { return !(__x == __y); }
2144#endif
2145
2146 template<class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2147 inline bool
2148 operator==(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
2149 const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
2150 { return __x._M_h._M_equal(__y._M_h); }
2151
2152#if __cpp_impl_three_way_comparison < 201907L
2153 template<class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
2154 inline bool
2155 operator!=(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
2156 const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y)
2157 { return !(__x == __y); }
2158#endif
2159
2160_GLIBCXX_END_NAMESPACE_CONTAINER
2161
2162#if __cplusplus > 201402L
2163 // Allow std::unordered_map access to internals of compatible maps.
2164 template<typename _Key, typename _Val, typename _Hash1, typename _Eq1,
2165 typename _Alloc, typename _Hash2, typename _Eq2>
2166 struct _Hash_merge_helper<
2167 _GLIBCXX_STD_C::unordered_map<_Key, _Val, _Hash1, _Eq1, _Alloc>,
2168 _Hash2, _Eq2>
2169 {
2170 private:
2171 template<typename... _Tp>
2172 using unordered_map = _GLIBCXX_STD_C::unordered_map<_Tp...>;
2173 template<typename... _Tp>
2174 using unordered_multimap = _GLIBCXX_STD_C::unordered_multimap<_Tp...>;
2175
2176 friend unordered_map<_Key, _Val, _Hash1, _Eq1, _Alloc>;
2177
2178 static auto&
2179 _S_get_table(unordered_map<_Key, _Val, _Hash2, _Eq2, _Alloc>& __map)
2180 { return __map._M_h; }
2181
2182 static auto&
2183 _S_get_table(unordered_multimap<_Key, _Val, _Hash2, _Eq2, _Alloc>& __map)
2184 { return __map._M_h; }
2185 };
2186
2187 // Allow std::unordered_multimap access to internals of compatible maps.
2188 template<typename _Key, typename _Val, typename _Hash1, typename _Eq1,
2189 typename _Alloc, typename _Hash2, typename _Eq2>
2190 struct _Hash_merge_helper<
2191 _GLIBCXX_STD_C::unordered_multimap<_Key, _Val, _Hash1, _Eq1, _Alloc>,
2192 _Hash2, _Eq2>
2193 {
2194 private:
2195 template<typename... _Tp>
2196 using unordered_map = _GLIBCXX_STD_C::unordered_map<_Tp...>;
2197 template<typename... _Tp>
2198 using unordered_multimap = _GLIBCXX_STD_C::unordered_multimap<_Tp...>;
2199
2200 friend unordered_multimap<_Key, _Val, _Hash1, _Eq1, _Alloc>;
2201
2202 static auto&
2203 _S_get_table(unordered_map<_Key, _Val, _Hash2, _Eq2, _Alloc>& __map)
2204 { return __map._M_h; }
2205
2206 static auto&
2207 _S_get_table(unordered_multimap<_Key, _Val, _Hash2, _Eq2, _Alloc>& __map)
2208 { return __map._M_h; }
2209 };
2210#endif // C++17
2211
2212_GLIBCXX_END_NAMESPACE_VERSION
2213} // namespace std
2214
2215#endif /* _UNORDERED_MAP_H */
constexpr std::remove_reference< _Tp >::type && move(_Tp &&__t) noexcept
Convert a value to an rvalue.
Definition: move.h:104
void swap(any &__x, any &__y) noexcept
Exchange the states of two any objects.
Definition: any:429
ISO C++ entities toplevel namespace is std.
__detail::_Hashtable_traits< _Cache, false, false > __ummap_traits
Base types for unordered_multimap.
Definition: unordered_map.h:57
__detail::_Hashtable_traits< _Cache, false, true > __umap_traits
Base types for unordered_map.
Definition: unordered_map.h:40
initializer_list
Primary class template hash.
The standard allocator, as per C++03 [20.4.1].
Definition: allocator.h:125
One of the comparison functors.
Definition: stl_function.h:374
Struct holding two objects of arbitrary type.
Definition: stl_pair.h:187
Common iterator class.
A standard container composed of equivalent keys (possibly containing multiple of each key value) tha...
float load_factor() const noexcept
Returns the average number of elements per bucket.
_Hashtable::reference reference
Iterator-related typedefs.
iterator erase(iterator __position)
Erases an element from an unordered_multimap.
const_iterator end() const noexcept
size_type erase(const key_type &__x)
Erases elements according to the provided key.
std::pair< iterator, iterator > equal_range(const key_type &__x)
Finds a subsequence matching given key.
size_type bucket_count() const noexcept
Returns the number of buckets of the unordered_multimap.
_Hashtable::iterator iterator
Iterator-related typedefs.
size_type max_bucket_count() const noexcept
Returns the maximum number of buckets of the unordered_multimap.
iterator begin() noexcept
const_iterator begin() const noexcept
hasher hash_function() const
Returns the hash functor object with which the unordered_multimap was constructed.
iterator insert(const_iterator __hint, node_type &&__nh)
Re-insert an extracted node.
__enable_if_t< is_constructible< value_type, _Pair && >::value, iterator > insert(const_iterator __hint, _Pair &&__x)
Inserts a std::pair into the unordered_multimap.
unordered_multimap & operator=(const unordered_multimap &)=default
Copy assignment operator.
key_equal key_eq() const
Returns the key comparison object with which the unordered_multimap was constructed.
size_type count(const key_type &__x) const
Finds the number of elements.
const_iterator find(const key_type &__x) const
Tries to locate an element in an unordered_multimap.
_Hashtable::mapped_type mapped_type
Public typedefs.
auto find(const _Kt &__x) -> decltype(_M_h._M_find_tr(__x))
Tries to locate an element in an unordered_multimap.
local_iterator end(size_type __n)
Returns a read/write iterator pointing to one past the last bucket elements.
void insert(_InputIterator __first, _InputIterator __last)
A template function that attempts to insert a range of elements.
unordered_multimap & operator=(initializer_list< value_type > __l)
Unordered_multimap list assignment operator.
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.
_Hashtable::value_type value_type
Public typedefs.
iterator emplace(_Args &&... __args)
Attempts to build and insert a std::pair into the unordered_multimap.
node_type extract(const key_type &__key)
Extract a node.
bool contains(const key_type &__x) const
Finds whether an element with the given key exists.
_Hashtable::const_reference const_reference
Iterator-related typedefs.
iterator insert(node_type &&__nh)
Re-insert an extracted node.
iterator erase(const_iterator __position)
Erases an element from an unordered_multimap.
iterator end() noexcept
local_iterator begin(size_type __n)
Returns a read/write iterator pointing to the first bucket element.
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_multimap()=default
Default constructor.
iterator insert(value_type &&__x)
Inserts a std::pair into the unordered_multimap.
iterator insert(const value_type &__x)
Inserts a std::pair into the unordered_multimap.
unordered_multimap & operator=(unordered_multimap &&)=default
Move assignment operator.
_Hashtable::hasher hasher
Public typedefs.
_Hashtable::local_iterator local_iterator
Iterator-related typedefs.
void reserve(size_type __n)
Prepare the unordered_multimap for a specified number of elements.
std::pair< const_iterator, const_iterator > equal_range(const key_type &__x) const
Finds a subsequence matching given key.
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.
iterator find(const key_type &__x)
Tries to locate an element in an unordered_multimap.
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.
auto count(const _Kt &__x) const -> decltype(_M_h._M_count_tr(__x))
Finds the number of elements.
iterator erase(const_iterator __first, const_iterator __last)
Erases a [__first,__last) range of elements from an unordered_multimap.
const_local_iterator end(size_type __n) const
Returns a read-only (constant) iterator pointing to one past the last bucket elements.
_Hashtable::pointer pointer
Iterator-related typedefs.
_Hashtable::allocator_type allocator_type
Public typedefs.
const_local_iterator begin(size_type __n) const
Returns a read-only (constant) iterator pointing to the first bucket element.
auto find(const _Kt &__x) const -> decltype(_M_h._M_find_tr(__x))
Tries to locate an element in an unordered_multimap.
_Hashtable::const_local_iterator const_local_iterator
Iterator-related typedefs.
unordered_multimap(unordered_multimap &&)=default
Move constructor.
unordered_multimap(const allocator_type &__a)
Creates an unordered_multimap with no elements.
_Hashtable::difference_type difference_type
Iterator-related typedefs.
_Hashtable::size_type size_type
Iterator-related typedefs.
_Hashtable::const_pointer const_pointer
Iterator-related typedefs.
__enable_if_t< is_constructible< value_type, _Pair && >::value, iterator > insert(_Pair &&__x)
Inserts a std::pair into the unordered_multimap.
auto contains(const _Kt &__x) const -> decltype(_M_h._M_find_tr(__x), void(), true)
Finds whether an element with the given key exists.
void swap(unordered_multimap &__x) noexcept(noexcept(_M_h.swap(__x._M_h)))
Swaps data with another unordered_multimap.
void rehash(size_type __n)
May rehash the unordered_multimap.
_Hashtable::const_iterator const_iterator
Iterator-related typedefs.
void insert(initializer_list< value_type > __l)
Attempts to insert a list of elements into the unordered_multimap.
const_iterator cend() const noexcept
size_type max_size() const noexcept
Returns the maximum size of the unordered_multimap.
const_local_iterator cbegin(size_type __n) const
Returns a read-only (constant) iterator pointing to the first bucket element.
bool empty() const noexcept
Returns true if the unordered_multimap is empty.
const_iterator cbegin() const noexcept
_Hashtable::key_type key_type
Public typedefs.
node_type extract(const_iterator __pos)
Extract a node.
const_local_iterator cend(size_type __n) const
Returns a read-only (constant) iterator pointing to one past the last bucket elements.
iterator insert(const_iterator __hint, const value_type &__x)
Inserts a std::pair into the unordered_multimap.
size_type size() const noexcept
Returns the size of the unordered_multimap.
unordered_multimap(const unordered_multimap &)=default
Copy constructor.
iterator emplace_hint(const_iterator __pos, _Args &&... __args)
Attempts to build and insert a std::pair into the unordered_multimap.
iterator insert(const_iterator __hint, value_type &&__x)
Inserts a std::pair into the unordered_multimap.
auto equal_range(const _Kt &__x) -> decltype(_M_h._M_equal_range_tr(__x))
Finds a subsequence matching given key.
_Hashtable::key_equal key_equal
Public typedefs.
allocator_type get_allocator() const noexcept
Returns the allocator object used by the unordered_multimap.
void max_load_factor(float __z)
Change the unordered_multimap maximum load factor.
auto equal_range(const _Kt &__x) const -> decltype(_M_h._M_equal_range_tr(__x))
Finds a subsequence matching given key.
A standard container composed of unique keys (containing at most one of each key value) that associat...
iterator insert(const_iterator __hint, value_type &&__x)
Attempts to insert a std::pair into the unordered_map.
_Hashtable::iterator iterator
Iterator-related typedefs.
void max_load_factor(float __z)
Change the unordered_map maximum load factor.
const mapped_type & at(const key_type &__k) const
Access to unordered_map data.
bool contains(const key_type &__x) const
Finds whether an element with the given key exists.
node_type extract(const key_type &__key)
Extract a node.
void insert(_InputIterator __first, _InputIterator __last)
A template function that attempts to insert a range of elements.
allocator_type get_allocator() const noexcept
Returns the allocator object used by the unordered_map.
auto find(const _Kt &__x) -> decltype(_M_h._M_find_tr(__x))
Tries to locate an element in an unordered_map.
unordered_map & operator=(initializer_list< value_type > __l)
Unordered_map list assignment operator.
_Hashtable::const_pointer const_pointer
Iterator-related typedefs.
auto find(const _Kt &__x) const -> decltype(_M_h._M_find_tr(__x))
Tries to locate an element in an unordered_map.
void insert(initializer_list< value_type > __l)
Attempts to insert a list of elements into the unordered_map.
__enable_if_t< is_constructible< value_type, _Pair && >::value, iterator > insert(const_iterator __hint, _Pair &&__x)
Attempts to insert a std::pair into the unordered_map.
std::pair< iterator, iterator > equal_range(const key_type &__x)
Finds a subsequence matching given key.
mapped_type & at(const key_type &__k)
Access to unordered_map data.
iterator erase(const_iterator __first, const_iterator __last)
Erases a [__first,__last) range of elements from an unordered_map.
iterator try_emplace(const_iterator __hint, const key_type &__k, _Args &&... __args)
Attempts to build and insert a std::pair into the unordered_map.
node_type extract(const_iterator __pos)
Extract a node.
std::pair< iterator, bool > insert(const value_type &__x)
Attempts to insert a std::pair into the unordered_map.
void reserve(size_type __n)
Prepare the unordered_map for a specified number of elements.
const_local_iterator cbegin(size_type __n) const
Returns a read-only (constant) iterator pointing to the first bucket element.
std::pair< const_iterator, const_iterator > equal_range(const key_type &__x) const
Finds a subsequence matching given key.
iterator insert(const_iterator, node_type &&__nh)
Re-insert an extracted node.
_Hashtable::reference reference
Iterator-related typedefs.
iterator insert(const_iterator __hint, const value_type &__x)
Attempts to insert a std::pair into the unordered_map.
iterator end() noexcept
_Hashtable::allocator_type allocator_type
Public typedefs.
unordered_map(const unordered_map &)=default
Copy constructor.
size_type count(const key_type &__x) const
Finds the number of elements.
bool empty() const noexcept
Returns true if the unordered_map is empty.
size_type erase(const key_type &__x)
Erases elements according to the provided key.
const_iterator find(const key_type &__x) const
Tries to locate an element in an unordered_map.
unordered_map(unordered_map &&)=default
Move constructor.
const_local_iterator end(size_type __n) const
Returns a read-only (constant) iterator pointing to one past the last bucket elements.
auto equal_range(const _Kt &__x) -> decltype(_M_h._M_equal_range_tr(__x))
Finds a subsequence matching given key.
auto contains(const _Kt &__x) const -> decltype(_M_h._M_find_tr(__x), void(), true)
Finds whether an element with the given key exists.
size_type max_size() const noexcept
Returns the maximum size of the unordered_map.
const_iterator end() const noexcept
unordered_map()=default
Default constructor.
_Hashtable::mapped_type mapped_type
Public typedefs.
unordered_map & operator=(unordered_map &&)=default
Move assignment operator.
const_local_iterator begin(size_type __n) const
Returns a read-only (constant) iterator pointing to the first bucket element.
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.
std::pair< iterator, bool > emplace(_Args &&... __args)
Attempts to build and insert a std::pair into the unordered_map.
const_local_iterator cend(size_type __n) const
Returns a read-only (constant) iterator pointing to one past the last bucket elements.
size_type size() const noexcept
Returns the size of the unordered_map.
__enable_if_t< is_constructible< value_type, _Pair && >::value, pair< iterator, bool > > insert(_Pair &&__x)
Attempts to insert a std::pair into the unordered_map.
mapped_type & operator[](key_type &&__k)
Subscript ( [] ) access to unordered_map data.
std::pair< iterator, bool > insert(value_type &&__x)
Attempts to insert a std::pair into the unordered_map.
_Hashtable::hasher hasher
Public typedefs.
pair< iterator, bool > insert_or_assign(const key_type &__k, _Obj &&__obj)
Attempts to insert a std::pair into the unordered_map.
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.
void clear() noexcept
mapped_type & operator[](const key_type &__k)
Subscript ( [] ) access to unordered_map data.
pair< iterator, bool > try_emplace(const key_type &__k, _Args &&... __args)
Attempts to build and insert a std::pair into the unordered_map.
const_iterator begin() const noexcept
key_equal key_eq() const
Returns the key comparison object with which the unordered_map was constructed.
_Hashtable::const_reference const_reference
Iterator-related typedefs.
_Hashtable::key_equal key_equal
Public typedefs.
_Hashtable::local_iterator local_iterator
Iterator-related typedefs.
iterator erase(iterator __position)
Erases an element from an unordered_map.
const_iterator cend() const noexcept
local_iterator end(size_type __n)
Returns a read/write iterator pointing to one past the last bucket elements.
_Hashtable::pointer pointer
Iterator-related typedefs.
iterator insert_or_assign(const_iterator __hint, const key_type &__k, _Obj &&__obj)
Attempts to insert a std::pair into the unordered_map.
unordered_map(const allocator_type &__a)
Creates an unordered_map with no elements.
_Hashtable::key_type key_type
Public typedefs.
size_type bucket_count() const noexcept
Returns the number of buckets of the unordered_map.
iterator begin() noexcept
hasher hash_function() const
Returns the hash functor object with which the unordered_map was constructed.
auto equal_range(const _Kt &__x) const -> decltype(_M_h._M_equal_range_tr(__x))
Finds a subsequence matching given key.
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.
_Hashtable::const_iterator const_iterator
Iterator-related typedefs.
_Hashtable::size_type size_type
Iterator-related typedefs.
iterator find(const key_type &__x)
Tries to locate an element in an unordered_map.
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.
void swap(unordered_map &__x) noexcept(noexcept(_M_h.swap(__x._M_h)))
Swaps data with another unordered_map.
local_iterator begin(size_type __n)
Returns a read/write iterator pointing to the first bucket element.
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.
unordered_map & operator=(const unordered_map &)=default
Copy assignment operator.
_Hashtable::difference_type difference_type
Iterator-related typedefs.
auto count(const _Kt &__x) const -> decltype(_M_h._M_count_tr(__x))
Finds the number of elements.
_Hashtable::const_local_iterator const_local_iterator
Iterator-related typedefs.
size_type max_bucket_count() const noexcept
Returns the maximum number of buckets of the unordered_map.
iterator emplace_hint(const_iterator __pos, _Args &&... __args)
Attempts to build and insert a std::pair into the unordered_map.
insert_return_type insert(node_type &&__nh)
Re-insert an extracted node.
_Hashtable::value_type value_type
Public typedefs.
void rehash(size_type __n)
May rehash the unordered_map.
const_iterator cbegin() const noexcept