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