1 // Set implementation -*- C++ -*- 2 3 // Copyright (C) 2001-2013 Free Software Foundation, Inc. 4 // 5 // This file is part of the GNU ISO C++ Library. This library is free 6 // software; you can redistribute it and/or modify it under the 7 // terms of the GNU General Public License as published by the 8 // Free Software Foundation; either version 3, or (at your option) 9 // any later version. 10 11 // This library is distributed in the hope that it will be useful, 12 // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 // GNU General Public License for more details. 15 16 // Under Section 7 of GPL version 3, you are granted additional 17 // permissions described in the GCC Runtime Library Exception, version 18 // 3.1, as published by the Free Software Foundation. 19 20 // You should have received a copy of the GNU General Public License and 21 // a copy of the GCC Runtime Library Exception along with this program; 22 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 23 // <http://www.gnu.org/licenses/>. 24 25 /* 26 * 27 * Copyright (c) 1994 28 * Hewlett-Packard Company 29 * 30 * Permission to use, copy, modify, distribute and sell this software 31 * and its documentation for any purpose is hereby granted without fee, 32 * provided that the above copyright notice appear in all copies and 33 * that both that copyright notice and this permission notice appear 34 * in supporting documentation. Hewlett-Packard Company makes no 35 * representations about the suitability of this software for any 36 * purpose. It is provided "as is" without express or implied warranty. 37 * 38 * 39 * Copyright (c) 1996,1997 40 * Silicon Graphics Computer Systems, Inc. 41 * 42 * Permission to use, copy, modify, distribute and sell this software 43 * and its documentation for any purpose is hereby granted without fee, 44 * provided that the above copyright notice appear in all copies and 45 * that both that copyright notice and this permission notice appear 46 * in supporting documentation. Silicon Graphics makes no 47 * representations about the suitability of this software for any 48 * purpose. It is provided "as is" without express or implied warranty. 49 */ 50 51 /** @file bits/stl_set.h 52 * This is an internal header file, included by other library headers. 53 * Do not attempt to use it directly. @headername{set} 54 */ 55 56 #ifndef _STL_SET_H 57 #define _STL_SET_H 1 58 59 #include <bits/concept_check.h> 60 #if __cplusplus >= 201103L 61 #include <initializer_list> 62 #endif 63 64 namespace std _GLIBCXX_VISIBILITY(default) 65 { 66 _GLIBCXX_BEGIN_NAMESPACE_CONTAINER 67 68 /** 69 * @brief A standard container made up of unique keys, which can be 70 * retrieved in logarithmic time. 71 * 72 * @ingroup associative_containers 73 * 74 * @tparam _Key Type of key objects. 75 * @tparam _Compare Comparison function object type, defaults to less<_Key>. 76 * @tparam _Alloc Allocator type, defaults to allocator<_Key>. 77 * 78 * Meets the requirements of a <a href="tables.html#65">container</a>, a 79 * <a href="tables.html#66">reversible container</a>, and an 80 * <a href="tables.html#69">associative container</a> (using unique keys). 81 * 82 * Sets support bidirectional iterators. 83 * 84 * The private tree data is declared exactly the same way for set and 85 * multiset; the distinction is made entirely in how the tree functions are 86 * called (*_unique versus *_equal, same as the standard). 87 */ 88 template<typename _Key, typename _Compare = std::less<_Key>, 89 typename _Alloc = std::allocator<_Key> > 90 class set 91 { 92 // concept requirements 93 typedef typename _Alloc::value_type _Alloc_value_type; 94 __glibcxx_class_requires(_Key, _SGIAssignableConcept) 95 __glibcxx_class_requires4(_Compare, bool, _Key, _Key, 96 _BinaryFunctionConcept) 97 __glibcxx_class_requires2(_Key, _Alloc_value_type, _SameTypeConcept) 98 99 public: 100 // typedefs: 101 //@{ 102 /// Public typedefs. 103 typedef _Key key_type; 104 typedef _Key value_type; 105 typedef _Compare key_compare; 106 typedef _Compare value_compare; 107 typedef _Alloc allocator_type; 108 //@} 109 110 private: 111 typedef typename _Alloc::template rebind<_Key>::other _Key_alloc_type; 112 113 typedef _Rb_tree<key_type, value_type, _Identity<value_type>, 114 key_compare, _Key_alloc_type> _Rep_type; 115 _Rep_type _M_t; // Red-black tree representing set. 116 117 public: 118 //@{ 119 /// Iterator-related typedefs. 120 typedef typename _Key_alloc_type::pointer pointer; 121 typedef typename _Key_alloc_type::const_pointer const_pointer; 122 typedef typename _Key_alloc_type::reference reference; 123 typedef typename _Key_alloc_type::const_reference const_reference; 124 // _GLIBCXX_RESOLVE_LIB_DEFECTS 125 // DR 103. set::iterator is required to be modifiable, 126 // but this allows modification of keys. 127 typedef typename _Rep_type::const_iterator iterator; 128 typedef typename _Rep_type::const_iterator const_iterator; 129 typedef typename _Rep_type::const_reverse_iterator reverse_iterator; 130 typedef typename _Rep_type::const_reverse_iterator const_reverse_iterator; 131 typedef typename _Rep_type::size_type size_type; 132 typedef typename _Rep_type::difference_type difference_type; 133 //@} 134 135 // allocation/deallocation 136 /** 137 * @brief Default constructor creates no elements. 138 */ 139 set() 140 : _M_t() { } 141 142 /** 143 * @brief Creates a %set with no elements. 144 * @param __comp Comparator to use. 145 * @param __a An allocator object. 146 */ 147 explicit 148 set(const _Compare& __comp, 149 const allocator_type& __a = allocator_type()) 150 : _M_t(__comp, _Key_alloc_type(__a)) { } 151 152 /** 153 * @brief Builds a %set from a range. 154 * @param __first An input iterator. 155 * @param __last An input iterator. 156 * 157 * Create a %set consisting of copies of the elements from 158 * [__first,__last). This is linear in N if the range is 159 * already sorted, and NlogN otherwise (where N is 160 * distance(__first,__last)). 161 */ 162 template<typename _InputIterator> 163 set(_InputIterator __first, _InputIterator __last) 164 : _M_t() 165 { _M_t._M_insert_unique(__first, __last); } 166 167 /** 168 * @brief Builds a %set from a range. 169 * @param __first An input iterator. 170 * @param __last An input iterator. 171 * @param __comp A comparison functor. 172 * @param __a An allocator object. 173 * 174 * Create a %set consisting of copies of the elements from 175 * [__first,__last). This is linear in N if the range is 176 * already sorted, and NlogN otherwise (where N is 177 * distance(__first,__last)). 178 */ 179 template<typename _InputIterator> 180 set(_InputIterator __first, _InputIterator __last, 181 const _Compare& __comp, 182 const allocator_type& __a = allocator_type()) 183 : _M_t(__comp, _Key_alloc_type(__a)) 184 { _M_t._M_insert_unique(__first, __last); } 185 186 /** 187 * @brief %Set copy constructor. 188 * @param __x A %set of identical element and allocator types. 189 * 190 * The newly-created %set uses a copy of the allocation object used 191 * by @a __x. 192 */ 193 set(const set& __x) 194 : _M_t(__x._M_t) { } 195 196 #if __cplusplus >= 201103L 197 /** 198 * @brief %Set move constructor 199 * @param __x A %set of identical element and allocator types. 200 * 201 * The newly-created %set contains the exact contents of @a x. 202 * The contents of @a x are a valid, but unspecified %set. 203 */ 204 set(set&& __x) 205 noexcept(is_nothrow_copy_constructible<_Compare>::value) 206 : _M_t(std::move(__x._M_t)) { } 207 208 /** 209 * @brief Builds a %set from an initializer_list. 210 * @param __l An initializer_list. 211 * @param __comp A comparison functor. 212 * @param __a An allocator object. 213 * 214 * Create a %set consisting of copies of the elements in the list. 215 * This is linear in N if the list is already sorted, and NlogN 216 * otherwise (where N is @a __l.size()). 217 */ 218 set(initializer_list<value_type> __l, 219 const _Compare& __comp = _Compare(), 220 const allocator_type& __a = allocator_type()) 221 : _M_t(__comp, _Key_alloc_type(__a)) 222 { _M_t._M_insert_unique(__l.begin(), __l.end()); } 223 #endif 224 225 /** 226 * @brief %Set assignment operator. 227 * @param __x A %set of identical element and allocator types. 228 * 229 * All the elements of @a __x are copied, but unlike the copy 230 * constructor, the allocator object is not copied. 231 */ 232 set& 233 operator=(const set& __x) 234 { 235 _M_t = __x._M_t; 236 return *this; 237 } 238 239 #if __cplusplus >= 201103L 240 /** 241 * @brief %Set move assignment operator. 242 * @param __x A %set of identical element and allocator types. 243 * 244 * The contents of @a __x are moved into this %set (without copying). 245 * @a __x is a valid, but unspecified %set. 246 */ 247 set& 248 operator=(set&& __x) 249 { 250 // NB: DR 1204. 251 // NB: DR 675. 252 this->clear(); 253 this->swap(__x); 254 return *this; 255 } 256 257 /** 258 * @brief %Set list assignment operator. 259 * @param __l An initializer_list. 260 * 261 * This function fills a %set with copies of the elements in the 262 * initializer list @a __l. 263 * 264 * Note that the assignment completely changes the %set and 265 * that the resulting %set's size is the same as the number 266 * of elements assigned. Old data may be lost. 267 */ 268 set& 269 operator=(initializer_list<value_type> __l) 270 { 271 this->clear(); 272 this->insert(__l.begin(), __l.end()); 273 return *this; 274 } 275 #endif 276 277 // accessors: 278 279 /// Returns the comparison object with which the %set was constructed. 280 key_compare 281 key_comp() const 282 { return _M_t.key_comp(); } 283 /// Returns the comparison object with which the %set was constructed. 284 value_compare 285 value_comp() const 286 { return _M_t.key_comp(); } 287 /// Returns the allocator object with which the %set was constructed. 288 allocator_type 289 get_allocator() const _GLIBCXX_NOEXCEPT 290 { return allocator_type(_M_t.get_allocator()); } 291 292 /** 293 * Returns a read-only (constant) iterator that points to the first 294 * element in the %set. Iteration is done in ascending order according 295 * to the keys. 296 */ 297 iterator 298 begin() const _GLIBCXX_NOEXCEPT 299 { return _M_t.begin(); } 300 301 /** 302 * Returns a read-only (constant) iterator that points one past the last 303 * element in the %set. Iteration is done in ascending order according 304 * to the keys. 305 */ 306 iterator 307 end() const _GLIBCXX_NOEXCEPT 308 { return _M_t.end(); } 309 310 /** 311 * Returns a read-only (constant) iterator that points to the last 312 * element in the %set. Iteration is done in descending order according 313 * to the keys. 314 */ 315 reverse_iterator 316 rbegin() const _GLIBCXX_NOEXCEPT 317 { return _M_t.rbegin(); } 318 319 /** 320 * Returns a read-only (constant) reverse iterator that points to the 321 * last pair in the %set. Iteration is done in descending order 322 * according to the keys. 323 */ 324 reverse_iterator 325 rend() const _GLIBCXX_NOEXCEPT 326 { return _M_t.rend(); } 327 328 #if __cplusplus >= 201103L 329 /** 330 * Returns a read-only (constant) iterator that points to the first 331 * element in the %set. Iteration is done in ascending order according 332 * to the keys. 333 */ 334 iterator 335 cbegin() const noexcept 336 { return _M_t.begin(); } 337 338 /** 339 * Returns a read-only (constant) iterator that points one past the last 340 * element in the %set. Iteration is done in ascending order according 341 * to the keys. 342 */ 343 iterator 344 cend() const noexcept 345 { return _M_t.end(); } 346 347 /** 348 * Returns a read-only (constant) iterator that points to the last 349 * element in the %set. Iteration is done in descending order according 350 * to the keys. 351 */ 352 reverse_iterator 353 crbegin() const noexcept 354 { return _M_t.rbegin(); } 355 356 /** 357 * Returns a read-only (constant) reverse iterator that points to the 358 * last pair in the %set. Iteration is done in descending order 359 * according to the keys. 360 */ 361 reverse_iterator 362 crend() const noexcept 363 { return _M_t.rend(); } 364 #endif 365 366 /// Returns true if the %set is empty. 367 bool 368 empty() const _GLIBCXX_NOEXCEPT 369 { return _M_t.empty(); } 370 371 /// Returns the size of the %set. 372 size_type 373 size() const _GLIBCXX_NOEXCEPT 374 { return _M_t.size(); } 375 376 /// Returns the maximum size of the %set. 377 size_type 378 max_size() const _GLIBCXX_NOEXCEPT 379 { return _M_t.max_size(); } 380 381 /** 382 * @brief Swaps data with another %set. 383 * @param __x A %set of the same element and allocator types. 384 * 385 * This exchanges the elements between two sets in constant 386 * time. (It is only swapping a pointer, an integer, and an 387 * instance of the @c Compare type (which itself is often 388 * stateless and empty), so it should be quite fast.) Note 389 * that the global std::swap() function is specialized such 390 * that std::swap(s1,s2) will feed to this function. 391 */ 392 void 393 swap(set& __x) 394 { _M_t.swap(__x._M_t); } 395 396 // insert/erase 397 #if __cplusplus >= 201103L 398 /** 399 * @brief Attempts to build and insert an element into the %set. 400 * @param __args Arguments used to generate an element. 401 * @return A pair, of which the first element is an iterator that points 402 * to the possibly inserted element, and the second is a bool 403 * that is true if the element was actually inserted. 404 * 405 * This function attempts to build and insert an element into the %set. 406 * A %set relies on unique keys and thus an element is only inserted if 407 * it is not already present in the %set. 408 * 409 * Insertion requires logarithmic time. 410 */ 411 template<typename... _Args> 412 std::pair<iterator, bool> 413 emplace(_Args&&... __args) 414 { return _M_t._M_emplace_unique(std::forward<_Args>(__args)...); } 415 416 /** 417 * @brief Attempts to insert an element into the %set. 418 * @param __pos An iterator that serves as a hint as to where the 419 * element should be inserted. 420 * @param __args Arguments used to generate the element to be 421 * inserted. 422 * @return An iterator that points to the element with key equivalent to 423 * the one generated from @a __args (may or may not be the 424 * element itself). 425 * 426 * This function is not concerned about whether the insertion took place, 427 * and thus does not return a boolean like the single-argument emplace() 428 * does. Note that the first parameter is only a hint and can 429 * potentially improve the performance of the insertion process. A bad 430 * hint would cause no gains in efficiency. 431 * 432 * For more on @a hinting, see: 433 * http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt07ch17.html 434 * 435 * Insertion requires logarithmic time (if the hint is not taken). 436 */ 437 template<typename... _Args> 438 iterator 439 emplace_hint(const_iterator __pos, _Args&&... __args) 440 { 441 return _M_t._M_emplace_hint_unique(__pos, 442 std::forward<_Args>(__args)...); 443 } 444 #endif 445 446 /** 447 * @brief Attempts to insert an element into the %set. 448 * @param __x Element to be inserted. 449 * @return A pair, of which the first element is an iterator that points 450 * to the possibly inserted element, and the second is a bool 451 * that is true if the element was actually inserted. 452 * 453 * This function attempts to insert an element into the %set. A %set 454 * relies on unique keys and thus an element is only inserted if it is 455 * not already present in the %set. 456 * 457 * Insertion requires logarithmic time. 458 */ 459 std::pair<iterator, bool> 460 insert(const value_type& __x) 461 { 462 std::pair<typename _Rep_type::iterator, bool> __p = 463 _M_t._M_insert_unique(__x); 464 return std::pair<iterator, bool>(__p.first, __p.second); 465 } 466 467 #if __cplusplus >= 201103L 468 std::pair<iterator, bool> 469 insert(value_type&& __x) 470 { 471 std::pair<typename _Rep_type::iterator, bool> __p = 472 _M_t._M_insert_unique(std::move(__x)); 473 return std::pair<iterator, bool>(__p.first, __p.second); 474 } 475 #endif 476 477 /** 478 * @brief Attempts to insert an element into the %set. 479 * @param __position An iterator that serves as a hint as to where the 480 * element should be inserted. 481 * @param __x Element to be inserted. 482 * @return An iterator that points to the element with key of 483 * @a __x (may or may not be the element passed in). 484 * 485 * This function is not concerned about whether the insertion took place, 486 * and thus does not return a boolean like the single-argument insert() 487 * does. Note that the first parameter is only a hint and can 488 * potentially improve the performance of the insertion process. A bad 489 * hint would cause no gains in efficiency. 490 * 491 * For more on @a hinting, see: 492 * http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt07ch17.html 493 * 494 * Insertion requires logarithmic time (if the hint is not taken). 495 */ 496 iterator 497 insert(const_iterator __position, const value_type& __x) 498 { return _M_t._M_insert_unique_(__position, __x); } 499 500 #if __cplusplus >= 201103L 501 iterator 502 insert(const_iterator __position, value_type&& __x) 503 { return _M_t._M_insert_unique_(__position, std::move(__x)); } 504 #endif 505 506 /** 507 * @brief A template function that attempts to insert a range 508 * of elements. 509 * @param __first Iterator pointing to the start of the range to be 510 * inserted. 511 * @param __last Iterator pointing to the end of the range. 512 * 513 * Complexity similar to that of the range constructor. 514 */ 515 template<typename _InputIterator> 516 void 517 insert(_InputIterator __first, _InputIterator __last) 518 { _M_t._M_insert_unique(__first, __last); } 519 520 #if __cplusplus >= 201103L 521 /** 522 * @brief Attempts to insert a list of elements into the %set. 523 * @param __l A std::initializer_list<value_type> of elements 524 * to be inserted. 525 * 526 * Complexity similar to that of the range constructor. 527 */ 528 void 529 insert(initializer_list<value_type> __l) 530 { this->insert(__l.begin(), __l.end()); } 531 #endif 532 533 #if __cplusplus >= 201103L 534 // _GLIBCXX_RESOLVE_LIB_DEFECTS 535 // DR 130. Associative erase should return an iterator. 536 /** 537 * @brief Erases an element from a %set. 538 * @param __position An iterator pointing to the element to be erased. 539 * @return An iterator pointing to the element immediately following 540 * @a __position prior to the element being erased. If no such 541 * element exists, end() is returned. 542 * 543 * This function erases an element, pointed to by the given iterator, 544 * from a %set. Note that this function only erases the element, and 545 * that if the element is itself a pointer, the pointed-to memory is not 546 * touched in any way. Managing the pointer is the user's 547 * responsibility. 548 */ 549 _GLIBCXX_ABI_TAG_CXX11 550 iterator 551 erase(const_iterator __position) 552 { return _M_t.erase(__position); } 553 #else 554 /** 555 * @brief Erases an element from a %set. 556 * @param position An iterator pointing to the element to be erased. 557 * 558 * This function erases an element, pointed to by the given iterator, 559 * from a %set. Note that this function only erases the element, and 560 * that if the element is itself a pointer, the pointed-to memory is not 561 * touched in any way. Managing the pointer is the user's 562 * responsibility. 563 */ 564 void 565 erase(iterator __position) 566 { _M_t.erase(__position); } 567 #endif 568 569 /** 570 * @brief Erases elements according to the provided key. 571 * @param __x Key of element to be erased. 572 * @return The number of elements erased. 573 * 574 * This function erases all the elements located by the given key from 575 * a %set. 576 * Note that this function only erases the element, and that if 577 * the element is itself a pointer, the pointed-to memory is not touched 578 * in any way. Managing the pointer is the user's responsibility. 579 */ 580 size_type 581 erase(const key_type& __x) 582 { return _M_t.erase(__x); } 583 584 #if __cplusplus >= 201103L 585 // _GLIBCXX_RESOLVE_LIB_DEFECTS 586 // DR 130. Associative erase should return an iterator. 587 /** 588 * @brief Erases a [__first,__last) range of elements from a %set. 589 * @param __first Iterator pointing to the start of the range to be 590 * erased. 591 592 * @param __last Iterator pointing to the end of the range to 593 * be erased. 594 * @return The iterator @a __last. 595 * 596 * This function erases a sequence of elements from a %set. 597 * Note that this function only erases the element, and that if 598 * the element is itself a pointer, the pointed-to memory is not touched 599 * in any way. Managing the pointer is the user's responsibility. 600 */ 601 _GLIBCXX_ABI_TAG_CXX11 602 iterator 603 erase(const_iterator __first, const_iterator __last) 604 { return _M_t.erase(__first, __last); } 605 #else 606 /** 607 * @brief Erases a [first,last) range of elements from a %set. 608 * @param __first Iterator pointing to the start of the range to be 609 * erased. 610 * @param __last Iterator pointing to the end of the range to 611 * be erased. 612 * 613 * This function erases a sequence of elements from a %set. 614 * Note that this function only erases the element, and that if 615 * the element is itself a pointer, the pointed-to memory is not touched 616 * in any way. Managing the pointer is the user's responsibility. 617 */ 618 void 619 erase(iterator __first, iterator __last) 620 { _M_t.erase(__first, __last); } 621 #endif 622 623 /** 624 * Erases all elements in a %set. Note that this function only erases 625 * the elements, and that if the elements themselves are pointers, the 626 * pointed-to memory is not touched in any way. Managing the pointer is 627 * the user's responsibility. 628 */ 629 void 630 clear() _GLIBCXX_NOEXCEPT 631 { _M_t.clear(); } 632 633 // set operations: 634 635 /** 636 * @brief Finds the number of elements. 637 * @param __x Element to located. 638 * @return Number of elements with specified key. 639 * 640 * This function only makes sense for multisets; for set the result will 641 * either be 0 (not present) or 1 (present). 642 */ 643 size_type 644 count(const key_type& __x) const 645 { return _M_t.find(__x) == _M_t.end() ? 0 : 1; } 646 647 // _GLIBCXX_RESOLVE_LIB_DEFECTS 648 // 214. set::find() missing const overload 649 //@{ 650 /** 651 * @brief Tries to locate an element in a %set. 652 * @param __x Element to be located. 653 * @return Iterator pointing to sought-after element, or end() if not 654 * found. 655 * 656 * This function takes a key and tries to locate the element with which 657 * the key matches. If successful the function returns an iterator 658 * pointing to the sought after element. If unsuccessful it returns the 659 * past-the-end ( @c end() ) iterator. 660 */ 661 iterator 662 find(const key_type& __x) 663 { return _M_t.find(__x); } 664 665 const_iterator 666 find(const key_type& __x) const 667 { return _M_t.find(__x); } 668 //@} 669 670 //@{ 671 /** 672 * @brief Finds the beginning of a subsequence matching given key. 673 * @param __x Key to be located. 674 * @return Iterator pointing to first element equal to or greater 675 * than key, or end(). 676 * 677 * This function returns the first element of a subsequence of elements 678 * that matches the given key. If unsuccessful it returns an iterator 679 * pointing to the first element that has a greater value than given key 680 * or end() if no such element exists. 681 */ 682 iterator 683 lower_bound(const key_type& __x) 684 { return _M_t.lower_bound(__x); } 685 686 const_iterator 687 lower_bound(const key_type& __x) const 688 { return _M_t.lower_bound(__x); } 689 //@} 690 691 //@{ 692 /** 693 * @brief Finds the end of a subsequence matching given key. 694 * @param __x Key to be located. 695 * @return Iterator pointing to the first element 696 * greater than key, or end(). 697 */ 698 iterator 699 upper_bound(const key_type& __x) 700 { return _M_t.upper_bound(__x); } 701 702 const_iterator 703 upper_bound(const key_type& __x) const 704 { return _M_t.upper_bound(__x); } 705 //@} 706 707 //@{ 708 /** 709 * @brief Finds a subsequence matching given key. 710 * @param __x Key to be located. 711 * @return Pair of iterators that possibly points to the subsequence 712 * matching given key. 713 * 714 * This function is equivalent to 715 * @code 716 * std::make_pair(c.lower_bound(val), 717 * c.upper_bound(val)) 718 * @endcode 719 * (but is faster than making the calls separately). 720 * 721 * This function probably only makes sense for multisets. 722 */ 723 std::pair<iterator, iterator> 724 equal_range(const key_type& __x) 725 { return _M_t.equal_range(__x); } 726 727 std::pair<const_iterator, const_iterator> 728 equal_range(const key_type& __x) const 729 { return _M_t.equal_range(__x); } 730 //@} 731 732 template<typename _K1, typename _C1, typename _A1> 733 friend bool 734 operator==(const set<_K1, _C1, _A1>&, const set<_K1, _C1, _A1>&); 735 736 template<typename _K1, typename _C1, typename _A1> 737 friend bool 738 operator<(const set<_K1, _C1, _A1>&, const set<_K1, _C1, _A1>&); 739 }; 740 741 742 /** 743 * @brief Set equality comparison. 744 * @param __x A %set. 745 * @param __y A %set of the same type as @a x. 746 * @return True iff the size and elements of the sets are equal. 747 * 748 * This is an equivalence relation. It is linear in the size of the sets. 749 * Sets are considered equivalent if their sizes are equal, and if 750 * corresponding elements compare equal. 751 */ 752 template<typename _Key, typename _Compare, typename _Alloc> 753 inline bool 754 operator==(const set<_Key, _Compare, _Alloc>& __x, 755 const set<_Key, _Compare, _Alloc>& __y) 756 { return __x._M_t == __y._M_t; } 757 758 /** 759 * @brief Set ordering relation. 760 * @param __x A %set. 761 * @param __y A %set of the same type as @a x. 762 * @return True iff @a __x is lexicographically less than @a __y. 763 * 764 * This is a total ordering relation. It is linear in the size of the 765 * maps. The elements must be comparable with @c <. 766 * 767 * See std::lexicographical_compare() for how the determination is made. 768 */ 769 template<typename _Key, typename _Compare, typename _Alloc> 770 inline bool 771 operator<(const set<_Key, _Compare, _Alloc>& __x, 772 const set<_Key, _Compare, _Alloc>& __y) 773 { return __x._M_t < __y._M_t; } 774 775 /// Returns !(x == y). 776 template<typename _Key, typename _Compare, typename _Alloc> 777 inline bool 778 operator!=(const set<_Key, _Compare, _Alloc>& __x, 779 const set<_Key, _Compare, _Alloc>& __y) 780 { return !(__x == __y); } 781 782 /// Returns y < x. 783 template<typename _Key, typename _Compare, typename _Alloc> 784 inline bool 785 operator>(const set<_Key, _Compare, _Alloc>& __x, 786 const set<_Key, _Compare, _Alloc>& __y) 787 { return __y < __x; } 788 789 /// Returns !(y < x) 790 template<typename _Key, typename _Compare, typename _Alloc> 791 inline bool 792 operator<=(const set<_Key, _Compare, _Alloc>& __x, 793 const set<_Key, _Compare, _Alloc>& __y) 794 { return !(__y < __x); } 795 796 /// Returns !(x < y) 797 template<typename _Key, typename _Compare, typename _Alloc> 798 inline bool 799 operator>=(const set<_Key, _Compare, _Alloc>& __x, 800 const set<_Key, _Compare, _Alloc>& __y) 801 { return !(__x < __y); } 802 803 /// See std::set::swap(). 804 template<typename _Key, typename _Compare, typename _Alloc> 805 inline void 806 swap(set<_Key, _Compare, _Alloc>& __x, set<_Key, _Compare, _Alloc>& __y) 807 { __x.swap(__y); } 808 809 _GLIBCXX_END_NAMESPACE_CONTAINER 810 } //namespace std 811 #endif /* _STL_SET_H */ 812