1 // unordered_map implementation -*- C++ -*- 2 3 // Copyright (C) 2010-2019 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 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 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 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 _GLIBCXX_NODISCARD bool 304 empty() const noexcept 305 { return _M_h.empty(); } 306 307 /// Returns the size of the %unordered_map. 308 size_type 309 size() const noexcept 310 { 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 begin() noexcept 325 { 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 cbegin() const noexcept 338 { 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 end() noexcept 347 { 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 cend() const noexcept 360 { 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 erase(const_iterator __position) 793 { return _M_h.erase(__position); } 794 795 // LWG 2059. 796 iterator 797 erase(iterator __position) 798 { 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 erase(const key_type& __x) 815 { 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 clear() noexcept 843 { _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 merge(unordered_map<_Key, _Tp, _H2, _P2, _Alloc>& __source) 867 { 868 using _Merge_helper = _Hash_merge_helper<unordered_map, _H2, _P2>; 869 _M_h._M_merge_unique(_Merge_helper::_S_get_table(__source)); 870 } 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 find(const key_type& __x) 921 { 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 #if __cplusplus > 201703L 942 /** 943 * @brief Finds whether an element with the given key exists. 944 * @param __x Key of elements to be located. 945 * @return True if there is any element with the specified key. 946 */ 947 bool 948 contains(const key_type& __x) const 949 { return _M_h.find(__x) != _M_h.end(); } 950 #endif 951 952 //@{ 953 /** 954 * @brief Finds a subsequence matching given key. 955 * @param __x Key to be located. 956 * @return Pair of iterators that possibly points to the subsequence 957 * matching given key. 958 * 959 * This function probably only makes sense for %unordered_multimap. 960 */ 961 std::pair<iterator, iterator> 962 equal_range(const key_type& __x) 963 { return _M_h.equal_range(__x); } 964 965 std::pair<const_iterator, const_iterator> 966 equal_range(const key_type& __x) const 967 { return _M_h.equal_range(__x); } 968 //@} 969 970 //@{ 971 /** 972 * @brief Subscript ( @c [] ) access to %unordered_map data. 973 * @param __k The key for which data should be retrieved. 974 * @return A reference to the data of the (key,data) %pair. 975 * 976 * Allows for easy lookup with the subscript ( @c [] )operator. Returns 977 * data associated with the key specified in subscript. If the key does 978 * not exist, a pair with that key is created using default values, which 979 * is then returned. 980 * 981 * Lookup requires constant time. 982 */ 983 mapped_type& 984 operator[](const key_type& __k) 985 { return _M_h[__k]; } 986 987 mapped_type& 988 operator[](key_type&& __k) 989 { return _M_h[std::move(__k)]; } 990 //@} 991 992 //@{ 993 /** 994 * @brief Access to %unordered_map data. 995 * @param __k The key for which data should be retrieved. 996 * @return A reference to the data whose key is equal to @a __k, if 997 * such a data is present in the %unordered_map. 998 * @throw std::out_of_range If no such data is present. 999 */ 1000 mapped_type& 1001 at(const key_type& __k) 1002 { return _M_h.at(__k); } 1003 1004 const mapped_type& 1005 at(const key_type& __k) const 1006 { return _M_h.at(__k); } 1007 //@} 1008 1009 // bucket interface. 1010 1011 /// Returns the number of buckets of the %unordered_map. 1012 size_type 1013 bucket_count() const noexcept 1014 { return _M_h.bucket_count(); } 1015 1016 /// Returns the maximum number of buckets of the %unordered_map. 1017 size_type 1018 max_bucket_count() const noexcept 1019 { return _M_h.max_bucket_count(); } 1020 1021 /* 1022 * @brief Returns the number of elements in a given bucket. 1023 * @param __n A bucket index. 1024 * @return The number of elements in the bucket. 1025 */ 1026 size_type 1027 bucket_size(size_type __n) const 1028 { return _M_h.bucket_size(__n); } 1029 1030 /* 1031 * @brief Returns the bucket index of a given element. 1032 * @param __key A key instance. 1033 * @return The key bucket index. 1034 */ 1035 size_type 1036 bucket(const key_type& __key) const 1037 { return _M_h.bucket(__key); } 1038 1039 /** 1040 * @brief Returns a read/write iterator pointing to the first bucket 1041 * element. 1042 * @param __n The bucket index. 1043 * @return A read/write local iterator. 1044 */ 1045 local_iterator 1046 begin(size_type __n) 1047 { return _M_h.begin(__n); } 1048 1049 //@{ 1050 /** 1051 * @brief Returns a read-only (constant) iterator pointing to the first 1052 * bucket element. 1053 * @param __n The bucket index. 1054 * @return A read-only local iterator. 1055 */ 1056 const_local_iterator 1057 begin(size_type __n) const 1058 { return _M_h.begin(__n); } 1059 1060 const_local_iterator 1061 cbegin(size_type __n) const 1062 { return _M_h.cbegin(__n); } 1063 //@} 1064 1065 /** 1066 * @brief Returns a read/write iterator pointing to one past the last 1067 * bucket elements. 1068 * @param __n The bucket index. 1069 * @return A read/write local iterator. 1070 */ 1071 local_iterator 1072 end(size_type __n) 1073 { return _M_h.end(__n); } 1074 1075 //@{ 1076 /** 1077 * @brief Returns a read-only (constant) iterator pointing to one past 1078 * the last bucket elements. 1079 * @param __n The bucket index. 1080 * @return A read-only local iterator. 1081 */ 1082 const_local_iterator 1083 end(size_type __n) const 1084 { return _M_h.end(__n); } 1085 1086 const_local_iterator 1087 cend(size_type __n) const 1088 { return _M_h.cend(__n); } 1089 //@} 1090 1091 // hash policy. 1092 1093 /// Returns the average number of elements per bucket. 1094 float 1095 load_factor() const noexcept 1096 { return _M_h.load_factor(); } 1097 1098 /// Returns a positive number that the %unordered_map tries to keep the 1099 /// load factor less than or equal to. 1100 float 1101 max_load_factor() const noexcept 1102 { return _M_h.max_load_factor(); } 1103 1104 /** 1105 * @brief Change the %unordered_map maximum load factor. 1106 * @param __z The new maximum load factor. 1107 */ 1108 void 1109 max_load_factor(float __z) 1110 { _M_h.max_load_factor(__z); } 1111 1112 /** 1113 * @brief May rehash the %unordered_map. 1114 * @param __n The new number of buckets. 1115 * 1116 * Rehash will occur only if the new number of buckets respect the 1117 * %unordered_map maximum load factor. 1118 */ 1119 void 1120 rehash(size_type __n) 1121 { _M_h.rehash(__n); } 1122 1123 /** 1124 * @brief Prepare the %unordered_map for a specified number of 1125 * elements. 1126 * @param __n Number of elements required. 1127 * 1128 * Same as rehash(ceil(n / max_load_factor())). 1129 */ 1130 void 1131 reserve(size_type __n) 1132 { _M_h.reserve(__n); } 1133 1134 template<typename _Key1, typename _Tp1, typename _Hash1, typename _Pred1, 1135 typename _Alloc1> 1136 friend bool 1137 operator==(const unordered_map<_Key1, _Tp1, _Hash1, _Pred1, _Alloc1>&, 1138 const unordered_map<_Key1, _Tp1, _Hash1, _Pred1, _Alloc1>&); 1139 }; 1140 1141 #if __cpp_deduction_guides >= 201606 1142 1143 template<typename _InputIterator, 1144 typename _Hash = hash<__iter_key_t<_InputIterator>>, 1145 typename _Pred = equal_to<__iter_key_t<_InputIterator>>, 1146 typename _Allocator = allocator<__iter_to_alloc_t<_InputIterator>>, 1147 typename = _RequireInputIter<_InputIterator>, 1148 typename = _RequireNotAllocatorOrIntegral<_Hash>, 1149 typename = _RequireNotAllocator<_Pred>, 1150 typename = _RequireAllocator<_Allocator>> 1151 unordered_map(_InputIterator, _InputIterator, 1152 typename unordered_map<int, int>::size_type = {}, 1153 _Hash = _Hash(), _Pred = _Pred(), _Allocator = _Allocator()) 1154 -> unordered_map<__iter_key_t<_InputIterator>, 1155 __iter_val_t<_InputIterator>, 1156 _Hash, _Pred, _Allocator>; 1157 1158 template<typename _Key, typename _Tp, typename _Hash = hash<_Key>, 1159 typename _Pred = equal_to<_Key>, 1160 typename _Allocator = allocator<pair<const _Key, _Tp>>, 1161 typename = _RequireNotAllocatorOrIntegral<_Hash>, 1162 typename = _RequireNotAllocator<_Pred>, 1163 typename = _RequireAllocator<_Allocator>> 1164 unordered_map(initializer_list<pair<_Key, _Tp>>, 1165 typename unordered_map<int, int>::size_type = {}, 1166 _Hash = _Hash(), _Pred = _Pred(), _Allocator = _Allocator()) 1167 -> unordered_map<_Key, _Tp, _Hash, _Pred, _Allocator>; 1168 1169 template<typename _InputIterator, typename _Allocator, 1170 typename = _RequireInputIter<_InputIterator>, 1171 typename = _RequireAllocator<_Allocator>> 1172 unordered_map(_InputIterator, _InputIterator, 1173 typename unordered_map<int, int>::size_type, _Allocator) 1174 -> unordered_map<__iter_key_t<_InputIterator>, 1175 __iter_val_t<_InputIterator>, 1176 hash<__iter_key_t<_InputIterator>>, 1177 equal_to<__iter_key_t<_InputIterator>>, 1178 _Allocator>; 1179 1180 template<typename _InputIterator, typename _Allocator, 1181 typename = _RequireInputIter<_InputIterator>, 1182 typename = _RequireAllocator<_Allocator>> 1183 unordered_map(_InputIterator, _InputIterator, _Allocator) 1184 -> unordered_map<__iter_key_t<_InputIterator>, 1185 __iter_val_t<_InputIterator>, 1186 hash<__iter_key_t<_InputIterator>>, 1187 equal_to<__iter_key_t<_InputIterator>>, 1188 _Allocator>; 1189 1190 template<typename _InputIterator, typename _Hash, typename _Allocator, 1191 typename = _RequireInputIter<_InputIterator>, 1192 typename = _RequireNotAllocatorOrIntegral<_Hash>, 1193 typename = _RequireAllocator<_Allocator>> 1194 unordered_map(_InputIterator, _InputIterator, 1195 typename unordered_map<int, int>::size_type, 1196 _Hash, _Allocator) 1197 -> unordered_map<__iter_key_t<_InputIterator>, 1198 __iter_val_t<_InputIterator>, _Hash, 1199 equal_to<__iter_key_t<_InputIterator>>, _Allocator>; 1200 1201 template<typename _Key, typename _Tp, typename _Allocator, 1202 typename = _RequireAllocator<_Allocator>> 1203 unordered_map(initializer_list<pair<_Key, _Tp>>, 1204 typename unordered_map<int, int>::size_type, 1205 _Allocator) 1206 -> unordered_map<_Key, _Tp, hash<_Key>, equal_to<_Key>, _Allocator>; 1207 1208 template<typename _Key, typename _Tp, typename _Allocator, 1209 typename = _RequireAllocator<_Allocator>> 1210 unordered_map(initializer_list<pair<_Key, _Tp>>, _Allocator) 1211 -> unordered_map<_Key, _Tp, hash<_Key>, equal_to<_Key>, _Allocator>; 1212 1213 template<typename _Key, typename _Tp, typename _Hash, typename _Allocator, 1214 typename = _RequireNotAllocatorOrIntegral<_Hash>, 1215 typename = _RequireAllocator<_Allocator>> 1216 unordered_map(initializer_list<pair<_Key, _Tp>>, 1217 typename unordered_map<int, int>::size_type, 1218 _Hash, _Allocator) 1219 -> unordered_map<_Key, _Tp, _Hash, equal_to<_Key>, _Allocator>; 1220 1221 #endif 1222 1223 /** 1224 * @brief A standard container composed of equivalent keys 1225 * (possibly containing multiple of each key value) that associates 1226 * values of another type with the keys. 1227 * 1228 * @ingroup unordered_associative_containers 1229 * 1230 * @tparam _Key Type of key objects. 1231 * @tparam _Tp Type of mapped objects. 1232 * @tparam _Hash Hashing function object type, defaults to hash<_Value>. 1233 * @tparam _Pred Predicate function object type, defaults 1234 * to equal_to<_Value>. 1235 * @tparam _Alloc Allocator type, defaults to 1236 * std::allocator<std::pair<const _Key, _Tp>>. 1237 * 1238 * Meets the requirements of a <a href="tables.html#65">container</a>, and 1239 * <a href="tables.html#xx">unordered associative container</a> 1240 * 1241 * The resulting value type of the container is std::pair<const _Key, _Tp>. 1242 * 1243 * Base is _Hashtable, dispatched at compile time via template 1244 * alias __ummap_hashtable. 1245 */ 1246 template<typename _Key, typename _Tp, 1247 typename _Hash = hash<_Key>, 1248 typename _Pred = equal_to<_Key>, 1249 typename _Alloc = allocator<std::pair<const _Key, _Tp>>> 1250 class unordered_multimap 1251 { 1252 typedef __ummap_hashtable<_Key, _Tp, _Hash, _Pred, _Alloc> _Hashtable; 1253 _Hashtable _M_h; 1254 1255 public: 1256 // typedefs: 1257 //@{ 1258 /// Public typedefs. 1259 typedef typename _Hashtable::key_type key_type; 1260 typedef typename _Hashtable::value_type value_type; 1261 typedef typename _Hashtable::mapped_type mapped_type; 1262 typedef typename _Hashtable::hasher hasher; 1263 typedef typename _Hashtable::key_equal key_equal; 1264 typedef typename _Hashtable::allocator_type allocator_type; 1265 //@} 1266 1267 //@{ 1268 /// Iterator-related typedefs. 1269 typedef typename _Hashtable::pointer pointer; 1270 typedef typename _Hashtable::const_pointer const_pointer; 1271 typedef typename _Hashtable::reference reference; 1272 typedef typename _Hashtable::const_reference const_reference; 1273 typedef typename _Hashtable::iterator iterator; 1274 typedef typename _Hashtable::const_iterator const_iterator; 1275 typedef typename _Hashtable::local_iterator local_iterator; 1276 typedef typename _Hashtable::const_local_iterator const_local_iterator; 1277 typedef typename _Hashtable::size_type size_type; 1278 typedef typename _Hashtable::difference_type difference_type; 1279 //@} 1280 1281 #if __cplusplus > 201402L 1282 using node_type = typename _Hashtable::node_type; 1283 #endif 1284 1285 //construct/destroy/copy 1286 1287 /// Default constructor. 1288 unordered_multimap() = default; 1289 1290 /** 1291 * @brief Default constructor creates no elements. 1292 * @param __n Mnimal 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 explicit 1298 unordered_multimap(size_type __n, 1299 const hasher& __hf = hasher(), 1300 const key_equal& __eql = key_equal(), 1301 const allocator_type& __a = allocator_type()) 1302 : _M_h(__n, __hf, __eql, __a) 1303 { } 1304 1305 /** 1306 * @brief Builds an %unordered_multimap from a range. 1307 * @param __first An input iterator. 1308 * @param __last An input iterator. 1309 * @param __n Minimal initial number of buckets. 1310 * @param __hf A hash functor. 1311 * @param __eql A key equality functor. 1312 * @param __a An allocator object. 1313 * 1314 * Create an %unordered_multimap consisting of copies of the elements 1315 * from [__first,__last). This is linear in N (where N is 1316 * distance(__first,__last)). 1317 */ 1318 template<typename _InputIterator> 1319 unordered_multimap(_InputIterator __first, _InputIterator __last, 1320 size_type __n = 0, 1321 const hasher& __hf = hasher(), 1322 const key_equal& __eql = key_equal(), 1323 const allocator_type& __a = allocator_type()) 1324 : _M_h(__first, __last, __n, __hf, __eql, __a) 1325 { } 1326 1327 /// Copy constructor. 1328 unordered_multimap(const unordered_multimap&) = default; 1329 1330 /// Move constructor. 1331 unordered_multimap(unordered_multimap&&) = default; 1332 1333 /** 1334 * @brief Creates an %unordered_multimap with no elements. 1335 * @param __a An allocator object. 1336 */ 1337 explicit 1338 unordered_multimap(const allocator_type& __a) 1339 : _M_h(__a) 1340 { } 1341 1342 /* 1343 * @brief Copy constructor with allocator argument. 1344 * @param __uset Input %unordered_multimap to copy. 1345 * @param __a An allocator object. 1346 */ 1347 unordered_multimap(const unordered_multimap& __ummap, 1348 const allocator_type& __a) 1349 : _M_h(__ummap._M_h, __a) 1350 { } 1351 1352 /* 1353 * @brief Move constructor with allocator argument. 1354 * @param __uset Input %unordered_multimap to move. 1355 * @param __a An allocator object. 1356 */ 1357 unordered_multimap(unordered_multimap&& __ummap, 1358 const allocator_type& __a) 1359 : _M_h(std::move(__ummap._M_h), __a) 1360 { } 1361 1362 /** 1363 * @brief Builds an %unordered_multimap from an initializer_list. 1364 * @param __l An initializer_list. 1365 * @param __n Minimal initial number of buckets. 1366 * @param __hf A hash functor. 1367 * @param __eql A key equality functor. 1368 * @param __a An allocator object. 1369 * 1370 * Create an %unordered_multimap consisting of copies of the elements in 1371 * the list. This is linear in N (where N is @a __l.size()). 1372 */ 1373 unordered_multimap(initializer_list<value_type> __l, 1374 size_type __n = 0, 1375 const hasher& __hf = hasher(), 1376 const key_equal& __eql = key_equal(), 1377 const allocator_type& __a = allocator_type()) 1378 : _M_h(__l, __n, __hf, __eql, __a) 1379 { } 1380 1381 unordered_multimap(size_type __n, const allocator_type& __a) 1382 : unordered_multimap(__n, hasher(), key_equal(), __a) 1383 { } 1384 1385 unordered_multimap(size_type __n, const hasher& __hf, 1386 const allocator_type& __a) 1387 : unordered_multimap(__n, __hf, key_equal(), __a) 1388 { } 1389 1390 template<typename _InputIterator> 1391 unordered_multimap(_InputIterator __first, _InputIterator __last, 1392 size_type __n, 1393 const allocator_type& __a) 1394 : unordered_multimap(__first, __last, __n, hasher(), key_equal(), __a) 1395 { } 1396 1397 template<typename _InputIterator> 1398 unordered_multimap(_InputIterator __first, _InputIterator __last, 1399 size_type __n, const hasher& __hf, 1400 const allocator_type& __a) 1401 : unordered_multimap(__first, __last, __n, __hf, key_equal(), __a) 1402 { } 1403 1404 unordered_multimap(initializer_list<value_type> __l, 1405 size_type __n, 1406 const allocator_type& __a) 1407 : unordered_multimap(__l, __n, hasher(), key_equal(), __a) 1408 { } 1409 1410 unordered_multimap(initializer_list<value_type> __l, 1411 size_type __n, const hasher& __hf, 1412 const allocator_type& __a) 1413 : unordered_multimap(__l, __n, __hf, key_equal(), __a) 1414 { } 1415 1416 /// Copy assignment operator. 1417 unordered_multimap& 1418 operator=(const unordered_multimap&) = default; 1419 1420 /// Move assignment operator. 1421 unordered_multimap& 1422 operator=(unordered_multimap&&) = default; 1423 1424 /** 1425 * @brief %Unordered_multimap list assignment operator. 1426 * @param __l An initializer_list. 1427 * 1428 * This function fills an %unordered_multimap with copies of the 1429 * elements in the initializer list @a __l. 1430 * 1431 * Note that the assignment completely changes the %unordered_multimap 1432 * and that the resulting %unordered_multimap's size is the same as the 1433 * number of elements assigned. 1434 */ 1435 unordered_multimap& 1436 operator=(initializer_list<value_type> __l) 1437 { 1438 _M_h = __l; 1439 return *this; 1440 } 1441 1442 /// Returns the allocator object used by the %unordered_multimap. 1443 allocator_type 1444 get_allocator() const noexcept 1445 { return _M_h.get_allocator(); } 1446 1447 // size and capacity: 1448 1449 /// Returns true if the %unordered_multimap is empty. 1450 _GLIBCXX_NODISCARD bool 1451 empty() const noexcept 1452 { return _M_h.empty(); } 1453 1454 /// Returns the size of the %unordered_multimap. 1455 size_type 1456 size() const noexcept 1457 { return _M_h.size(); } 1458 1459 /// Returns the maximum size of the %unordered_multimap. 1460 size_type 1461 max_size() const noexcept 1462 { return _M_h.max_size(); } 1463 1464 // iterators. 1465 1466 /** 1467 * Returns a read/write iterator that points to the first element in the 1468 * %unordered_multimap. 1469 */ 1470 iterator 1471 begin() noexcept 1472 { return _M_h.begin(); } 1473 1474 //@{ 1475 /** 1476 * Returns a read-only (constant) iterator that points to the first 1477 * element in the %unordered_multimap. 1478 */ 1479 const_iterator 1480 begin() const noexcept 1481 { return _M_h.begin(); } 1482 1483 const_iterator 1484 cbegin() const noexcept 1485 { return _M_h.begin(); } 1486 //@} 1487 1488 /** 1489 * Returns a read/write iterator that points one past the last element in 1490 * the %unordered_multimap. 1491 */ 1492 iterator 1493 end() noexcept 1494 { return _M_h.end(); } 1495 1496 //@{ 1497 /** 1498 * Returns a read-only (constant) iterator that points one past the last 1499 * element in the %unordered_multimap. 1500 */ 1501 const_iterator 1502 end() const noexcept 1503 { return _M_h.end(); } 1504 1505 const_iterator 1506 cend() const noexcept 1507 { return _M_h.end(); } 1508 //@} 1509 1510 // modifiers. 1511 1512 /** 1513 * @brief Attempts to build and insert a std::pair into the 1514 * %unordered_multimap. 1515 * 1516 * @param __args Arguments used to generate a new pair instance (see 1517 * std::piecewise_contruct for passing arguments to each 1518 * part of the pair constructor). 1519 * 1520 * @return An iterator that points to the inserted pair. 1521 * 1522 * This function attempts to build and insert a (key, value) %pair into 1523 * the %unordered_multimap. 1524 * 1525 * Insertion requires amortized constant time. 1526 */ 1527 template<typename... _Args> 1528 iterator 1529 emplace(_Args&&... __args) 1530 { return _M_h.emplace(std::forward<_Args>(__args)...); } 1531 1532 /** 1533 * @brief Attempts to build and insert a std::pair into the 1534 * %unordered_multimap. 1535 * 1536 * @param __pos An iterator that serves as a hint as to where the pair 1537 * should be inserted. 1538 * @param __args Arguments used to generate a new pair instance (see 1539 * std::piecewise_contruct for passing arguments to each 1540 * part of the pair constructor). 1541 * @return An iterator that points to the element with key of the 1542 * std::pair built from @a __args. 1543 * 1544 * Note that the first parameter is only a hint and can potentially 1545 * improve the performance of the insertion process. A bad hint would 1546 * cause no gains in efficiency. 1547 * 1548 * See 1549 * https://gcc.gnu.org/onlinedocs/libstdc++/manual/associative.html#containers.associative.insert_hints 1550 * for more on @a hinting. 1551 * 1552 * Insertion requires amortized constant time. 1553 */ 1554 template<typename... _Args> 1555 iterator 1556 emplace_hint(const_iterator __pos, _Args&&... __args) 1557 { return _M_h.emplace_hint(__pos, std::forward<_Args>(__args)...); } 1558 1559 //@{ 1560 /** 1561 * @brief Inserts a std::pair into the %unordered_multimap. 1562 * @param __x Pair to be inserted (see std::make_pair for easy 1563 * creation of pairs). 1564 * 1565 * @return An iterator that points to the inserted pair. 1566 * 1567 * Insertion requires amortized constant time. 1568 */ 1569 iterator 1570 insert(const value_type& __x) 1571 { return _M_h.insert(__x); } 1572 1573 iterator 1574 insert(value_type&& __x) 1575 { return _M_h.insert(std::move(__x)); } 1576 1577 template<typename _Pair> 1578 __enable_if_t<is_constructible<value_type, _Pair&&>::value, iterator> 1579 insert(_Pair&& __x) 1580 { return _M_h.emplace(std::forward<_Pair>(__x)); } 1581 //@} 1582 1583 //@{ 1584 /** 1585 * @brief Inserts a std::pair into the %unordered_multimap. 1586 * @param __hint An iterator that serves as a hint as to where the 1587 * pair should be inserted. 1588 * @param __x Pair to be inserted (see std::make_pair for easy creation 1589 * of pairs). 1590 * @return An iterator that points to the element with key of 1591 * @a __x (may or may not be the %pair passed in). 1592 * 1593 * Note that the first parameter is only a hint and can potentially 1594 * improve the performance of the insertion process. A bad hint would 1595 * cause no gains in efficiency. 1596 * 1597 * See 1598 * https://gcc.gnu.org/onlinedocs/libstdc++/manual/associative.html#containers.associative.insert_hints 1599 * for more on @a hinting. 1600 * 1601 * Insertion requires amortized constant time. 1602 */ 1603 iterator 1604 insert(const_iterator __hint, const value_type& __x) 1605 { return _M_h.insert(__hint, __x); } 1606 1607 // _GLIBCXX_RESOLVE_LIB_DEFECTS 1608 // 2354. Unnecessary copying when inserting into maps with braced-init 1609 iterator 1610 insert(const_iterator __hint, value_type&& __x) 1611 { return _M_h.insert(__hint, std::move(__x)); } 1612 1613 template<typename _Pair> 1614 __enable_if_t<is_constructible<value_type, _Pair&&>::value, iterator> 1615 insert(const_iterator __hint, _Pair&& __x) 1616 { return _M_h.emplace_hint(__hint, std::forward<_Pair>(__x)); } 1617 //@} 1618 1619 /** 1620 * @brief A template function that attempts to insert a range of 1621 * elements. 1622 * @param __first Iterator pointing to the start of the range to be 1623 * inserted. 1624 * @param __last Iterator pointing to the end of the range. 1625 * 1626 * Complexity similar to that of the range constructor. 1627 */ 1628 template<typename _InputIterator> 1629 void 1630 insert(_InputIterator __first, _InputIterator __last) 1631 { _M_h.insert(__first, __last); } 1632 1633 /** 1634 * @brief Attempts to insert a list of elements into the 1635 * %unordered_multimap. 1636 * @param __l A std::initializer_list<value_type> of elements 1637 * to be inserted. 1638 * 1639 * Complexity similar to that of the range constructor. 1640 */ 1641 void 1642 insert(initializer_list<value_type> __l) 1643 { _M_h.insert(__l); } 1644 1645 #if __cplusplus > 201402L 1646 /// Extract a node. 1647 node_type 1648 extract(const_iterator __pos) 1649 { 1650 __glibcxx_assert(__pos != end()); 1651 return _M_h.extract(__pos); 1652 } 1653 1654 /// Extract a node. 1655 node_type 1656 extract(const key_type& __key) 1657 { return _M_h.extract(__key); } 1658 1659 /// Re-insert an extracted node. 1660 iterator 1661 insert(node_type&& __nh) 1662 { return _M_h._M_reinsert_node_multi(cend(), std::move(__nh)); } 1663 1664 /// Re-insert an extracted node. 1665 iterator 1666 insert(const_iterator __hint, node_type&& __nh) 1667 { return _M_h._M_reinsert_node_multi(__hint, std::move(__nh)); } 1668 #endif // C++17 1669 1670 //@{ 1671 /** 1672 * @brief Erases an element from an %unordered_multimap. 1673 * @param __position An iterator pointing to the element to be erased. 1674 * @return An iterator pointing to the element immediately following 1675 * @a __position prior to the element being erased. If no such 1676 * element exists, end() is returned. 1677 * 1678 * This function erases an element, pointed to by the given iterator, 1679 * from an %unordered_multimap. 1680 * Note that this function only erases the element, and that if the 1681 * element is itself a pointer, the pointed-to memory is not touched in 1682 * any way. Managing the pointer is the user's responsibility. 1683 */ 1684 iterator 1685 erase(const_iterator __position) 1686 { return _M_h.erase(__position); } 1687 1688 // LWG 2059. 1689 iterator 1690 erase(iterator __position) 1691 { return _M_h.erase(__position); } 1692 //@} 1693 1694 /** 1695 * @brief Erases elements according to the provided key. 1696 * @param __x Key of elements to be erased. 1697 * @return The number of elements erased. 1698 * 1699 * This function erases all the elements located by the given key from 1700 * an %unordered_multimap. 1701 * Note that this function only erases the element, and that if the 1702 * element is itself a pointer, the pointed-to memory is not touched in 1703 * any way. Managing the pointer is the user's responsibility. 1704 */ 1705 size_type 1706 erase(const key_type& __x) 1707 { return _M_h.erase(__x); } 1708 1709 /** 1710 * @brief Erases a [__first,__last) range of elements from an 1711 * %unordered_multimap. 1712 * @param __first Iterator pointing to the start of the range to be 1713 * erased. 1714 * @param __last Iterator pointing to the end of the range to 1715 * be erased. 1716 * @return The iterator @a __last. 1717 * 1718 * This function erases a sequence of elements from an 1719 * %unordered_multimap. 1720 * Note that this function only erases the elements, and that if 1721 * the element is itself a pointer, the pointed-to memory is not touched 1722 * in any way. Managing the pointer is the user's responsibility. 1723 */ 1724 iterator 1725 erase(const_iterator __first, const_iterator __last) 1726 { return _M_h.erase(__first, __last); } 1727 1728 /** 1729 * Erases all elements in an %unordered_multimap. 1730 * Note that this function only erases the elements, and that if the 1731 * elements themselves are pointers, the pointed-to memory is not touched 1732 * in any way. Managing the pointer is the user's responsibility. 1733 */ 1734 void 1735 clear() noexcept 1736 { _M_h.clear(); } 1737 1738 /** 1739 * @brief Swaps data with another %unordered_multimap. 1740 * @param __x An %unordered_multimap of the same element and allocator 1741 * types. 1742 * 1743 * This exchanges the elements between two %unordered_multimap in 1744 * constant time. 1745 * Note that the global std::swap() function is specialized such that 1746 * std::swap(m1,m2) will feed to this function. 1747 */ 1748 void 1749 swap(unordered_multimap& __x) 1750 noexcept( noexcept(_M_h.swap(__x._M_h)) ) 1751 { _M_h.swap(__x._M_h); } 1752 1753 #if __cplusplus > 201402L 1754 template<typename, typename, typename> 1755 friend class std::_Hash_merge_helper; 1756 1757 template<typename _H2, typename _P2> 1758 void 1759 merge(unordered_multimap<_Key, _Tp, _H2, _P2, _Alloc>& __source) 1760 { 1761 using _Merge_helper 1762 = _Hash_merge_helper<unordered_multimap, _H2, _P2>; 1763 _M_h._M_merge_multi(_Merge_helper::_S_get_table(__source)); 1764 } 1765 1766 template<typename _H2, typename _P2> 1767 void 1768 merge(unordered_multimap<_Key, _Tp, _H2, _P2, _Alloc>&& __source) 1769 { merge(__source); } 1770 1771 template<typename _H2, typename _P2> 1772 void 1773 merge(unordered_map<_Key, _Tp, _H2, _P2, _Alloc>& __source) 1774 { 1775 using _Merge_helper 1776 = _Hash_merge_helper<unordered_multimap, _H2, _P2>; 1777 _M_h._M_merge_multi(_Merge_helper::_S_get_table(__source)); 1778 } 1779 1780 template<typename _H2, typename _P2> 1781 void 1782 merge(unordered_map<_Key, _Tp, _H2, _P2, _Alloc>&& __source) 1783 { merge(__source); } 1784 #endif // C++17 1785 1786 // observers. 1787 1788 /// Returns the hash functor object with which the %unordered_multimap 1789 /// was constructed. 1790 hasher 1791 hash_function() const 1792 { return _M_h.hash_function(); } 1793 1794 /// Returns the key comparison object with which the %unordered_multimap 1795 /// was constructed. 1796 key_equal 1797 key_eq() const 1798 { return _M_h.key_eq(); } 1799 1800 // lookup. 1801 1802 //@{ 1803 /** 1804 * @brief Tries to locate an element in an %unordered_multimap. 1805 * @param __x Key to be located. 1806 * @return Iterator pointing to sought-after element, or end() if not 1807 * found. 1808 * 1809 * This function takes a key and tries to locate the element with which 1810 * the key matches. If successful the function returns an iterator 1811 * pointing to the sought after element. If unsuccessful it returns the 1812 * past-the-end ( @c end() ) iterator. 1813 */ 1814 iterator 1815 find(const key_type& __x) 1816 { return _M_h.find(__x); } 1817 1818 const_iterator 1819 find(const key_type& __x) const 1820 { return _M_h.find(__x); } 1821 //@} 1822 1823 /** 1824 * @brief Finds the number of elements. 1825 * @param __x Key to count. 1826 * @return Number of elements with specified key. 1827 */ 1828 size_type 1829 count(const key_type& __x) const 1830 { return _M_h.count(__x); } 1831 1832 #if __cplusplus > 201703L 1833 /** 1834 * @brief Finds whether an element with the given key exists. 1835 * @param __x Key of elements to be located. 1836 * @return True if there is any element with the specified key. 1837 */ 1838 bool 1839 contains(const key_type& __x) const 1840 { return _M_h.find(__x) != _M_h.end(); } 1841 #endif 1842 1843 //@{ 1844 /** 1845 * @brief Finds a subsequence matching given key. 1846 * @param __x Key to be located. 1847 * @return Pair of iterators that possibly points to the subsequence 1848 * matching given key. 1849 */ 1850 std::pair<iterator, iterator> 1851 equal_range(const key_type& __x) 1852 { return _M_h.equal_range(__x); } 1853 1854 std::pair<const_iterator, const_iterator> 1855 equal_range(const key_type& __x) const 1856 { return _M_h.equal_range(__x); } 1857 //@} 1858 1859 // bucket interface. 1860 1861 /// Returns the number of buckets of the %unordered_multimap. 1862 size_type 1863 bucket_count() const noexcept 1864 { return _M_h.bucket_count(); } 1865 1866 /// Returns the maximum number of buckets of the %unordered_multimap. 1867 size_type 1868 max_bucket_count() const noexcept 1869 { return _M_h.max_bucket_count(); } 1870 1871 /* 1872 * @brief Returns the number of elements in a given bucket. 1873 * @param __n A bucket index. 1874 * @return The number of elements in the bucket. 1875 */ 1876 size_type 1877 bucket_size(size_type __n) const 1878 { return _M_h.bucket_size(__n); } 1879 1880 /* 1881 * @brief Returns the bucket index of a given element. 1882 * @param __key A key instance. 1883 * @return The key bucket index. 1884 */ 1885 size_type 1886 bucket(const key_type& __key) const 1887 { return _M_h.bucket(__key); } 1888 1889 /** 1890 * @brief Returns a read/write iterator pointing to the first bucket 1891 * element. 1892 * @param __n The bucket index. 1893 * @return A read/write local iterator. 1894 */ 1895 local_iterator 1896 begin(size_type __n) 1897 { return _M_h.begin(__n); } 1898 1899 //@{ 1900 /** 1901 * @brief Returns a read-only (constant) iterator pointing to the first 1902 * bucket element. 1903 * @param __n The bucket index. 1904 * @return A read-only local iterator. 1905 */ 1906 const_local_iterator 1907 begin(size_type __n) const 1908 { return _M_h.begin(__n); } 1909 1910 const_local_iterator 1911 cbegin(size_type __n) const 1912 { return _M_h.cbegin(__n); } 1913 //@} 1914 1915 /** 1916 * @brief Returns a read/write iterator pointing to one past the last 1917 * bucket elements. 1918 * @param __n The bucket index. 1919 * @return A read/write local iterator. 1920 */ 1921 local_iterator 1922 end(size_type __n) 1923 { return _M_h.end(__n); } 1924 1925 //@{ 1926 /** 1927 * @brief Returns a read-only (constant) iterator pointing to one past 1928 * the last bucket elements. 1929 * @param __n The bucket index. 1930 * @return A read-only local iterator. 1931 */ 1932 const_local_iterator 1933 end(size_type __n) const 1934 { return _M_h.end(__n); } 1935 1936 const_local_iterator 1937 cend(size_type __n) const 1938 { return _M_h.cend(__n); } 1939 //@} 1940 1941 // hash policy. 1942 1943 /// Returns the average number of elements per bucket. 1944 float 1945 load_factor() const noexcept 1946 { return _M_h.load_factor(); } 1947 1948 /// Returns a positive number that the %unordered_multimap tries to keep 1949 /// the load factor less than or equal to. 1950 float 1951 max_load_factor() const noexcept 1952 { return _M_h.max_load_factor(); } 1953 1954 /** 1955 * @brief Change the %unordered_multimap maximum load factor. 1956 * @param __z The new maximum load factor. 1957 */ 1958 void 1959 max_load_factor(float __z) 1960 { _M_h.max_load_factor(__z); } 1961 1962 /** 1963 * @brief May rehash the %unordered_multimap. 1964 * @param __n The new number of buckets. 1965 * 1966 * Rehash will occur only if the new number of buckets respect the 1967 * %unordered_multimap maximum load factor. 1968 */ 1969 void 1970 rehash(size_type __n) 1971 { _M_h.rehash(__n); } 1972 1973 /** 1974 * @brief Prepare the %unordered_multimap for a specified number of 1975 * elements. 1976 * @param __n Number of elements required. 1977 * 1978 * Same as rehash(ceil(n / max_load_factor())). 1979 */ 1980 void 1981 reserve(size_type __n) 1982 { _M_h.reserve(__n); } 1983 1984 template<typename _Key1, typename _Tp1, typename _Hash1, typename _Pred1, 1985 typename _Alloc1> 1986 friend bool 1987 operator==(const unordered_multimap<_Key1, _Tp1, 1988 _Hash1, _Pred1, _Alloc1>&, 1989 const unordered_multimap<_Key1, _Tp1, 1990 _Hash1, _Pred1, _Alloc1>&); 1991 }; 1992 1993 #if __cpp_deduction_guides >= 201606 1994 1995 template<typename _InputIterator, 1996 typename _Hash = hash<__iter_key_t<_InputIterator>>, 1997 typename _Pred = equal_to<__iter_key_t<_InputIterator>>, 1998 typename _Allocator = allocator<__iter_to_alloc_t<_InputIterator>>, 1999 typename = _RequireInputIter<_InputIterator>, 2000 typename = _RequireNotAllocatorOrIntegral<_Hash>, 2001 typename = _RequireNotAllocator<_Pred>, 2002 typename = _RequireAllocator<_Allocator>> 2003 unordered_multimap(_InputIterator, _InputIterator, 2004 unordered_multimap<int, int>::size_type = {}, 2005 _Hash = _Hash(), _Pred = _Pred(), 2006 _Allocator = _Allocator()) 2007 -> unordered_multimap<__iter_key_t<_InputIterator>, 2008 __iter_val_t<_InputIterator>, _Hash, _Pred, 2009 _Allocator>; 2010 2011 template<typename _Key, typename _Tp, typename _Hash = hash<_Key>, 2012 typename _Pred = equal_to<_Key>, 2013 typename _Allocator = allocator<pair<const _Key, _Tp>>, 2014 typename = _RequireNotAllocatorOrIntegral<_Hash>, 2015 typename = _RequireNotAllocator<_Pred>, 2016 typename = _RequireAllocator<_Allocator>> 2017 unordered_multimap(initializer_list<pair<_Key, _Tp>>, 2018 unordered_multimap<int, int>::size_type = {}, 2019 _Hash = _Hash(), _Pred = _Pred(), 2020 _Allocator = _Allocator()) 2021 -> unordered_multimap<_Key, _Tp, _Hash, _Pred, _Allocator>; 2022 2023 template<typename _InputIterator, typename _Allocator, 2024 typename = _RequireInputIter<_InputIterator>, 2025 typename = _RequireAllocator<_Allocator>> 2026 unordered_multimap(_InputIterator, _InputIterator, 2027 unordered_multimap<int, int>::size_type, _Allocator) 2028 -> unordered_multimap<__iter_key_t<_InputIterator>, 2029 __iter_val_t<_InputIterator>, 2030 hash<__iter_key_t<_InputIterator>>, 2031 equal_to<__iter_key_t<_InputIterator>>, _Allocator>; 2032 2033 template<typename _InputIterator, typename _Allocator, 2034 typename = _RequireInputIter<_InputIterator>, 2035 typename = _RequireAllocator<_Allocator>> 2036 unordered_multimap(_InputIterator, _InputIterator, _Allocator) 2037 -> unordered_multimap<__iter_key_t<_InputIterator>, 2038 __iter_val_t<_InputIterator>, 2039 hash<__iter_key_t<_InputIterator>>, 2040 equal_to<__iter_key_t<_InputIterator>>, _Allocator>; 2041 2042 template<typename _InputIterator, typename _Hash, typename _Allocator, 2043 typename = _RequireInputIter<_InputIterator>, 2044 typename = _RequireNotAllocatorOrIntegral<_Hash>, 2045 typename = _RequireAllocator<_Allocator>> 2046 unordered_multimap(_InputIterator, _InputIterator, 2047 unordered_multimap<int, int>::size_type, _Hash, 2048 _Allocator) 2049 -> unordered_multimap<__iter_key_t<_InputIterator>, 2050 __iter_val_t<_InputIterator>, _Hash, 2051 equal_to<__iter_key_t<_InputIterator>>, _Allocator>; 2052 2053 template<typename _Key, typename _Tp, typename _Allocator, 2054 typename = _RequireAllocator<_Allocator>> 2055 unordered_multimap(initializer_list<pair<_Key, _Tp>>, 2056 unordered_multimap<int, int>::size_type, 2057 _Allocator) 2058 -> unordered_multimap<_Key, _Tp, hash<_Key>, equal_to<_Key>, _Allocator>; 2059 2060 template<typename _Key, typename _Tp, typename _Allocator, 2061 typename = _RequireAllocator<_Allocator>> 2062 unordered_multimap(initializer_list<pair<_Key, _Tp>>, _Allocator) 2063 -> unordered_multimap<_Key, _Tp, hash<_Key>, equal_to<_Key>, _Allocator>; 2064 2065 template<typename _Key, typename _Tp, typename _Hash, typename _Allocator, 2066 typename = _RequireNotAllocatorOrIntegral<_Hash>, 2067 typename = _RequireAllocator<_Allocator>> 2068 unordered_multimap(initializer_list<pair<_Key, _Tp>>, 2069 unordered_multimap<int, int>::size_type, 2070 _Hash, _Allocator) 2071 -> unordered_multimap<_Key, _Tp, _Hash, equal_to<_Key>, _Allocator>; 2072 2073 #endif 2074 2075 template<class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 2076 inline void 2077 swap(unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, 2078 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) 2079 noexcept(noexcept(__x.swap(__y))) 2080 { __x.swap(__y); } 2081 2082 template<class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 2083 inline void 2084 swap(unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, 2085 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) 2086 noexcept(noexcept(__x.swap(__y))) 2087 { __x.swap(__y); } 2088 2089 template<class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 2090 inline bool 2091 operator==(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, 2092 const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) 2093 { return __x._M_h._M_equal(__y._M_h); } 2094 2095 template<class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 2096 inline bool 2097 operator!=(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, 2098 const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) 2099 { return !(__x == __y); } 2100 2101 template<class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 2102 inline bool 2103 operator==(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, 2104 const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) 2105 { return __x._M_h._M_equal(__y._M_h); } 2106 2107 template<class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> 2108 inline bool 2109 operator!=(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, 2110 const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) 2111 { return !(__x == __y); } 2112 2113 _GLIBCXX_END_NAMESPACE_CONTAINER 2114 2115 #if __cplusplus > 201402L 2116 // Allow std::unordered_map access to internals of compatible maps. 2117 template<typename _Key, typename _Val, typename _Hash1, typename _Eq1, 2118 typename _Alloc, typename _Hash2, typename _Eq2> 2119 struct _Hash_merge_helper< 2120 _GLIBCXX_STD_C::unordered_map<_Key, _Val, _Hash1, _Eq1, _Alloc>, 2121 _Hash2, _Eq2> 2122 { 2123 private: 2124 template<typename... _Tp> 2125 using unordered_map = _GLIBCXX_STD_C::unordered_map<_Tp...>; 2126 template<typename... _Tp> 2127 using unordered_multimap = _GLIBCXX_STD_C::unordered_multimap<_Tp...>; 2128 2129 friend unordered_map<_Key, _Val, _Hash1, _Eq1, _Alloc>; 2130 2131 static auto& 2132 _S_get_table(unordered_map<_Key, _Val, _Hash2, _Eq2, _Alloc>& __map) 2133 { return __map._M_h; } 2134 2135 static auto& 2136 _S_get_table(unordered_multimap<_Key, _Val, _Hash2, _Eq2, _Alloc>& __map) 2137 { return __map._M_h; } 2138 }; 2139 2140 // Allow std::unordered_multimap access to internals of compatible maps. 2141 template<typename _Key, typename _Val, typename _Hash1, typename _Eq1, 2142 typename _Alloc, typename _Hash2, typename _Eq2> 2143 struct _Hash_merge_helper< 2144 _GLIBCXX_STD_C::unordered_multimap<_Key, _Val, _Hash1, _Eq1, _Alloc>, 2145 _Hash2, _Eq2> 2146 { 2147 private: 2148 template<typename... _Tp> 2149 using unordered_map = _GLIBCXX_STD_C::unordered_map<_Tp...>; 2150 template<typename... _Tp> 2151 using unordered_multimap = _GLIBCXX_STD_C::unordered_multimap<_Tp...>; 2152 2153 friend unordered_multimap<_Key, _Val, _Hash1, _Eq1, _Alloc>; 2154 2155 static auto& 2156 _S_get_table(unordered_map<_Key, _Val, _Hash2, _Eq2, _Alloc>& __map) 2157 { return __map._M_h; } 2158 2159 static auto& 2160 _S_get_table(unordered_multimap<_Key, _Val, _Hash2, _Eq2, _Alloc>& __map) 2161 { return __map._M_h; } 2162 }; 2163 #endif // C++17 2164 2165 _GLIBCXX_END_NAMESPACE_VERSION 2166 } // namespace std 2167 2168 #endif /* _UNORDERED_MAP_H */ 2169