Where Online Learning is simpler!
The C and C++ Include Header Files
/usr/include/c++/13/debug/unordered_map
$ cat -n /usr/include/c++/13/debug/unordered_map 1 // Debugging unordered_map/unordered_multimap implementation -*- C++ -*- 2 3 // Copyright (C) 2003-2023 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 //
. 24 25 /** @file debug/unordered_map 26 * This file is a GNU debug extension to the Standard C++ Library. 27 */ 28 29 #ifndef _GLIBCXX_DEBUG_UNORDERED_MAP 30 #define _GLIBCXX_DEBUG_UNORDERED_MAP 1 31 32 #pragma GCC system_header 33 34 #if __cplusplus < 201103L 35 # include
36 #else 37 # include
38 namespace std _GLIBCXX_VISIBILITY(default) { namespace __debug { 39 template
41 class unordered_map; 42 template
44 class unordered_multimap; 45 } } // namespace std::__debug 46 47 # include
48 49 #include
50 #include
51 #include
52 #include
53 54 namespace std _GLIBCXX_VISIBILITY(default) 55 { 56 namespace __debug 57 { 58 /// Class std::unordered_map with safety/checking/debug instrumentation. 59 template
, 61 typename _Pred = std::equal_to<_Key>, 62 typename _Alloc = std::allocator
> > 63 class unordered_map 64 : public __gnu_debug::_Safe_container< 65 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>, _Alloc, 66 __gnu_debug::_Safe_unordered_container>, 67 public _GLIBCXX_STD_C::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc> 68 { 69 typedef _GLIBCXX_STD_C::unordered_map<_Key, _Tp, _Hash, 70 _Pred, _Alloc> _Base; 71 typedef __gnu_debug::_Safe_container
_Safe; 73 typedef typename _Base::const_iterator _Base_const_iterator; 74 typedef typename _Base::iterator _Base_iterator; 75 typedef typename _Base::const_local_iterator 76 _Base_const_local_iterator; 77 typedef typename _Base::local_iterator _Base_local_iterator; 78 79 template
80 friend class ::__gnu_debug::_Safe_iterator; 81 template
82 friend class ::__gnu_debug::_Safe_local_iterator; 83 84 // Reference wrapper for base class. See PR libstdc++/90102. 85 struct _Base_ref 86 { 87 _Base_ref(const _Base& __r) : _M_ref(__r) { } 88 89 const _Base& _M_ref; 90 }; 91 92 public: 93 typedef typename _Base::size_type size_type; 94 typedef typename _Base::hasher hasher; 95 typedef typename _Base::key_equal key_equal; 96 typedef typename _Base::allocator_type allocator_type; 97 98 typedef typename _Base::key_type key_type; 99 typedef typename _Base::value_type value_type; 100 typedef typename _Base::mapped_type mapped_type; 101 102 typedef typename _Base::pointer pointer; 103 typedef typename _Base::const_pointer const_pointer; 104 typedef typename _Base::reference reference; 105 typedef typename _Base::const_reference const_reference; 106 typedef __gnu_debug::_Safe_iterator< 107 _Base_iterator, unordered_map> iterator; 108 typedef __gnu_debug::_Safe_iterator< 109 _Base_const_iterator, unordered_map> const_iterator; 110 typedef __gnu_debug::_Safe_local_iterator< 111 _Base_local_iterator, unordered_map> local_iterator; 112 typedef __gnu_debug::_Safe_local_iterator< 113 _Base_const_local_iterator, unordered_map> const_local_iterator; 114 typedef typename _Base::difference_type difference_type; 115 116 unordered_map() = default; 117 118 explicit 119 unordered_map(size_type __n, 120 const hasher& __hf = hasher(), 121 const key_equal& __eql = key_equal(), 122 const allocator_type& __a = allocator_type()) 123 : _Base(__n, __hf, __eql, __a) { } 124 125 template
126 unordered_map(_InputIterator __first, _InputIterator __last, 127 size_type __n = 0, 128 const hasher& __hf = hasher(), 129 const key_equal& __eql = key_equal(), 130 const allocator_type& __a = allocator_type()) 131 : _Base(__gnu_debug::__base( 132 __glibcxx_check_valid_constructor_range(__first, __last)), 133 __gnu_debug::__base(__last), __n, 134 __hf, __eql, __a) { } 135 136 unordered_map(const unordered_map&) = default; 137 138 unordered_map(_Base_ref __x) 139 : _Base(__x._M_ref) { } 140 141 unordered_map(unordered_map&&) = default; 142 143 explicit 144 unordered_map(const allocator_type& __a) 145 : _Base(__a) { } 146 147 unordered_map(const unordered_map& __umap, 148 const allocator_type& __a) 149 : _Base(__umap, __a) { } 150 151 unordered_map(unordered_map&& __umap, 152 const allocator_type& __a) 153 noexcept( noexcept(_Base(std::move(__umap), __a)) ) 154 : _Safe(std::move(__umap), __a), 155 _Base(std::move(__umap), __a) { } 156 157 unordered_map(initializer_list
__l, 158 size_type __n = 0, 159 const hasher& __hf = hasher(), 160 const key_equal& __eql = key_equal(), 161 const allocator_type& __a = allocator_type()) 162 : _Base(__l, __n, __hf, __eql, __a) { } 163 164 unordered_map(size_type __n, const allocator_type& __a) 165 : unordered_map(__n, hasher(), key_equal(), __a) 166 { } 167 168 unordered_map(size_type __n, 169 const hasher& __hf, 170 const allocator_type& __a) 171 : unordered_map(__n, __hf, key_equal(), __a) 172 { } 173 174 template
175 unordered_map(_InputIterator __first, _InputIterator __last, 176 size_type __n, 177 const allocator_type& __a) 178 : unordered_map(__first, __last, __n, hasher(), key_equal(), __a) 179 { } 180 181 template
182 unordered_map(_InputIterator __first, _InputIterator __last, 183 size_type __n, 184 const hasher& __hf, 185 const allocator_type& __a) 186 : unordered_map(__first, __last, __n, __hf, key_equal(), __a) 187 { } 188 189 unordered_map(initializer_list
__l, 190 size_type __n, 191 const allocator_type& __a) 192 : unordered_map(__l, __n, hasher(), key_equal(), __a) 193 { } 194 195 unordered_map(initializer_list
__l, 196 size_type __n, 197 const hasher& __hf, 198 const allocator_type& __a) 199 : unordered_map(__l, __n, __hf, key_equal(), __a) 200 { } 201 202 ~unordered_map() = default; 203 204 unordered_map& 205 operator=(const unordered_map&) = default; 206 207 unordered_map& 208 operator=(unordered_map&&) = default; 209 210 unordered_map& 211 operator=(initializer_list
__l) 212 { 213 _Base::operator=(__l); 214 this->_M_invalidate_all(); 215 return *this; 216 } 217 218 using _Base::get_allocator; 219 using _Base::empty; 220 using _Base::size; 221 using _Base::max_size; 222 223 void 224 swap(unordered_map& __x) 225 noexcept( noexcept(declval<_Base&>().swap(__x)) ) 226 { 227 _Safe::_M_swap(__x); 228 _Base::swap(__x); 229 } 230 231 void 232 clear() noexcept 233 { 234 _Base::clear(); 235 this->_M_invalidate_all(); 236 } 237 238 iterator 239 begin() noexcept 240 { return { _Base::begin(), this }; } 241 242 const_iterator 243 begin() const noexcept 244 { return { _Base::begin(), this }; } 245 246 iterator 247 end() noexcept 248 { return { _Base::end(), this }; } 249 250 const_iterator 251 end() const noexcept 252 { return { _Base::end(), this }; } 253 254 const_iterator 255 cbegin() const noexcept 256 { return { _Base::cbegin(), this }; } 257 258 const_iterator 259 cend() const noexcept 260 { return { _Base::cend(), this }; } 261 262 // local versions 263 local_iterator 264 begin(size_type __b) 265 { 266 __glibcxx_check_bucket_index(__b); 267 return { _Base::begin(__b), this }; 268 } 269 270 local_iterator 271 end(size_type __b) 272 { 273 __glibcxx_check_bucket_index(__b); 274 return { _Base::end(__b), this }; 275 } 276 277 const_local_iterator 278 begin(size_type __b) const 279 { 280 __glibcxx_check_bucket_index(__b); 281 return { _Base::begin(__b), this }; 282 } 283 284 const_local_iterator 285 end(size_type __b) const 286 { 287 __glibcxx_check_bucket_index(__b); 288 return { _Base::end(__b), this }; 289 } 290 291 const_local_iterator 292 cbegin(size_type __b) const 293 { 294 __glibcxx_check_bucket_index(__b); 295 return { _Base::cbegin(__b), this }; 296 } 297 298 const_local_iterator 299 cend(size_type __b) const 300 { 301 __glibcxx_check_bucket_index(__b); 302 return { _Base::cend(__b), this }; 303 } 304 305 using _Base::bucket_count; 306 using _Base::max_bucket_count; 307 using _Base::bucket; 308 309 size_type 310 bucket_size(size_type __b) const 311 { 312 __glibcxx_check_bucket_index(__b); 313 return _Base::bucket_size(__b); 314 } 315 316 using _Base::load_factor; 317 318 float 319 max_load_factor() const noexcept 320 { return _Base::max_load_factor(); } 321 322 void 323 max_load_factor(float __f) 324 { 325 __glibcxx_check_max_load_factor(__f); 326 _Base::max_load_factor(__f); 327 } 328 329 template
330 std::pair
331 emplace(_Args&&... __args) 332 { 333 size_type __bucket_count = this->bucket_count(); 334 auto __res = _Base::emplace(std::forward<_Args>(__args)...); 335 _M_check_rehashed(__bucket_count); 336 return { { __res.first, this }, __res.second }; 337 } 338 339 template
340 iterator 341 emplace_hint(const_iterator __hint, _Args&&... __args) 342 { 343 __glibcxx_check_insert(__hint); 344 size_type __bucket_count = this->bucket_count(); 345 auto __it = _Base::emplace_hint(__hint.base(), 346 std::forward<_Args>(__args)...); 347 _M_check_rehashed(__bucket_count); 348 return { __it, this }; 349 } 350 351 std::pair
352 insert(const value_type& __obj) 353 { 354 size_type __bucket_count = this->bucket_count(); 355 auto __res = _Base::insert(__obj); 356 _M_check_rehashed(__bucket_count); 357 return { { __res.first, this }, __res.second }; 358 } 359 360 // _GLIBCXX_RESOLVE_LIB_DEFECTS 361 // 2354. Unnecessary copying when inserting into maps with braced-init 362 std::pair
363 insert(value_type&& __x) 364 { 365 size_type __bucket_count = this->bucket_count(); 366 auto __res = _Base::insert(std::move(__x)); 367 _M_check_rehashed(__bucket_count); 368 return { { __res.first, this }, __res.second }; 369 } 370 371 template
::value>::type> 374 std::pair
375 insert(_Pair&& __obj) 376 { 377 size_type __bucket_count = this->bucket_count(); 378 auto __res = _Base::insert(std::forward<_Pair>(__obj)); 379 _M_check_rehashed(__bucket_count); 380 return { { __res.first, this }, __res.second }; 381 } 382 383 iterator 384 insert(const_iterator __hint, const value_type& __obj) 385 { 386 __glibcxx_check_insert(__hint); 387 size_type __bucket_count = this->bucket_count(); 388 auto __it = _Base::insert(__hint.base(), __obj); 389 _M_check_rehashed(__bucket_count); 390 return { __it, this }; 391 } 392 393 // _GLIBCXX_RESOLVE_LIB_DEFECTS 394 // 2354. Unnecessary copying when inserting into maps with braced-init 395 iterator 396 insert(const_iterator __hint, value_type&& __x) 397 { 398 __glibcxx_check_insert(__hint); 399 size_type __bucket_count = this->bucket_count(); 400 auto __it = _Base::insert(__hint.base(), std::move(__x)); 401 _M_check_rehashed(__bucket_count); 402 return { __it, this }; 403 } 404 405 template
::value>::type> 408 iterator 409 insert(const_iterator __hint, _Pair&& __obj) 410 { 411 __glibcxx_check_insert(__hint); 412 size_type __bucket_count = this->bucket_count(); 413 auto __it = _Base::insert(__hint.base(), std::forward<_Pair>(__obj)); 414 _M_check_rehashed(__bucket_count); 415 return { __it, this }; 416 } 417 418 void 419 insert(std::initializer_list
__l) 420 { 421 size_type __bucket_count = this->bucket_count(); 422 _Base::insert(__l); 423 _M_check_rehashed(__bucket_count); 424 } 425 426 template
427 void 428 insert(_InputIterator __first, _InputIterator __last) 429 { 430 typename __gnu_debug::_Distance_traits<_InputIterator>::__type __dist; 431 __glibcxx_check_valid_range2(__first, __last, __dist); 432 size_type __bucket_count = this->bucket_count(); 433 434 if (__dist.second >= __gnu_debug::__dp_sign) 435 _Base::insert(__gnu_debug::__unsafe(__first), 436 __gnu_debug::__unsafe(__last)); 437 else 438 _Base::insert(__first, __last); 439 440 _M_check_rehashed(__bucket_count); 441 } 442 443 #if __cplusplus > 201402L 444 template
445 pair
446 try_emplace(const key_type& __k, _Args&&... __args) 447 { 448 auto __res = _Base::try_emplace(__k, 449 std::forward<_Args>(__args)...); 450 return { { __res.first, this }, __res.second }; 451 } 452 453 template
454 pair
455 try_emplace(key_type&& __k, _Args&&... __args) 456 { 457 auto __res = _Base::try_emplace(std::move(__k), 458 std::forward<_Args>(__args)...); 459 return { { __res.first, this }, __res.second }; 460 } 461 462 template
463 iterator 464 try_emplace(const_iterator __hint, const key_type& __k, 465 _Args&&... __args) 466 { 467 __glibcxx_check_insert(__hint); 468 return { _Base::try_emplace(__hint.base(), __k, 469 std::forward<_Args>(__args)...), 470 this }; 471 } 472 473 template
474 iterator 475 try_emplace(const_iterator __hint, key_type&& __k, _Args&&... __args) 476 { 477 __glibcxx_check_insert(__hint); 478 return { _Base::try_emplace(__hint.base(), std::move(__k), 479 std::forward<_Args>(__args)...), 480 this }; 481 } 482 483 template
484 pair
485 insert_or_assign(const key_type& __k, _Obj&& __obj) 486 { 487 auto __res = _Base::insert_or_assign(__k, 488 std::forward<_Obj>(__obj)); 489 return { { __res.first, this }, __res.second }; 490 } 491 492 template
493 pair
494 insert_or_assign(key_type&& __k, _Obj&& __obj) 495 { 496 auto __res = _Base::insert_or_assign(std::move(__k), 497 std::forward<_Obj>(__obj)); 498 return { { __res.first, this }, __res.second }; 499 } 500 501 template
502 iterator 503 insert_or_assign(const_iterator __hint, const key_type& __k, 504 _Obj&& __obj) 505 { 506 __glibcxx_check_insert(__hint); 507 return { _Base::insert_or_assign(__hint.base(), __k, 508 std::forward<_Obj>(__obj)), 509 this }; 510 } 511 512 template
513 iterator 514 insert_or_assign(const_iterator __hint, key_type&& __k, _Obj&& __obj) 515 { 516 __glibcxx_check_insert(__hint); 517 return { _Base::insert_or_assign(__hint.base(), std::move(__k), 518 std::forward<_Obj>(__obj)), 519 this }; 520 } 521 #endif // C++17 522 523 #if __cplusplus > 201402L 524 using node_type = typename _Base::node_type; 525 using insert_return_type = _Node_insert_return
; 526 527 node_type 528 extract(const_iterator __position) 529 { 530 __glibcxx_check_erase(__position); 531 return _M_extract(__position.base()); 532 } 533 534 node_type 535 extract(const key_type& __key) 536 { 537 const auto __position = _Base::find(__key); 538 if (__position != _Base::end()) 539 return _M_extract(__position); 540 return {}; 541 } 542 543 insert_return_type 544 insert(node_type&& __nh) 545 { 546 auto __ret = _Base::insert(std::move(__nh)); 547 return 548 { { __ret.position, this }, __ret.inserted, std::move(__ret.node) }; 549 } 550 551 iterator 552 insert(const_iterator __hint, node_type&& __nh) 553 { 554 __glibcxx_check_insert(__hint); 555 return { _Base::insert(__hint.base(), std::move(__nh)), this }; 556 } 557 558 template
559 void 560 merge(unordered_map<_Key, _Tp, _H2, _P2, _Alloc>& __source) 561 { 562 auto __guard 563 = _Safe::_S_uc_guard(std::__detail::_Select1st{}, __source); 564 _Base::merge(__source); 565 } 566 567 template
568 void 569 merge(unordered_map<_Key, _Tp, _H2, _P2, _Alloc>&& __source) 570 { merge(__source); } 571 572 template
573 void 574 merge(unordered_multimap<_Key, _Tp, _H2, _P2, _Alloc>& __source) 575 { 576 auto __guard 577 = _Safe::_S_umc_guard(std::__detail::_Select1st{}, __source); 578 _Base::merge(__source); 579 } 580 581 template
582 void 583 merge(unordered_multimap<_Key, _Tp, _H2, _P2, _Alloc>&& __source) 584 { merge(__source); } 585 #endif // C++17 586 587 using _Base::hash_function; 588 using _Base::key_eq; 589 590 iterator 591 find(const key_type& __key) 592 { return { _Base::find(__key), this }; } 593 594 #if __cplusplus > 201703L 595 template
, 597 typename = std::__has_is_transparent_t<_Pred, _Kt>> 598 iterator 599 find(const _Kt& __k) 600 { return { _Base::find(__k), this }; } 601 #endif 602 603 const_iterator 604 find(const key_type& __key) const 605 { return { _Base::find(__key), this }; } 606 607 #if __cplusplus > 201703L 608 template
, 610 typename = std::__has_is_transparent_t<_Pred, _Kt>> 611 const_iterator 612 find(const _Kt& __k) const 613 { return { _Base::find(__k), this }; } 614 #endif 615 616 using _Base::count; 617 #if __cplusplus > 201703L 618 using _Base::contains; 619 #endif 620 621 std::pair
622 equal_range(const key_type& __key) 623 { 624 auto __res = _Base::equal_range(__key); 625 return { { __res.first, this }, { __res.second, this } }; 626 } 627 628 #if __cplusplus > 201703L 629 template
, 631 typename = std::__has_is_transparent_t<_Pred, _Kt>> 632 std::pair
633 equal_range(const _Kt& __k) 634 { 635 auto __res = _Base::equal_range(__k); 636 return { { __res.first, this }, { __res.second, this } }; 637 } 638 #endif 639 640 std::pair
641 equal_range(const key_type& __key) const 642 { 643 auto __res = _Base::equal_range(__key); 644 return { { __res.first, this }, { __res.second, this } }; 645 } 646 647 #if __cplusplus > 201703L 648 template
, 650 typename = std::__has_is_transparent_t<_Pred, _Kt>> 651 std::pair
652 equal_range(const _Kt& __k) const 653 { 654 auto __res = _Base::equal_range(__k); 655 return { { __res.first, this }, { __res.second, this } }; 656 } 657 #endif 658 659 using _Base::operator[]; 660 using _Base::at; 661 662 size_type 663 erase(const key_type& __key) 664 { 665 size_type __ret(0); 666 auto __victim = _Base::find(__key); 667 if (__victim != _Base::end()) 668 { 669 _M_erase(__victim); 670 __ret = 1; 671 } 672 return __ret; 673 } 674 675 iterator 676 erase(const_iterator __it) 677 { 678 __glibcxx_check_erase(__it); 679 return { _M_erase(__it.base()), this }; 680 } 681 682 _Base_iterator 683 erase(_Base_const_iterator __it) 684 { 685 __glibcxx_check_erase2(__it); 686 return _M_erase(__it); 687 } 688 689 iterator 690 erase(iterator __it) 691 { 692 __glibcxx_check_erase(__it); 693 return { _M_erase(__it.base()), this }; 694 } 695 696 iterator 697 erase(const_iterator __first, const_iterator __last) 698 { 699 __glibcxx_check_erase_range(__first, __last); 700 for (auto __tmp = __first.base(); __tmp != __last.base(); ++__tmp) 701 { 702 _GLIBCXX_DEBUG_VERIFY(__tmp != _Base::cend(), 703 _M_message(__gnu_debug::__msg_valid_range) 704 ._M_iterator(__first, "first") 705 ._M_iterator(__last, "last")); 706 _M_invalidate(__tmp); 707 } 708 709 size_type __bucket_count = this->bucket_count(); 710 auto __next = _Base::erase(__first.base(), __last.base()); 711 _M_check_rehashed(__bucket_count); 712 return { __next, this }; 713 } 714 715 using _Base::rehash; 716 using _Base::reserve; 717 718 _Base& 719 _M_base() noexcept { return *this; } 720 721 const _Base& 722 _M_base() const noexcept { return *this; } 723 724 private: 725 void 726 _M_check_rehashed(size_type __prev_count) 727 { 728 if (__prev_count != this->bucket_count()) 729 this->_M_invalidate_all(); 730 } 731 732 void 733 _M_invalidate(_Base_const_iterator __victim) 734 { 735 this->_M_invalidate_if( 736 [__victim](_Base_const_iterator __it) { return __it == __victim; }); 737 this->_M_invalidate_local_if( 738 [__victim](_Base_const_local_iterator __it) 739 { return __it == __victim; }); 740 } 741 742 _Base_iterator 743 _M_erase(_Base_const_iterator __victim) 744 { 745 _M_invalidate(__victim); 746 size_type __bucket_count = this->bucket_count(); 747 _Base_iterator __next = _Base::erase(__victim); 748 _M_check_rehashed(__bucket_count); 749 return __next; 750 } 751 752 #if __cplusplus > 201402L 753 node_type 754 _M_extract(_Base_const_iterator __victim) 755 { 756 _M_invalidate(__victim); 757 return _Base::extract(__victim); 758 } 759 #endif 760 }; 761 762 #if __cpp_deduction_guides >= 201606 763 764 template
>, 766 typename _Pred = equal_to<__iter_key_t<_InputIterator>>, 767 typename _Allocator = allocator<__iter_to_alloc_t<_InputIterator>>, 768 typename = _RequireInputIter<_InputIterator>, 769 typename = _RequireNotAllocatorOrIntegral<_Hash>, 770 typename = _RequireNotAllocator<_Pred>, 771 typename = _RequireAllocator<_Allocator>> 772 unordered_map(_InputIterator, _InputIterator, 773 typename unordered_map
::size_type = {}, 774 _Hash = _Hash(), _Pred = _Pred(), _Allocator = _Allocator()) 775 -> unordered_map<__iter_key_t<_InputIterator>, 776 __iter_val_t<_InputIterator>, 777 _Hash, _Pred, _Allocator>; 778 779 template
, 780 typename _Pred = equal_to<_Key>, 781 typename _Allocator = allocator
>, 782 typename = _RequireNotAllocatorOrIntegral<_Hash>, 783 typename = _RequireNotAllocator<_Pred>, 784 typename = _RequireAllocator<_Allocator>> 785 unordered_map(initializer_list
>, 786 typename unordered_map
::size_type = {}, 787 _Hash = _Hash(), _Pred = _Pred(), _Allocator = _Allocator()) 788 -> unordered_map<_Key, _Tp, _Hash, _Pred, _Allocator>; 789 790 template
, 792 typename = _RequireAllocator<_Allocator>> 793 unordered_map(_InputIterator, _InputIterator, 794 typename unordered_map
::size_type, _Allocator) 795 -> unordered_map<__iter_key_t<_InputIterator>, 796 __iter_val_t<_InputIterator>, 797 hash<__iter_key_t<_InputIterator>>, 798 equal_to<__iter_key_t<_InputIterator>>, 799 _Allocator>; 800 801 template
, 803 typename = _RequireAllocator<_Allocator>> 804 unordered_map(_InputIterator, _InputIterator, _Allocator) 805 -> unordered_map<__iter_key_t<_InputIterator>, 806 __iter_val_t<_InputIterator>, 807 hash<__iter_key_t<_InputIterator>>, 808 equal_to<__iter_key_t<_InputIterator>>, 809 _Allocator>; 810 811 template
, 813 typename = _RequireNotAllocatorOrIntegral<_Hash>, 814 typename = _RequireAllocator<_Allocator>> 815 unordered_map(_InputIterator, _InputIterator, 816 typename unordered_map
::size_type, 817 _Hash, _Allocator) 818 -> unordered_map<__iter_key_t<_InputIterator>, 819 __iter_val_t<_InputIterator>, _Hash, 820 equal_to<__iter_key_t<_InputIterator>>, _Allocator>; 821 822 template
> 824 unordered_map(initializer_list
>, 825 typename unordered_map
::size_type, 826 _Allocator) 827 -> unordered_map<_Key, _Tp, hash<_Key>, equal_to<_Key>, _Allocator>; 828 829 template
> 831 unordered_map(initializer_list
>, _Allocator) 832 -> unordered_map<_Key, _Tp, hash<_Key>, equal_to<_Key>, _Allocator>; 833 834 template
, 836 typename = _RequireAllocator<_Allocator>> 837 unordered_map(initializer_list
>, 838 typename unordered_map
::size_type, 839 _Hash, _Allocator) 840 -> unordered_map<_Key, _Tp, _Hash, equal_to<_Key>, _Allocator>; 841 842 #endif 843 844 template
846 inline void 847 swap(unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, 848 unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) 849 noexcept(noexcept(__x.swap(__y))) 850 { __x.swap(__y); } 851 852 template
854 inline bool 855 operator==(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, 856 const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) 857 { return __x._M_base() == __y._M_base(); } 858 859 #if __cpp_impl_three_way_comparison < 201907L 860 template
862 inline bool 863 operator!=(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, 864 const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) 865 { return !(__x == __y); } 866 #endif 867 868 /// Class std::unordered_multimap with safety/checking/debug instrumentation. 869 template
, 871 typename _Pred = std::equal_to<_Key>, 872 typename _Alloc = std::allocator
> > 873 class unordered_multimap 874 : public __gnu_debug::_Safe_container< 875 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>, _Alloc, 876 __gnu_debug::_Safe_unordered_container>, 877 public _GLIBCXX_STD_C::unordered_multimap< 878 _Key, _Tp, _Hash, _Pred, _Alloc> 879 { 880 typedef _GLIBCXX_STD_C::unordered_multimap<_Key, _Tp, _Hash, 881 _Pred, _Alloc> _Base; 882 typedef __gnu_debug::_Safe_container
_Safe; 884 typedef typename _Base::const_iterator _Base_const_iterator; 885 typedef typename _Base::iterator _Base_iterator; 886 typedef typename _Base::const_local_iterator _Base_const_local_iterator; 887 typedef typename _Base::local_iterator _Base_local_iterator; 888 889 template
890 friend class ::__gnu_debug::_Safe_iterator; 891 template
892 friend class ::__gnu_debug::_Safe_local_iterator; 893 894 // Reference wrapper for base class. See PR libstdc++/90102. 895 struct _Base_ref 896 { 897 _Base_ref(const _Base& __r) : _M_ref(__r) { } 898 899 const _Base& _M_ref; 900 }; 901 902 public: 903 typedef typename _Base::size_type size_type; 904 typedef typename _Base::hasher hasher; 905 typedef typename _Base::key_equal key_equal; 906 typedef typename _Base::allocator_type allocator_type; 907 908 typedef typename _Base::key_type key_type; 909 typedef typename _Base::value_type value_type; 910 typedef typename _Base::mapped_type mapped_type; 911 912 typedef typename _Base::pointer pointer; 913 typedef typename _Base::const_pointer const_pointer; 914 typedef typename _Base::reference reference; 915 typedef typename _Base::const_reference const_reference; 916 typedef __gnu_debug::_Safe_iterator< 917 _Base_iterator, unordered_multimap> iterator; 918 typedef __gnu_debug::_Safe_iterator< 919 _Base_const_iterator, unordered_multimap> const_iterator; 920 typedef __gnu_debug::_Safe_local_iterator< 921 _Base_local_iterator, unordered_multimap> local_iterator; 922 typedef __gnu_debug::_Safe_local_iterator< 923 _Base_const_local_iterator, unordered_multimap> const_local_iterator; 924 typedef typename _Base::difference_type difference_type; 925 926 unordered_multimap() = default; 927 928 explicit 929 unordered_multimap(size_type __n, 930 const hasher& __hf = hasher(), 931 const key_equal& __eql = key_equal(), 932 const allocator_type& __a = allocator_type()) 933 : _Base(__n, __hf, __eql, __a) { } 934 935 template
936 unordered_multimap(_InputIterator __first, _InputIterator __last, 937 size_type __n = 0, 938 const hasher& __hf = hasher(), 939 const key_equal& __eql = key_equal(), 940 const allocator_type& __a = allocator_type()) 941 : _Base(__gnu_debug::__base( 942 __glibcxx_check_valid_constructor_range(__first, __last)), 943 __gnu_debug::__base(__last), __n, 944 __hf, __eql, __a) { } 945 946 unordered_multimap(const unordered_multimap&) = default; 947 948 unordered_multimap(_Base_ref __x) 949 : _Base(__x._M_ref) { } 950 951 unordered_multimap(unordered_multimap&&) = default; 952 953 explicit 954 unordered_multimap(const allocator_type& __a) 955 : _Base(__a) { } 956 957 unordered_multimap(const unordered_multimap& __umap, 958 const allocator_type& __a) 959 : _Base(__umap, __a) { } 960 961 unordered_multimap(unordered_multimap&& __umap, 962 const allocator_type& __a) 963 noexcept( noexcept(_Base(std::move(__umap), __a)) ) 964 : _Safe(std::move(__umap), __a), 965 _Base(std::move(__umap), __a) { } 966 967 unordered_multimap(initializer_list
__l, 968 size_type __n = 0, 969 const hasher& __hf = hasher(), 970 const key_equal& __eql = key_equal(), 971 const allocator_type& __a = allocator_type()) 972 : _Base(__l, __n, __hf, __eql, __a) { } 973 974 unordered_multimap(size_type __n, const allocator_type& __a) 975 : unordered_multimap(__n, hasher(), key_equal(), __a) 976 { } 977 978 unordered_multimap(size_type __n, const hasher& __hf, 979 const allocator_type& __a) 980 : unordered_multimap(__n, __hf, key_equal(), __a) 981 { } 982 983 template
984 unordered_multimap(_InputIterator __first, _InputIterator __last, 985 size_type __n, 986 const allocator_type& __a) 987 : unordered_multimap(__first, __last, __n, hasher(), key_equal(), __a) 988 { } 989 990 template
991 unordered_multimap(_InputIterator __first, _InputIterator __last, 992 size_type __n, const hasher& __hf, 993 const allocator_type& __a) 994 : unordered_multimap(__first, __last, __n, __hf, key_equal(), __a) 995 { } 996 997 unordered_multimap(initializer_list
__l, 998 size_type __n, 999 const allocator_type& __a) 1000 : unordered_multimap(__l, __n, hasher(), key_equal(), __a) 1001 { } 1002 1003 unordered_multimap(initializer_list
__l, 1004 size_type __n, const hasher& __hf, 1005 const allocator_type& __a) 1006 : unordered_multimap(__l, __n, __hf, key_equal(), __a) 1007 { } 1008 1009 ~unordered_multimap() = default; 1010 1011 unordered_multimap& 1012 operator=(const unordered_multimap&) = default; 1013 1014 unordered_multimap& 1015 operator=(unordered_multimap&&) = default; 1016 1017 unordered_multimap& 1018 operator=(initializer_list
__l) 1019 { 1020 _Base::operator=(__l); 1021 this->_M_invalidate_all(); 1022 return *this; 1023 } 1024 1025 using _Base::get_allocator; 1026 using _Base::empty; 1027 using _Base::size; 1028 using _Base::max_size; 1029 1030 void 1031 swap(unordered_multimap& __x) 1032 noexcept( noexcept(declval<_Base&>().swap(__x)) ) 1033 { 1034 _Safe::_M_swap(__x); 1035 _Base::swap(__x); 1036 } 1037 1038 void 1039 clear() noexcept 1040 { 1041 _Base::clear(); 1042 this->_M_invalidate_all(); 1043 } 1044 1045 iterator 1046 begin() noexcept 1047 { return { _Base::begin(), this }; } 1048 1049 const_iterator 1050 begin() const noexcept 1051 { return { _Base::begin(), this }; } 1052 1053 iterator 1054 end() noexcept 1055 { return { _Base::end(), this }; } 1056 1057 const_iterator 1058 end() const noexcept 1059 { return { _Base::end(), this }; } 1060 1061 const_iterator 1062 cbegin() const noexcept 1063 { return { _Base::cbegin(), this }; } 1064 1065 const_iterator 1066 cend() const noexcept 1067 { return { _Base::cend(), this }; } 1068 1069 // local versions 1070 local_iterator 1071 begin(size_type __b) 1072 { 1073 __glibcxx_check_bucket_index(__b); 1074 return { _Base::begin(__b), this }; 1075 } 1076 1077 local_iterator 1078 end(size_type __b) 1079 { 1080 __glibcxx_check_bucket_index(__b); 1081 return { _Base::end(__b), this }; 1082 } 1083 1084 const_local_iterator 1085 begin(size_type __b) const 1086 { 1087 __glibcxx_check_bucket_index(__b); 1088 return { _Base::begin(__b), this }; 1089 } 1090 1091 const_local_iterator 1092 end(size_type __b) const 1093 { 1094 __glibcxx_check_bucket_index(__b); 1095 return { _Base::end(__b), this }; 1096 } 1097 1098 const_local_iterator 1099 cbegin(size_type __b) const 1100 { 1101 __glibcxx_check_bucket_index(__b); 1102 return { _Base::cbegin(__b), this }; 1103 } 1104 1105 const_local_iterator 1106 cend(size_type __b) const 1107 { 1108 __glibcxx_check_bucket_index(__b); 1109 return { _Base::cend(__b), this }; 1110 } 1111 1112 using _Base::bucket_count; 1113 using _Base::max_bucket_count; 1114 using _Base::bucket; 1115 1116 size_type 1117 bucket_size(size_type __b) const 1118 { 1119 __glibcxx_check_bucket_index(__b); 1120 return _Base::bucket_size(__b); 1121 } 1122 1123 float 1124 max_load_factor() const noexcept 1125 { return _Base::max_load_factor(); } 1126 1127 void 1128 max_load_factor(float __f) 1129 { 1130 __glibcxx_check_max_load_factor(__f); 1131 _Base::max_load_factor(__f); 1132 } 1133 1134 template
1135 iterator 1136 emplace(_Args&&... __args) 1137 { 1138 size_type __bucket_count = this->bucket_count(); 1139 auto __it = _Base::emplace(std::forward<_Args>(__args)...); 1140 _M_check_rehashed(__bucket_count); 1141 return { __it, this }; 1142 } 1143 1144 template
1145 iterator 1146 emplace_hint(const_iterator __hint, _Args&&... __args) 1147 { 1148 __glibcxx_check_insert(__hint); 1149 size_type __bucket_count = this->bucket_count(); 1150 auto __it = _Base::emplace_hint(__hint.base(), 1151 std::forward<_Args>(__args)...); 1152 _M_check_rehashed(__bucket_count); 1153 return { __it, this }; 1154 } 1155 1156 iterator 1157 insert(const value_type& __obj) 1158 { 1159 size_type __bucket_count = this->bucket_count(); 1160 auto __it = _Base::insert(__obj); 1161 _M_check_rehashed(__bucket_count); 1162 return { __it, this }; 1163 } 1164 1165 // _GLIBCXX_RESOLVE_LIB_DEFECTS 1166 // 2354. Unnecessary copying when inserting into maps with braced-init 1167 iterator 1168 insert(value_type&& __x) 1169 { 1170 size_type __bucket_count = this->bucket_count(); 1171 auto __it = _Base::insert(std::move(__x)); 1172 _M_check_rehashed(__bucket_count); 1173 return { __it, this }; 1174 } 1175 1176 iterator 1177 insert(const_iterator __hint, const value_type& __obj) 1178 { 1179 __glibcxx_check_insert(__hint); 1180 size_type __bucket_count = this->bucket_count(); 1181 auto __it = _Base::insert(__hint.base(), __obj); 1182 _M_check_rehashed(__bucket_count); 1183 return { __it, this }; 1184 } 1185 1186 // _GLIBCXX_RESOLVE_LIB_DEFECTS 1187 // 2354. Unnecessary copying when inserting into maps with braced-init 1188 iterator 1189 insert(const_iterator __hint, value_type&& __x) 1190 { 1191 __glibcxx_check_insert(__hint); 1192 size_type __bucket_count = this->bucket_count(); 1193 auto __it = _Base::insert(__hint.base(), std::move(__x)); 1194 _M_check_rehashed(__bucket_count); 1195 return { __it, this }; 1196 } 1197 1198 template
::value>::type> 1201 iterator 1202 insert(_Pair&& __obj) 1203 { 1204 size_type __bucket_count = this->bucket_count(); 1205 auto __it = _Base::insert(std::forward<_Pair>(__obj)); 1206 _M_check_rehashed(__bucket_count); 1207 return { __it, this }; 1208 } 1209 1210 template
::value>::type> 1213 iterator 1214 insert(const_iterator __hint, _Pair&& __obj) 1215 { 1216 __glibcxx_check_insert(__hint); 1217 size_type __bucket_count = this->bucket_count(); 1218 auto __it = _Base::insert(__hint.base(), std::forward<_Pair>(__obj)); 1219 _M_check_rehashed(__bucket_count); 1220 return { __it, this }; 1221 } 1222 1223 void 1224 insert(std::initializer_list
__l) 1225 { _Base::insert(__l); } 1226 1227 template
1228 void 1229 insert(_InputIterator __first, _InputIterator __last) 1230 { 1231 typename __gnu_debug::_Distance_traits<_InputIterator>::__type __dist; 1232 __glibcxx_check_valid_range2(__first, __last, __dist); 1233 size_type __bucket_count = this->bucket_count(); 1234 1235 if (__dist.second >= __gnu_debug::__dp_sign) 1236 _Base::insert(__gnu_debug::__unsafe(__first), 1237 __gnu_debug::__unsafe(__last)); 1238 else 1239 _Base::insert(__first, __last); 1240 1241 _M_check_rehashed(__bucket_count); 1242 } 1243 1244 #if __cplusplus > 201402L 1245 using node_type = typename _Base::node_type; 1246 1247 node_type 1248 extract(const_iterator __position) 1249 { 1250 __glibcxx_check_erase(__position); 1251 return _M_extract(__position.base()); 1252 } 1253 1254 node_type 1255 extract(const key_type& __key) 1256 { 1257 const auto __position = _Base::find(__key); 1258 if (__position != _Base::end()) 1259 return _M_extract(__position); 1260 return {}; 1261 } 1262 1263 iterator 1264 insert(node_type&& __nh) 1265 { return { _Base::insert(std::move(__nh)), this }; } 1266 1267 iterator 1268 insert(const_iterator __hint, node_type&& __nh) 1269 { 1270 __glibcxx_check_insert(__hint); 1271 return { _Base::insert(__hint.base(), std::move(__nh)), this }; 1272 } 1273 1274 template
1275 void 1276 merge(unordered_multimap<_Key, _Tp, _H2, _P2, _Alloc>& __source) 1277 { 1278 auto __guard 1279 = _Safe::_S_umc_guard(std::__detail::_Select1st{}, __source); 1280 _Base::merge(__source); 1281 } 1282 1283 template
1284 void 1285 merge(unordered_multimap<_Key, _Tp, _H2, _P2, _Alloc>&& __source) 1286 { merge(__source); } 1287 1288 template
1289 void 1290 merge(unordered_map<_Key, _Tp, _H2, _P2, _Alloc>& __source) 1291 { 1292 auto __guard 1293 = _Safe::_S_uc_guard(std::__detail::_Select1st{}, __source); 1294 _Base::merge(__source); 1295 } 1296 1297 template
1298 void 1299 merge(unordered_map<_Key, _Tp, _H2, _P2, _Alloc>&& __source) 1300 { merge(__source); } 1301 #endif // C++17 1302 1303 using _Base::hash_function; 1304 using _Base::key_eq; 1305 1306 iterator 1307 find(const key_type& __key) 1308 { return { _Base::find(__key), this }; } 1309 1310 #if __cplusplus > 201703L 1311 template
, 1313 typename = std::__has_is_transparent_t<_Pred, _Kt>> 1314 iterator 1315 find(const _Kt& __k) 1316 { return { _Base::find(__k), this }; } 1317 #endif 1318 1319 const_iterator 1320 find(const key_type& __key) const 1321 { return { _Base::find(__key), this }; } 1322 1323 #if __cplusplus > 201703L 1324 template
, 1326 typename = std::__has_is_transparent_t<_Pred, _Kt>> 1327 const_iterator 1328 find(const _Kt& __k) const 1329 { return { _Base::find(__k), this }; } 1330 #endif 1331 1332 using _Base::count; 1333 #if __cplusplus > 201703L 1334 using _Base::contains; 1335 #endif 1336 1337 std::pair
1338 equal_range(const key_type& __key) 1339 { 1340 auto __res = _Base::equal_range(__key); 1341 return { { __res.first, this }, { __res.second, this } }; 1342 } 1343 1344 #if __cplusplus > 201703L 1345 template
, 1347 typename = std::__has_is_transparent_t<_Pred, _Kt>> 1348 std::pair
1349 equal_range(const _Kt& __k) 1350 { 1351 auto __res = _Base::equal_range(__k); 1352 return { { __res.first, this }, { __res.second, this } }; 1353 } 1354 #endif 1355 1356 std::pair
1357 equal_range(const key_type& __key) const 1358 { 1359 auto __res = _Base::equal_range(__key); 1360 return { { __res.first, this }, { __res.second, this } }; 1361 } 1362 1363 #if __cplusplus > 201703L 1364 template
, 1366 typename = std::__has_is_transparent_t<_Pred, _Kt>> 1367 std::pair
1368 equal_range(const _Kt& __k) const 1369 { 1370 auto __res = _Base::equal_range(__k); 1371 return { { __res.first, this }, { __res.second, this } }; 1372 } 1373 #endif 1374 1375 size_type 1376 erase(const key_type& __key) 1377 { 1378 size_type __ret(0); 1379 size_type __bucket_count = this->bucket_count(); 1380 auto __pair = _Base::equal_range(__key); 1381 for (auto __victim = __pair.first; __victim != __pair.second;) 1382 { 1383 _M_invalidate(__victim); 1384 __victim = _Base::erase(__victim); 1385 ++__ret; 1386 } 1387 1388 _M_check_rehashed(__bucket_count); 1389 return __ret; 1390 } 1391 1392 iterator 1393 erase(const_iterator __it) 1394 { 1395 __glibcxx_check_erase(__it); 1396 return { _M_erase(__it.base()), this }; 1397 } 1398 1399 _Base_iterator 1400 erase(_Base_const_iterator __it) 1401 { 1402 __glibcxx_check_erase2(__it); 1403 return _M_erase(__it); 1404 } 1405 1406 iterator 1407 erase(iterator __it) 1408 { 1409 __glibcxx_check_erase(__it); 1410 return { _M_erase(__it.base()), this }; 1411 } 1412 1413 iterator 1414 erase(const_iterator __first, const_iterator __last) 1415 { 1416 __glibcxx_check_erase_range(__first, __last); 1417 for (auto __tmp = __first.base(); __tmp != __last.base(); ++__tmp) 1418 { 1419 _GLIBCXX_DEBUG_VERIFY(__tmp != _Base::cend(), 1420 _M_message(__gnu_debug::__msg_valid_range) 1421 ._M_iterator(__first, "first") 1422 ._M_iterator(__last, "last")); 1423 _M_invalidate(__tmp); 1424 } 1425 1426 size_type __bucket_count = this->bucket_count(); 1427 auto __next = _Base::erase(__first.base(), __last.base()); 1428 _M_check_rehashed(__bucket_count); 1429 return { __next, this }; 1430 } 1431 1432 using _Base::rehash; 1433 using _Base::reserve; 1434 1435 _Base& 1436 _M_base() noexcept { return *this; } 1437 1438 const _Base& 1439 _M_base() const noexcept { return *this; } 1440 1441 private: 1442 void 1443 _M_check_rehashed(size_type __prev_count) 1444 { 1445 if (__prev_count != this->bucket_count()) 1446 this->_M_invalidate_all(); 1447 } 1448 1449 void 1450 _M_invalidate(_Base_const_iterator __victim) 1451 { 1452 this->_M_invalidate_if( 1453 [__victim](_Base_const_iterator __it) { return __it == __victim; }); 1454 this->_M_invalidate_local_if( 1455 [__victim](_Base_const_local_iterator __it) 1456 { return __it == __victim; }); 1457 } 1458 1459 _Base_iterator 1460 _M_erase(_Base_const_iterator __victim) 1461 { 1462 _M_invalidate(__victim); 1463 size_type __bucket_count = this->bucket_count(); 1464 _Base_iterator __next = _Base::erase(__victim); 1465 _M_check_rehashed(__bucket_count); 1466 return __next; 1467 } 1468 1469 #if __cplusplus > 201402L 1470 node_type 1471 _M_extract(_Base_const_iterator __victim) 1472 { 1473 _M_invalidate(__victim); 1474 return _Base::extract(__victim); 1475 } 1476 #endif 1477 }; 1478 1479 #if __cpp_deduction_guides >= 201606 1480 1481 template
>, 1483 typename _Pred = equal_to<__iter_key_t<_InputIterator>>, 1484 typename _Allocator = allocator<__iter_to_alloc_t<_InputIterator>>, 1485 typename = _RequireInputIter<_InputIterator>, 1486 typename = _RequireNotAllocatorOrIntegral<_Hash>, 1487 typename = _RequireNotAllocator<_Pred>, 1488 typename = _RequireAllocator<_Allocator>> 1489 unordered_multimap(_InputIterator, _InputIterator, 1490 unordered_multimap
::size_type = {}, 1491 _Hash = _Hash(), _Pred = _Pred(), 1492 _Allocator = _Allocator()) 1493 -> unordered_multimap<__iter_key_t<_InputIterator>, 1494 __iter_val_t<_InputIterator>, _Hash, _Pred, 1495 _Allocator>; 1496 1497 template
, 1498 typename _Pred = equal_to<_Key>, 1499 typename _Allocator = allocator
>, 1500 typename = _RequireNotAllocatorOrIntegral<_Hash>, 1501 typename = _RequireNotAllocator<_Pred>, 1502 typename = _RequireAllocator<_Allocator>> 1503 unordered_multimap(initializer_list
>, 1504 unordered_multimap
::size_type = {}, 1505 _Hash = _Hash(), _Pred = _Pred(), 1506 _Allocator = _Allocator()) 1507 -> unordered_multimap<_Key, _Tp, _Hash, _Pred, _Allocator>; 1508 1509 template
, 1511 typename = _RequireAllocator<_Allocator>> 1512 unordered_multimap(_InputIterator, _InputIterator, 1513 unordered_multimap
::size_type, _Allocator) 1514 -> unordered_multimap<__iter_key_t<_InputIterator>, 1515 __iter_val_t<_InputIterator>, 1516 hash<__iter_key_t<_InputIterator>>, 1517 equal_to<__iter_key_t<_InputIterator>>, _Allocator>; 1518 1519 template
, 1521 typename = _RequireAllocator<_Allocator>> 1522 unordered_multimap(_InputIterator, _InputIterator, _Allocator) 1523 -> unordered_multimap<__iter_key_t<_InputIterator>, 1524 __iter_val_t<_InputIterator>, 1525 hash<__iter_key_t<_InputIterator>>, 1526 equal_to<__iter_key_t<_InputIterator>>, _Allocator>; 1527 1528 template
, 1530 typename = _RequireNotAllocatorOrIntegral<_Hash>, 1531 typename = _RequireAllocator<_Allocator>> 1532 unordered_multimap(_InputIterator, _InputIterator, 1533 unordered_multimap
::size_type, _Hash, 1534 _Allocator) 1535 -> unordered_multimap<__iter_key_t<_InputIterator>, 1536 __iter_val_t<_InputIterator>, _Hash, 1537 equal_to<__iter_key_t<_InputIterator>>, _Allocator>; 1538 1539 template
> 1541 unordered_multimap(initializer_list
>, 1542 unordered_multimap
::size_type, 1543 _Allocator) 1544 -> unordered_multimap<_Key, _Tp, hash<_Key>, equal_to<_Key>, _Allocator>; 1545 1546 template
> 1548 unordered_multimap(initializer_list
>, _Allocator) 1549 -> unordered_multimap<_Key, _Tp, hash<_Key>, equal_to<_Key>, _Allocator>; 1550 1551 template
, 1553 typename = _RequireAllocator<_Allocator>> 1554 unordered_multimap(initializer_list
>, 1555 unordered_multimap
::size_type, 1556 _Hash, _Allocator) 1557 -> unordered_multimap<_Key, _Tp, _Hash, equal_to<_Key>, _Allocator>; 1558 1559 #endif 1560 1561 template
1563 inline void 1564 swap(unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, 1565 unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) 1566 noexcept(noexcept(__x.swap(__y))) 1567 { __x.swap(__y); } 1568 1569 template
1571 inline bool 1572 operator==(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, 1573 const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) 1574 { return __x._M_base() == __y._M_base(); } 1575 1576 #if __cpp_impl_three_way_comparison < 201907L 1577 template
1579 inline bool 1580 operator!=(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, 1581 const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) 1582 { return !(__x == __y); } 1583 #endif 1584 1585 } // namespace __debug 1586 } // namespace std 1587 1588 #endif // C++11 1589 1590 #endif
Contact us
|
About us
|
Term of use
|
Copyright © 2000-2025 MyWebUniversity.com ™