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