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