The C and C++ Include Header Files
/usr/include/c++/11/bits/stl_algo.h
$ cat -n /usr/include/c++/11/bits/stl_algo.h 1 // Algorithm implementation -*- C++ -*- 2 3 // Copyright (C) 2001-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 /* 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 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_algo.h 52 * This is an internal header file, included by other library headers. 53 * Do not attempt to use it directly. @headername{algorithm} 54 */ 55 56 #ifndef _STL_ALGO_H 57 #define _STL_ALGO_H 1 58 59 #include
// for rand 60 #include
61 #include
62 #include
// for _Temporary_buffer 63 #include
64 65 #if __cplusplus >= 201103L 66 #include
67 #endif 68 69 // See concept_check.h for the __glibcxx_*_requires macros. 70 71 namespace std _GLIBCXX_VISIBILITY(default) 72 { 73 _GLIBCXX_BEGIN_NAMESPACE_VERSION 74 75 /// Swaps the median value of *__a, *__b and *__c under __comp to *__result 76 template
77 _GLIBCXX20_CONSTEXPR 78 void 79 __move_median_to_first(_Iterator __result,_Iterator __a, _Iterator __b, 80 _Iterator __c, _Compare __comp) 81 { 82 if (__comp(__a, __b)) 83 { 84 if (__comp(__b, __c)) 85 std::iter_swap(__result, __b); 86 else if (__comp(__a, __c)) 87 std::iter_swap(__result, __c); 88 else 89 std::iter_swap(__result, __a); 90 } 91 else if (__comp(__a, __c)) 92 std::iter_swap(__result, __a); 93 else if (__comp(__b, __c)) 94 std::iter_swap(__result, __c); 95 else 96 std::iter_swap(__result, __b); 97 } 98 99 /// Provided for stable_partition to use. 100 template
101 _GLIBCXX20_CONSTEXPR 102 inline _InputIterator 103 __find_if_not(_InputIterator __first, _InputIterator __last, 104 _Predicate __pred) 105 { 106 return std::__find_if(__first, __last, 107 __gnu_cxx::__ops::__negate(__pred), 108 std::__iterator_category(__first)); 109 } 110 111 /// Like find_if_not(), but uses and updates a count of the 112 /// remaining range length instead of comparing against an end 113 /// iterator. 114 template
115 _GLIBCXX20_CONSTEXPR 116 _InputIterator 117 __find_if_not_n(_InputIterator __first, _Distance& __len, _Predicate __pred) 118 { 119 for (; __len; --__len, (void) ++__first) 120 if (!__pred(__first)) 121 break; 122 return __first; 123 } 124 125 // set_difference 126 // set_intersection 127 // set_symmetric_difference 128 // set_union 129 // for_each 130 // find 131 // find_if 132 // find_first_of 133 // adjacent_find 134 // count 135 // count_if 136 // search 137 138 template
140 _GLIBCXX20_CONSTEXPR 141 _ForwardIterator1 142 __search(_ForwardIterator1 __first1, _ForwardIterator1 __last1, 143 _ForwardIterator2 __first2, _ForwardIterator2 __last2, 144 _BinaryPredicate __predicate) 145 { 146 // Test for empty ranges 147 if (__first1 == __last1 || __first2 == __last2) 148 return __first1; 149 150 // Test for a pattern of length 1. 151 _ForwardIterator2 __p1(__first2); 152 if (++__p1 == __last2) 153 return std::__find_if(__first1, __last1, 154 __gnu_cxx::__ops::__iter_comp_iter(__predicate, __first2)); 155 156 // General case. 157 _ForwardIterator1 __current = __first1; 158 159 for (;;) 160 { 161 __first1 = 162 std::__find_if(__first1, __last1, 163 __gnu_cxx::__ops::__iter_comp_iter(__predicate, __first2)); 164 165 if (__first1 == __last1) 166 return __last1; 167 168 _ForwardIterator2 __p = __p1; 169 __current = __first1; 170 if (++__current == __last1) 171 return __last1; 172 173 while (__predicate(__current, __p)) 174 { 175 if (++__p == __last2) 176 return __first1; 177 if (++__current == __last1) 178 return __last1; 179 } 180 ++__first1; 181 } 182 return __first1; 183 } 184 185 // search_n 186 187 /** 188 * This is an helper function for search_n overloaded for forward iterators. 189 */ 190 template
192 _GLIBCXX20_CONSTEXPR 193 _ForwardIterator 194 __search_n_aux(_ForwardIterator __first, _ForwardIterator __last, 195 _Integer __count, _UnaryPredicate __unary_pred, 196 std::forward_iterator_tag) 197 { 198 __first = std::__find_if(__first, __last, __unary_pred); 199 while (__first != __last) 200 { 201 typename iterator_traits<_ForwardIterator>::difference_type 202 __n = __count; 203 _ForwardIterator __i = __first; 204 ++__i; 205 while (__i != __last && __n != 1 && __unary_pred(__i)) 206 { 207 ++__i; 208 --__n; 209 } 210 if (__n == 1) 211 return __first; 212 if (__i == __last) 213 return __last; 214 __first = std::__find_if(++__i, __last, __unary_pred); 215 } 216 return __last; 217 } 218 219 /** 220 * This is an helper function for search_n overloaded for random access 221 * iterators. 222 */ 223 template
225 _GLIBCXX20_CONSTEXPR 226 _RandomAccessIter 227 __search_n_aux(_RandomAccessIter __first, _RandomAccessIter __last, 228 _Integer __count, _UnaryPredicate __unary_pred, 229 std::random_access_iterator_tag) 230 { 231 typedef typename std::iterator_traits<_RandomAccessIter>::difference_type 232 _DistanceType; 233 234 _DistanceType __tailSize = __last - __first; 235 _DistanceType __remainder = __count; 236 237 while (__remainder <= __tailSize) // the main loop... 238 { 239 __first += __remainder; 240 __tailSize -= __remainder; 241 // __first here is always pointing to one past the last element of 242 // next possible match. 243 _RandomAccessIter __backTrack = __first; 244 while (__unary_pred(--__backTrack)) 245 { 246 if (--__remainder == 0) 247 return (__first - __count); // Success 248 } 249 __remainder = __count + 1 - (__first - __backTrack); 250 } 251 return __last; // Failure 252 } 253 254 template
256 _GLIBCXX20_CONSTEXPR 257 _ForwardIterator 258 __search_n(_ForwardIterator __first, _ForwardIterator __last, 259 _Integer __count, 260 _UnaryPredicate __unary_pred) 261 { 262 if (__count <= 0) 263 return __first; 264 265 if (__count == 1) 266 return std::__find_if(__first, __last, __unary_pred); 267 268 return std::__search_n_aux(__first, __last, __count, __unary_pred, 269 std::__iterator_category(__first)); 270 } 271 272 // find_end for forward iterators. 273 template
275 _GLIBCXX20_CONSTEXPR 276 _ForwardIterator1 277 __find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1, 278 _ForwardIterator2 __first2, _ForwardIterator2 __last2, 279 forward_iterator_tag, forward_iterator_tag, 280 _BinaryPredicate __comp) 281 { 282 if (__first2 == __last2) 283 return __last1; 284 285 _ForwardIterator1 __result = __last1; 286 while (1) 287 { 288 _ForwardIterator1 __new_result 289 = std::__search(__first1, __last1, __first2, __last2, __comp); 290 if (__new_result == __last1) 291 return __result; 292 else 293 { 294 __result = __new_result; 295 __first1 = __new_result; 296 ++__first1; 297 } 298 } 299 } 300 301 // find_end for bidirectional iterators (much faster). 302 template
304 _GLIBCXX20_CONSTEXPR 305 _BidirectionalIterator1 306 __find_end(_BidirectionalIterator1 __first1, 307 _BidirectionalIterator1 __last1, 308 _BidirectionalIterator2 __first2, 309 _BidirectionalIterator2 __last2, 310 bidirectional_iterator_tag, bidirectional_iterator_tag, 311 _BinaryPredicate __comp) 312 { 313 // concept requirements 314 __glibcxx_function_requires(_BidirectionalIteratorConcept< 315 _BidirectionalIterator1>) 316 __glibcxx_function_requires(_BidirectionalIteratorConcept< 317 _BidirectionalIterator2>) 318 319 typedef reverse_iterator<_BidirectionalIterator1> _RevIterator1; 320 typedef reverse_iterator<_BidirectionalIterator2> _RevIterator2; 321 322 _RevIterator1 __rlast1(__first1); 323 _RevIterator2 __rlast2(__first2); 324 _RevIterator1 __rresult = std::__search(_RevIterator1(__last1), __rlast1, 325 _RevIterator2(__last2), __rlast2, 326 __comp); 327 328 if (__rresult == __rlast1) 329 return __last1; 330 else 331 { 332 _BidirectionalIterator1 __result = __rresult.base(); 333 std::advance(__result, -std::distance(__first2, __last2)); 334 return __result; 335 } 336 } 337 338 /** 339 * @brief Find last matching subsequence in a sequence. 340 * @ingroup non_mutating_algorithms 341 * @param __first1 Start of range to search. 342 * @param __last1 End of range to search. 343 * @param __first2 Start of sequence to match. 344 * @param __last2 End of sequence to match. 345 * @return The last iterator @c i in the range 346 * @p [__first1,__last1-(__last2-__first2)) such that @c *(i+N) == 347 * @p *(__first2+N) for each @c N in the range @p 348 * [0,__last2-__first2), or @p __last1 if no such iterator exists. 349 * 350 * Searches the range @p [__first1,__last1) for a sub-sequence that 351 * compares equal value-by-value with the sequence given by @p 352 * [__first2,__last2) and returns an iterator to the __first 353 * element of the sub-sequence, or @p __last1 if the sub-sequence 354 * is not found. The sub-sequence will be the last such 355 * subsequence contained in [__first1,__last1). 356 * 357 * Because the sub-sequence must lie completely within the range @p 358 * [__first1,__last1) it must start at a position less than @p 359 * __last1-(__last2-__first2) where @p __last2-__first2 is the 360 * length of the sub-sequence. This means that the returned 361 * iterator @c i will be in the range @p 362 * [__first1,__last1-(__last2-__first2)) 363 */ 364 template
365 _GLIBCXX20_CONSTEXPR 366 inline _ForwardIterator1 367 find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1, 368 _ForwardIterator2 __first2, _ForwardIterator2 __last2) 369 { 370 // concept requirements 371 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>) 372 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>) 373 __glibcxx_function_requires(_EqualOpConcept< 374 typename iterator_traits<_ForwardIterator1>::value_type, 375 typename iterator_traits<_ForwardIterator2>::value_type>) 376 __glibcxx_requires_valid_range(__first1, __last1); 377 __glibcxx_requires_valid_range(__first2, __last2); 378 379 return std::__find_end(__first1, __last1, __first2, __last2, 380 std::__iterator_category(__first1), 381 std::__iterator_category(__first2), 382 __gnu_cxx::__ops::__iter_equal_to_iter()); 383 } 384 385 /** 386 * @brief Find last matching subsequence in a sequence using a predicate. 387 * @ingroup non_mutating_algorithms 388 * @param __first1 Start of range to search. 389 * @param __last1 End of range to search. 390 * @param __first2 Start of sequence to match. 391 * @param __last2 End of sequence to match. 392 * @param __comp The predicate to use. 393 * @return The last iterator @c i in the range @p 394 * [__first1,__last1-(__last2-__first2)) such that @c 395 * predicate(*(i+N), @p (__first2+N)) is true for each @c N in the 396 * range @p [0,__last2-__first2), or @p __last1 if no such iterator 397 * exists. 398 * 399 * Searches the range @p [__first1,__last1) for a sub-sequence that 400 * compares equal value-by-value with the sequence given by @p 401 * [__first2,__last2) using comp as a predicate and returns an 402 * iterator to the first element of the sub-sequence, or @p __last1 403 * if the sub-sequence is not found. The sub-sequence will be the 404 * last such subsequence contained in [__first,__last1). 405 * 406 * Because the sub-sequence must lie completely within the range @p 407 * [__first1,__last1) it must start at a position less than @p 408 * __last1-(__last2-__first2) where @p __last2-__first2 is the 409 * length of the sub-sequence. This means that the returned 410 * iterator @c i will be in the range @p 411 * [__first1,__last1-(__last2-__first2)) 412 */ 413 template
415 _GLIBCXX20_CONSTEXPR 416 inline _ForwardIterator1 417 find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1, 418 _ForwardIterator2 __first2, _ForwardIterator2 __last2, 419 _BinaryPredicate __comp) 420 { 421 // concept requirements 422 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>) 423 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>) 424 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate, 425 typename iterator_traits<_ForwardIterator1>::value_type, 426 typename iterator_traits<_ForwardIterator2>::value_type>) 427 __glibcxx_requires_valid_range(__first1, __last1); 428 __glibcxx_requires_valid_range(__first2, __last2); 429 430 return std::__find_end(__first1, __last1, __first2, __last2, 431 std::__iterator_category(__first1), 432 std::__iterator_category(__first2), 433 __gnu_cxx::__ops::__iter_comp_iter(__comp)); 434 } 435 436 #if __cplusplus >= 201103L 437 /** 438 * @brief Checks that a predicate is true for all the elements 439 * of a sequence. 440 * @ingroup non_mutating_algorithms 441 * @param __first An input iterator. 442 * @param __last An input iterator. 443 * @param __pred A predicate. 444 * @return True if the check is true, false otherwise. 445 * 446 * Returns true if @p __pred is true for each element in the range 447 * @p [__first,__last), and false otherwise. 448 */ 449 template
450 _GLIBCXX20_CONSTEXPR 451 inline bool 452 all_of(_InputIterator __first, _InputIterator __last, _Predicate __pred) 453 { return __last == std::find_if_not(__first, __last, __pred); } 454 455 /** 456 * @brief Checks that a predicate is false for all the elements 457 * of a sequence. 458 * @ingroup non_mutating_algorithms 459 * @param __first An input iterator. 460 * @param __last An input iterator. 461 * @param __pred A predicate. 462 * @return True if the check is true, false otherwise. 463 * 464 * Returns true if @p __pred is false for each element in the range 465 * @p [__first,__last), and false otherwise. 466 */ 467 template
468 _GLIBCXX20_CONSTEXPR 469 inline bool 470 none_of(_InputIterator __first, _InputIterator __last, _Predicate __pred) 471 { return __last == _GLIBCXX_STD_A::find_if(__first, __last, __pred); } 472 473 /** 474 * @brief Checks that a predicate is true for at least one element 475 * of a sequence. 476 * @ingroup non_mutating_algorithms 477 * @param __first An input iterator. 478 * @param __last An input iterator. 479 * @param __pred A predicate. 480 * @return True if the check is true, false otherwise. 481 * 482 * Returns true if an element exists in the range @p 483 * [__first,__last) such that @p __pred is true, and false 484 * otherwise. 485 */ 486 template
487 _GLIBCXX20_CONSTEXPR 488 inline bool 489 any_of(_InputIterator __first, _InputIterator __last, _Predicate __pred) 490 { return !std::none_of(__first, __last, __pred); } 491 492 /** 493 * @brief Find the first element in a sequence for which a 494 * predicate is false. 495 * @ingroup non_mutating_algorithms 496 * @param __first An input iterator. 497 * @param __last An input iterator. 498 * @param __pred A predicate. 499 * @return The first iterator @c i in the range @p [__first,__last) 500 * such that @p __pred(*i) is false, or @p __last if no such iterator exists. 501 */ 502 template
503 _GLIBCXX20_CONSTEXPR 504 inline _InputIterator 505 find_if_not(_InputIterator __first, _InputIterator __last, 506 _Predicate __pred) 507 { 508 // concept requirements 509 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>) 510 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate, 511 typename iterator_traits<_InputIterator>::value_type>) 512 __glibcxx_requires_valid_range(__first, __last); 513 return std::__find_if_not(__first, __last, 514 __gnu_cxx::__ops::__pred_iter(__pred)); 515 } 516 517 /** 518 * @brief Checks whether the sequence is partitioned. 519 * @ingroup mutating_algorithms 520 * @param __first An input iterator. 521 * @param __last An input iterator. 522 * @param __pred A predicate. 523 * @return True if the range @p [__first,__last) is partioned by @p __pred, 524 * i.e. if all elements that satisfy @p __pred appear before those that 525 * do not. 526 */ 527 template
528 _GLIBCXX20_CONSTEXPR 529 inline bool 530 is_partitioned(_InputIterator __first, _InputIterator __last, 531 _Predicate __pred) 532 { 533 __first = std::find_if_not(__first, __last, __pred); 534 if (__first == __last) 535 return true; 536 ++__first; 537 return std::none_of(__first, __last, __pred); 538 } 539 540 /** 541 * @brief Find the partition point of a partitioned range. 542 * @ingroup mutating_algorithms 543 * @param __first An iterator. 544 * @param __last Another iterator. 545 * @param __pred A predicate. 546 * @return An iterator @p mid such that @p all_of(__first, mid, __pred) 547 * and @p none_of(mid, __last, __pred) are both true. 548 */ 549 template
550 _GLIBCXX20_CONSTEXPR 551 _ForwardIterator 552 partition_point(_ForwardIterator __first, _ForwardIterator __last, 553 _Predicate __pred) 554 { 555 // concept requirements 556 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>) 557 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate, 558 typename iterator_traits<_ForwardIterator>::value_type>) 559 560 // A specific debug-mode test will be necessary... 561 __glibcxx_requires_valid_range(__first, __last); 562 563 typedef typename iterator_traits<_ForwardIterator>::difference_type 564 _DistanceType; 565 566 _DistanceType __len = std::distance(__first, __last); 567 568 while (__len > 0) 569 { 570 _DistanceType __half = __len >> 1; 571 _ForwardIterator __middle = __first; 572 std::advance(__middle, __half); 573 if (__pred(*__middle)) 574 { 575 __first = __middle; 576 ++__first; 577 __len = __len - __half - 1; 578 } 579 else 580 __len = __half; 581 } 582 return __first; 583 } 584 #endif 585 586 template
588 _GLIBCXX20_CONSTEXPR 589 _OutputIterator 590 __remove_copy_if(_InputIterator __first, _InputIterator __last, 591 _OutputIterator __result, _Predicate __pred) 592 { 593 for (; __first != __last; ++__first) 594 if (!__pred(__first)) 595 { 596 *__result = *__first; 597 ++__result; 598 } 599 return __result; 600 } 601 602 /** 603 * @brief Copy a sequence, removing elements of a given value. 604 * @ingroup mutating_algorithms 605 * @param __first An input iterator. 606 * @param __last An input iterator. 607 * @param __result An output iterator. 608 * @param __value The value to be removed. 609 * @return An iterator designating the end of the resulting sequence. 610 * 611 * Copies each element in the range @p [__first,__last) not equal 612 * to @p __value to the range beginning at @p __result. 613 * remove_copy() is stable, so the relative order of elements that 614 * are copied is unchanged. 615 */ 616 template
617 _GLIBCXX20_CONSTEXPR 618 inline _OutputIterator 619 remove_copy(_InputIterator __first, _InputIterator __last, 620 _OutputIterator __result, const _Tp& __value) 621 { 622 // concept requirements 623 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>) 624 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator, 625 typename iterator_traits<_InputIterator>::value_type>) 626 __glibcxx_function_requires(_EqualOpConcept< 627 typename iterator_traits<_InputIterator>::value_type, _Tp>) 628 __glibcxx_requires_valid_range(__first, __last); 629 630 return std::__remove_copy_if(__first, __last, __result, 631 __gnu_cxx::__ops::__iter_equals_val(__value)); 632 } 633 634 /** 635 * @brief Copy a sequence, removing elements for which a predicate is true. 636 * @ingroup mutating_algorithms 637 * @param __first An input iterator. 638 * @param __last An input iterator. 639 * @param __result An output iterator. 640 * @param __pred A predicate. 641 * @return An iterator designating the end of the resulting sequence. 642 * 643 * Copies each element in the range @p [__first,__last) for which 644 * @p __pred returns false to the range beginning at @p __result. 645 * 646 * remove_copy_if() is stable, so the relative order of elements that are 647 * copied is unchanged. 648 */ 649 template
651 _GLIBCXX20_CONSTEXPR 652 inline _OutputIterator 653 remove_copy_if(_InputIterator __first, _InputIterator __last, 654 _OutputIterator __result, _Predicate __pred) 655 { 656 // concept requirements 657 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>) 658 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator, 659 typename iterator_traits<_InputIterator>::value_type>) 660 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate, 661 typename iterator_traits<_InputIterator>::value_type>) 662 __glibcxx_requires_valid_range(__first, __last); 663 664 return std::__remove_copy_if(__first, __last, __result, 665 __gnu_cxx::__ops::__pred_iter(__pred)); 666 } 667 668 #if __cplusplus >= 201103L 669 /** 670 * @brief Copy the elements of a sequence for which a predicate is true. 671 * @ingroup mutating_algorithms 672 * @param __first An input iterator. 673 * @param __last An input iterator. 674 * @param __result An output iterator. 675 * @param __pred A predicate. 676 * @return An iterator designating the end of the resulting sequence. 677 * 678 * Copies each element in the range @p [__first,__last) for which 679 * @p __pred returns true to the range beginning at @p __result. 680 * 681 * copy_if() is stable, so the relative order of elements that are 682 * copied is unchanged. 683 */ 684 template
686 _GLIBCXX20_CONSTEXPR 687 _OutputIterator 688 copy_if(_InputIterator __first, _InputIterator __last, 689 _OutputIterator __result, _Predicate __pred) 690 { 691 // concept requirements 692 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>) 693 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator, 694 typename iterator_traits<_InputIterator>::value_type>) 695 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate, 696 typename iterator_traits<_InputIterator>::value_type>) 697 __glibcxx_requires_valid_range(__first, __last); 698 699 for (; __first != __last; ++__first) 700 if (__pred(*__first)) 701 { 702 *__result = *__first; 703 ++__result; 704 } 705 return __result; 706 } 707 708 template
709 _GLIBCXX20_CONSTEXPR 710 _OutputIterator 711 __copy_n(_InputIterator __first, _Size __n, 712 _OutputIterator __result, input_iterator_tag) 713 { 714 return std::__niter_wrap(__result, 715 __copy_n_a(__first, __n, 716 std::__niter_base(__result), true)); 717 } 718 719 template
721 _GLIBCXX20_CONSTEXPR 722 inline _OutputIterator 723 __copy_n(_RandomAccessIterator __first, _Size __n, 724 _OutputIterator __result, random_access_iterator_tag) 725 { return std::copy(__first, __first + __n, __result); } 726 727 /** 728 * @brief Copies the range [first,first+n) into [result,result+n). 729 * @ingroup mutating_algorithms 730 * @param __first An input iterator. 731 * @param __n The number of elements to copy. 732 * @param __result An output iterator. 733 * @return result+n. 734 * 735 * This inline function will boil down to a call to @c memmove whenever 736 * possible. Failing that, if random access iterators are passed, then the 737 * loop count will be known (and therefore a candidate for compiler 738 * optimizations such as unrolling). 739 */ 740 template
741 _GLIBCXX20_CONSTEXPR 742 inline _OutputIterator 743 copy_n(_InputIterator __first, _Size __n, _OutputIterator __result) 744 { 745 // concept requirements 746 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>) 747 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator, 748 typename iterator_traits<_InputIterator>::value_type>) 749 750 const auto __n2 = std::__size_to_integer(__n); 751 if (__n2 <= 0) 752 return __result; 753 754 __glibcxx_requires_can_increment(__first, __n2); 755 __glibcxx_requires_can_increment(__result, __n2); 756 757 return std::__copy_n(__first, __n2, __result, 758 std::__iterator_category(__first)); 759 } 760 761 /** 762 * @brief Copy the elements of a sequence to separate output sequences 763 * depending on the truth value of a predicate. 764 * @ingroup mutating_algorithms 765 * @param __first An input iterator. 766 * @param __last An input iterator. 767 * @param __out_true An output iterator. 768 * @param __out_false An output iterator. 769 * @param __pred A predicate. 770 * @return A pair designating the ends of the resulting sequences. 771 * 772 * Copies each element in the range @p [__first,__last) for which 773 * @p __pred returns true to the range beginning at @p out_true 774 * and each element for which @p __pred returns false to @p __out_false. 775 */ 776 template
778 _GLIBCXX20_CONSTEXPR 779 pair<_OutputIterator1, _OutputIterator2> 780 partition_copy(_InputIterator __first, _InputIterator __last, 781 _OutputIterator1 __out_true, _OutputIterator2 __out_false, 782 _Predicate __pred) 783 { 784 // concept requirements 785 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>) 786 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator1, 787 typename iterator_traits<_InputIterator>::value_type>) 788 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator2, 789 typename iterator_traits<_InputIterator>::value_type>) 790 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate, 791 typename iterator_traits<_InputIterator>::value_type>) 792 __glibcxx_requires_valid_range(__first, __last); 793 794 for (; __first != __last; ++__first) 795 if (__pred(*__first)) 796 { 797 *__out_true = *__first; 798 ++__out_true; 799 } 800 else 801 { 802 *__out_false = *__first; 803 ++__out_false; 804 } 805 806 return pair<_OutputIterator1, _OutputIterator2>(__out_true, __out_false); 807 } 808 #endif // C++11 809 810 template
811 _GLIBCXX20_CONSTEXPR 812 _ForwardIterator 813 __remove_if(_ForwardIterator __first, _ForwardIterator __last, 814 _Predicate __pred) 815 { 816 __first = std::__find_if(__first, __last, __pred); 817 if (__first == __last) 818 return __first; 819 _ForwardIterator __result = __first; 820 ++__first; 821 for (; __first != __last; ++__first) 822 if (!__pred(__first)) 823 { 824 *__result = _GLIBCXX_MOVE(*__first); 825 ++__result; 826 } 827 return __result; 828 } 829 830 /** 831 * @brief Remove elements from a sequence. 832 * @ingroup mutating_algorithms 833 * @param __first An input iterator. 834 * @param __last An input iterator. 835 * @param __value The value to be removed. 836 * @return An iterator designating the end of the resulting sequence. 837 * 838 * All elements equal to @p __value are removed from the range 839 * @p [__first,__last). 840 * 841 * remove() is stable, so the relative order of elements that are 842 * not removed is unchanged. 843 * 844 * Elements between the end of the resulting sequence and @p __last 845 * are still present, but their value is unspecified. 846 */ 847 template
848 _GLIBCXX20_CONSTEXPR 849 inline _ForwardIterator 850 remove(_ForwardIterator __first, _ForwardIterator __last, 851 const _Tp& __value) 852 { 853 // concept requirements 854 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept< 855 _ForwardIterator>) 856 __glibcxx_function_requires(_EqualOpConcept< 857 typename iterator_traits<_ForwardIterator>::value_type, _Tp>) 858 __glibcxx_requires_valid_range(__first, __last); 859 860 return std::__remove_if(__first, __last, 861 __gnu_cxx::__ops::__iter_equals_val(__value)); 862 } 863 864 /** 865 * @brief Remove elements from a sequence using a predicate. 866 * @ingroup mutating_algorithms 867 * @param __first A forward iterator. 868 * @param __last A forward iterator. 869 * @param __pred A predicate. 870 * @return An iterator designating the end of the resulting sequence. 871 * 872 * All elements for which @p __pred returns true are removed from the range 873 * @p [__first,__last). 874 * 875 * remove_if() is stable, so the relative order of elements that are 876 * not removed is unchanged. 877 * 878 * Elements between the end of the resulting sequence and @p __last 879 * are still present, but their value is unspecified. 880 */ 881 template
882 _GLIBCXX20_CONSTEXPR 883 inline _ForwardIterator 884 remove_if(_ForwardIterator __first, _ForwardIterator __last, 885 _Predicate __pred) 886 { 887 // concept requirements 888 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept< 889 _ForwardIterator>) 890 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate, 891 typename iterator_traits<_ForwardIterator>::value_type>) 892 __glibcxx_requires_valid_range(__first, __last); 893 894 return std::__remove_if(__first, __last, 895 __gnu_cxx::__ops::__pred_iter(__pred)); 896 } 897 898 template
899 _GLIBCXX20_CONSTEXPR 900 _ForwardIterator 901 __adjacent_find(_ForwardIterator __first, _ForwardIterator __last, 902 _BinaryPredicate __binary_pred) 903 { 904 if (__first == __last) 905 return __last; 906 _ForwardIterator __next = __first; 907 while (++__next != __last) 908 { 909 if (__binary_pred(__first, __next)) 910 return __first; 911 __first = __next; 912 } 913 return __last; 914 } 915 916 template
917 _GLIBCXX20_CONSTEXPR 918 _ForwardIterator 919 __unique(_ForwardIterator __first, _ForwardIterator __last, 920 _BinaryPredicate __binary_pred) 921 { 922 // Skip the beginning, if already unique. 923 __first = std::__adjacent_find(__first, __last, __binary_pred); 924 if (__first == __last) 925 return __last; 926 927 // Do the real copy work. 928 _ForwardIterator __dest = __first; 929 ++__first; 930 while (++__first != __last) 931 if (!__binary_pred(__dest, __first)) 932 *++__dest = _GLIBCXX_MOVE(*__first); 933 return ++__dest; 934 } 935 936 /** 937 * @brief Remove consecutive duplicate values from a sequence. 938 * @ingroup mutating_algorithms 939 * @param __first A forward iterator. 940 * @param __last A forward iterator. 941 * @return An iterator designating the end of the resulting sequence. 942 * 943 * Removes all but the first element from each group of consecutive 944 * values that compare equal. 945 * unique() is stable, so the relative order of elements that are 946 * not removed is unchanged. 947 * Elements between the end of the resulting sequence and @p __last 948 * are still present, but their value is unspecified. 949 */ 950 template
951 _GLIBCXX20_CONSTEXPR 952 inline _ForwardIterator 953 unique(_ForwardIterator __first, _ForwardIterator __last) 954 { 955 // concept requirements 956 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept< 957 _ForwardIterator>) 958 __glibcxx_function_requires(_EqualityComparableConcept< 959 typename iterator_traits<_ForwardIterator>::value_type>) 960 __glibcxx_requires_valid_range(__first, __last); 961 962 return std::__unique(__first, __last, 963 __gnu_cxx::__ops::__iter_equal_to_iter()); 964 } 965 966 /** 967 * @brief Remove consecutive values from a sequence using a predicate. 968 * @ingroup mutating_algorithms 969 * @param __first A forward iterator. 970 * @param __last A forward iterator. 971 * @param __binary_pred A binary predicate. 972 * @return An iterator designating the end of the resulting sequence. 973 * 974 * Removes all but the first element from each group of consecutive 975 * values for which @p __binary_pred returns true. 976 * unique() is stable, so the relative order of elements that are 977 * not removed is unchanged. 978 * Elements between the end of the resulting sequence and @p __last 979 * are still present, but their value is unspecified. 980 */ 981 template
982 _GLIBCXX20_CONSTEXPR 983 inline _ForwardIterator 984 unique(_ForwardIterator __first, _ForwardIterator __last, 985 _BinaryPredicate __binary_pred) 986 { 987 // concept requirements 988 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept< 989 _ForwardIterator>) 990 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate, 991 typename iterator_traits<_ForwardIterator>::value_type, 992 typename iterator_traits<_ForwardIterator>::value_type>) 993 __glibcxx_requires_valid_range(__first, __last); 994 995 return std::__unique(__first, __last, 996 __gnu_cxx::__ops::__iter_comp_iter(__binary_pred)); 997 } 998 999 /** 1000 * This is an uglified 1001 * unique_copy(_InputIterator, _InputIterator, _OutputIterator, 1002 * _BinaryPredicate) 1003 * overloaded for forward iterators and output iterator as result. 1004 */ 1005 template
1007 _GLIBCXX20_CONSTEXPR 1008 _OutputIterator 1009 __unique_copy(_ForwardIterator __first, _ForwardIterator __last, 1010 _OutputIterator __result, _BinaryPredicate __binary_pred, 1011 forward_iterator_tag, output_iterator_tag) 1012 { 1013 // concept requirements -- iterators already checked 1014 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate, 1015 typename iterator_traits<_ForwardIterator>::value_type, 1016 typename iterator_traits<_ForwardIterator>::value_type>) 1017 1018 _ForwardIterator __next = __first; 1019 *__result = *__first; 1020 while (++__next != __last) 1021 if (!__binary_pred(__first, __next)) 1022 { 1023 __first = __next; 1024 *++__result = *__first; 1025 } 1026 return ++__result; 1027 } 1028 1029 /** 1030 * This is an uglified 1031 * unique_copy(_InputIterator, _InputIterator, _OutputIterator, 1032 * _BinaryPredicate) 1033 * overloaded for input iterators and output iterator as result. 1034 */ 1035 template
1037 _GLIBCXX20_CONSTEXPR 1038 _OutputIterator 1039 __unique_copy(_InputIterator __first, _InputIterator __last, 1040 _OutputIterator __result, _BinaryPredicate __binary_pred, 1041 input_iterator_tag, output_iterator_tag) 1042 { 1043 // concept requirements -- iterators already checked 1044 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate, 1045 typename iterator_traits<_InputIterator>::value_type, 1046 typename iterator_traits<_InputIterator>::value_type>) 1047 1048 typename iterator_traits<_InputIterator>::value_type __value = *__first; 1049 __decltype(__gnu_cxx::__ops::__iter_comp_val(__binary_pred)) 1050 __rebound_pred 1051 = __gnu_cxx::__ops::__iter_comp_val(__binary_pred); 1052 *__result = __value; 1053 while (++__first != __last) 1054 if (!__rebound_pred(__first, __value)) 1055 { 1056 __value = *__first; 1057 *++__result = __value; 1058 } 1059 return ++__result; 1060 } 1061 1062 /** 1063 * This is an uglified 1064 * unique_copy(_InputIterator, _InputIterator, _OutputIterator, 1065 * _BinaryPredicate) 1066 * overloaded for input iterators and forward iterator as result. 1067 */ 1068 template
1070 _GLIBCXX20_CONSTEXPR 1071 _ForwardIterator 1072 __unique_copy(_InputIterator __first, _InputIterator __last, 1073 _ForwardIterator __result, _BinaryPredicate __binary_pred, 1074 input_iterator_tag, forward_iterator_tag) 1075 { 1076 // concept requirements -- iterators already checked 1077 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate, 1078 typename iterator_traits<_ForwardIterator>::value_type, 1079 typename iterator_traits<_InputIterator>::value_type>) 1080 *__result = *__first; 1081 while (++__first != __last) 1082 if (!__binary_pred(__result, __first)) 1083 *++__result = *__first; 1084 return ++__result; 1085 } 1086 1087 /** 1088 * This is an uglified reverse(_BidirectionalIterator, 1089 * _BidirectionalIterator) 1090 * overloaded for bidirectional iterators. 1091 */ 1092 template
1093 _GLIBCXX20_CONSTEXPR 1094 void 1095 __reverse(_BidirectionalIterator __first, _BidirectionalIterator __last, 1096 bidirectional_iterator_tag) 1097 { 1098 while (true) 1099 if (__first == __last || __first == --__last) 1100 return; 1101 else 1102 { 1103 std::iter_swap(__first, __last); 1104 ++__first; 1105 } 1106 } 1107 1108 /** 1109 * This is an uglified reverse(_BidirectionalIterator, 1110 * _BidirectionalIterator) 1111 * overloaded for random access iterators. 1112 */ 1113 template
1114 _GLIBCXX20_CONSTEXPR 1115 void 1116 __reverse(_RandomAccessIterator __first, _RandomAccessIterator __last, 1117 random_access_iterator_tag) 1118 { 1119 if (__first == __last) 1120 return; 1121 --__last; 1122 while (__first < __last) 1123 { 1124 std::iter_swap(__first, __last); 1125 ++__first; 1126 --__last; 1127 } 1128 } 1129 1130 /** 1131 * @brief Reverse a sequence. 1132 * @ingroup mutating_algorithms 1133 * @param __first A bidirectional iterator. 1134 * @param __last A bidirectional iterator. 1135 * @return reverse() returns no value. 1136 * 1137 * Reverses the order of the elements in the range @p [__first,__last), 1138 * so that the first element becomes the last etc. 1139 * For every @c i such that @p 0<=i<=(__last-__first)/2), @p reverse() 1140 * swaps @p *(__first+i) and @p *(__last-(i+1)) 1141 */ 1142 template
1143 _GLIBCXX20_CONSTEXPR 1144 inline void 1145 reverse(_BidirectionalIterator __first, _BidirectionalIterator __last) 1146 { 1147 // concept requirements 1148 __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept< 1149 _BidirectionalIterator>) 1150 __glibcxx_requires_valid_range(__first, __last); 1151 std::__reverse(__first, __last, std::__iterator_category(__first)); 1152 } 1153 1154 /** 1155 * @brief Copy a sequence, reversing its elements. 1156 * @ingroup mutating_algorithms 1157 * @param __first A bidirectional iterator. 1158 * @param __last A bidirectional iterator. 1159 * @param __result An output iterator. 1160 * @return An iterator designating the end of the resulting sequence. 1161 * 1162 * Copies the elements in the range @p [__first,__last) to the 1163 * range @p [__result,__result+(__last-__first)) such that the 1164 * order of the elements is reversed. For every @c i such that @p 1165 * 0<=i<=(__last-__first), @p reverse_copy() performs the 1166 * assignment @p *(__result+(__last-__first)-1-i) = *(__first+i). 1167 * The ranges @p [__first,__last) and @p 1168 * [__result,__result+(__last-__first)) must not overlap. 1169 */ 1170 template
1171 _GLIBCXX20_CONSTEXPR 1172 _OutputIterator 1173 reverse_copy(_BidirectionalIterator __first, _BidirectionalIterator __last, 1174 _OutputIterator __result) 1175 { 1176 // concept requirements 1177 __glibcxx_function_requires(_BidirectionalIteratorConcept< 1178 _BidirectionalIterator>) 1179 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator, 1180 typename iterator_traits<_BidirectionalIterator>::value_type>) 1181 __glibcxx_requires_valid_range(__first, __last); 1182 1183 while (__first != __last) 1184 { 1185 --__last; 1186 *__result = *__last; 1187 ++__result; 1188 } 1189 return __result; 1190 } 1191 1192 /** 1193 * This is a helper function for the rotate algorithm specialized on RAIs. 1194 * It returns the greatest common divisor of two integer values. 1195 */ 1196 template
1197 _GLIBCXX20_CONSTEXPR 1198 _EuclideanRingElement 1199 __gcd(_EuclideanRingElement __m, _EuclideanRingElement __n) 1200 { 1201 while (__n != 0) 1202 { 1203 _EuclideanRingElement __t = __m % __n; 1204 __m = __n; 1205 __n = __t; 1206 } 1207 return __m; 1208 } 1209 1210 inline namespace _V2 1211 { 1212 1213 /// This is a helper function for the rotate algorithm. 1214 template
1215 _GLIBCXX20_CONSTEXPR 1216 _ForwardIterator 1217 __rotate(_ForwardIterator __first, 1218 _ForwardIterator __middle, 1219 _ForwardIterator __last, 1220 forward_iterator_tag) 1221 { 1222 if (__first == __middle) 1223 return __last; 1224 else if (__last == __middle) 1225 return __first; 1226 1227 _ForwardIterator __first2 = __middle; 1228 do 1229 { 1230 std::iter_swap(__first, __first2); 1231 ++__first; 1232 ++__first2; 1233 if (__first == __middle) 1234 __middle = __first2; 1235 } 1236 while (__first2 != __last); 1237 1238 _ForwardIterator __ret = __first; 1239 1240 __first2 = __middle; 1241 1242 while (__first2 != __last) 1243 { 1244 std::iter_swap(__first, __first2); 1245 ++__first; 1246 ++__first2; 1247 if (__first == __middle) 1248 __middle = __first2; 1249 else if (__first2 == __last) 1250 __first2 = __middle; 1251 } 1252 return __ret; 1253 } 1254 1255 /// This is a helper function for the rotate algorithm. 1256 template
1257 _GLIBCXX20_CONSTEXPR 1258 _BidirectionalIterator 1259 __rotate(_BidirectionalIterator __first, 1260 _BidirectionalIterator __middle, 1261 _BidirectionalIterator __last, 1262 bidirectional_iterator_tag) 1263 { 1264 // concept requirements 1265 __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept< 1266 _BidirectionalIterator>) 1267 1268 if (__first == __middle) 1269 return __last; 1270 else if (__last == __middle) 1271 return __first; 1272 1273 std::__reverse(__first, __middle, bidirectional_iterator_tag()); 1274 std::__reverse(__middle, __last, bidirectional_iterator_tag()); 1275 1276 while (__first != __middle && __middle != __last) 1277 { 1278 std::iter_swap(__first, --__last); 1279 ++__first; 1280 } 1281 1282 if (__first == __middle) 1283 { 1284 std::__reverse(__middle, __last, bidirectional_iterator_tag()); 1285 return __last; 1286 } 1287 else 1288 { 1289 std::__reverse(__first, __middle, bidirectional_iterator_tag()); 1290 return __first; 1291 } 1292 } 1293 1294 /// This is a helper function for the rotate algorithm. 1295 template
1296 _GLIBCXX20_CONSTEXPR 1297 _RandomAccessIterator 1298 __rotate(_RandomAccessIterator __first, 1299 _RandomAccessIterator __middle, 1300 _RandomAccessIterator __last, 1301 random_access_iterator_tag) 1302 { 1303 // concept requirements 1304 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept< 1305 _RandomAccessIterator>) 1306 1307 if (__first == __middle) 1308 return __last; 1309 else if (__last == __middle) 1310 return __first; 1311 1312 typedef typename iterator_traits<_RandomAccessIterator>::difference_type 1313 _Distance; 1314 typedef typename iterator_traits<_RandomAccessIterator>::value_type 1315 _ValueType; 1316 1317 _Distance __n = __last - __first; 1318 _Distance __k = __middle - __first; 1319 1320 if (__k == __n - __k) 1321 { 1322 std::swap_ranges(__first, __middle, __middle); 1323 return __middle; 1324 } 1325 1326 _RandomAccessIterator __p = __first; 1327 _RandomAccessIterator __ret = __first + (__last - __middle); 1328 1329 for (;;) 1330 { 1331 if (__k < __n - __k) 1332 { 1333 if (__is_pod(_ValueType) && __k == 1) 1334 { 1335 _ValueType __t = _GLIBCXX_MOVE(*__p); 1336 _GLIBCXX_MOVE3(__p + 1, __p + __n, __p); 1337 *(__p + __n - 1) = _GLIBCXX_MOVE(__t); 1338 return __ret; 1339 } 1340 _RandomAccessIterator __q = __p + __k; 1341 for (_Distance __i = 0; __i < __n - __k; ++ __i) 1342 { 1343 std::iter_swap(__p, __q); 1344 ++__p; 1345 ++__q; 1346 } 1347 __n %= __k; 1348 if (__n == 0) 1349 return __ret; 1350 std::swap(__n, __k); 1351 __k = __n - __k; 1352 } 1353 else 1354 { 1355 __k = __n - __k; 1356 if (__is_pod(_ValueType) && __k == 1) 1357 { 1358 _ValueType __t = _GLIBCXX_MOVE(*(__p + __n - 1)); 1359 _GLIBCXX_MOVE_BACKWARD3(__p, __p + __n - 1, __p + __n); 1360 *__p = _GLIBCXX_MOVE(__t); 1361 return __ret; 1362 } 1363 _RandomAccessIterator __q = __p + __n; 1364 __p = __q - __k; 1365 for (_Distance __i = 0; __i < __n - __k; ++ __i) 1366 { 1367 --__p; 1368 --__q; 1369 std::iter_swap(__p, __q); 1370 } 1371 __n %= __k; 1372 if (__n == 0) 1373 return __ret; 1374 std::swap(__n, __k); 1375 } 1376 } 1377 } 1378 1379 // _GLIBCXX_RESOLVE_LIB_DEFECTS 1380 // DR 488. rotate throws away useful information 1381 /** 1382 * @brief Rotate the elements of a sequence. 1383 * @ingroup mutating_algorithms 1384 * @param __first A forward iterator. 1385 * @param __middle A forward iterator. 1386 * @param __last A forward iterator. 1387 * @return first + (last - middle). 1388 * 1389 * Rotates the elements of the range @p [__first,__last) by 1390 * @p (__middle - __first) positions so that the element at @p __middle 1391 * is moved to @p __first, the element at @p __middle+1 is moved to 1392 * @p __first+1 and so on for each element in the range 1393 * @p [__first,__last). 1394 * 1395 * This effectively swaps the ranges @p [__first,__middle) and 1396 * @p [__middle,__last). 1397 * 1398 * Performs 1399 * @p *(__first+(n+(__last-__middle))%(__last-__first))=*(__first+n) 1400 * for each @p n in the range @p [0,__last-__first). 1401 */ 1402 template
1403 _GLIBCXX20_CONSTEXPR 1404 inline _ForwardIterator 1405 rotate(_ForwardIterator __first, _ForwardIterator __middle, 1406 _ForwardIterator __last) 1407 { 1408 // concept requirements 1409 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept< 1410 _ForwardIterator>) 1411 __glibcxx_requires_valid_range(__first, __middle); 1412 __glibcxx_requires_valid_range(__middle, __last); 1413 1414 return std::__rotate(__first, __middle, __last, 1415 std::__iterator_category(__first)); 1416 } 1417 1418 } // namespace _V2 1419 1420 /** 1421 * @brief Copy a sequence, rotating its elements. 1422 * @ingroup mutating_algorithms 1423 * @param __first A forward iterator. 1424 * @param __middle A forward iterator. 1425 * @param __last A forward iterator. 1426 * @param __result An output iterator. 1427 * @return An iterator designating the end of the resulting sequence. 1428 * 1429 * Copies the elements of the range @p [__first,__last) to the 1430 * range beginning at @result, rotating the copied elements by 1431 * @p (__middle-__first) positions so that the element at @p __middle 1432 * is moved to @p __result, the element at @p __middle+1 is moved 1433 * to @p __result+1 and so on for each element in the range @p 1434 * [__first,__last). 1435 * 1436 * Performs 1437 * @p *(__result+(n+(__last-__middle))%(__last-__first))=*(__first+n) 1438 * for each @p n in the range @p [0,__last-__first). 1439 */ 1440 template
1441 _GLIBCXX20_CONSTEXPR 1442 inline _OutputIterator 1443 rotate_copy(_ForwardIterator __first, _ForwardIterator __middle, 1444 _ForwardIterator __last, _OutputIterator __result) 1445 { 1446 // concept requirements 1447 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>) 1448 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator, 1449 typename iterator_traits<_ForwardIterator>::value_type>) 1450 __glibcxx_requires_valid_range(__first, __middle); 1451 __glibcxx_requires_valid_range(__middle, __last); 1452 1453 return std::copy(__first, __middle, 1454 std::copy(__middle, __last, __result)); 1455 } 1456 1457 /// This is a helper function... 1458 template
1459 _GLIBCXX20_CONSTEXPR 1460 _ForwardIterator 1461 __partition(_ForwardIterator __first, _ForwardIterator __last, 1462 _Predicate __pred, forward_iterator_tag) 1463 { 1464 if (__first == __last) 1465 return __first; 1466 1467 while (__pred(*__first)) 1468 if (++__first == __last) 1469 return __first; 1470 1471 _ForwardIterator __next = __first; 1472 1473 while (++__next != __last) 1474 if (__pred(*__next)) 1475 { 1476 std::iter_swap(__first, __next); 1477 ++__first; 1478 } 1479 1480 return __first; 1481 } 1482 1483 /// This is a helper function... 1484 template
1485 _GLIBCXX20_CONSTEXPR 1486 _BidirectionalIterator 1487 __partition(_BidirectionalIterator __first, _BidirectionalIterator __last, 1488 _Predicate __pred, bidirectional_iterator_tag) 1489 { 1490 while (true) 1491 { 1492 while (true) 1493 if (__first == __last) 1494 return __first; 1495 else if (__pred(*__first)) 1496 ++__first; 1497 else 1498 break; 1499 --__last; 1500 while (true) 1501 if (__first == __last) 1502 return __first; 1503 else if (!bool(__pred(*__last))) 1504 --__last; 1505 else 1506 break; 1507 std::iter_swap(__first, __last); 1508 ++__first; 1509 } 1510 } 1511 1512 // partition 1513 1514 /// This is a helper function... 1515 /// Requires __first != __last and !__pred(__first) 1516 /// and __len == distance(__first, __last). 1517 /// 1518 /// !__pred(__first) allows us to guarantee that we don't 1519 /// move-assign an element onto itself. 1520 template
1522 _ForwardIterator 1523 __stable_partition_adaptive(_ForwardIterator __first, 1524 _ForwardIterator __last, 1525 _Predicate __pred, _Distance __len, 1526 _Pointer __buffer, 1527 _Distance __buffer_size) 1528 { 1529 if (__len == 1) 1530 return __first; 1531 1532 if (__len <= __buffer_size) 1533 { 1534 _ForwardIterator __result1 = __first; 1535 _Pointer __result2 = __buffer; 1536 1537 // The precondition guarantees that !__pred(__first), so 1538 // move that element to the buffer before starting the loop. 1539 // This ensures that we only call __pred once per element. 1540 *__result2 = _GLIBCXX_MOVE(*__first); 1541 ++__result2; 1542 ++__first; 1543 for (; __first != __last; ++__first) 1544 if (__pred(__first)) 1545 { 1546 *__result1 = _GLIBCXX_MOVE(*__first); 1547 ++__result1; 1548 } 1549 else 1550 { 1551 *__result2 = _GLIBCXX_MOVE(*__first); 1552 ++__result2; 1553 } 1554 1555 _GLIBCXX_MOVE3(__buffer, __result2, __result1); 1556 return __result1; 1557 } 1558 1559 _ForwardIterator __middle = __first; 1560 std::advance(__middle, __len / 2); 1561 _ForwardIterator __left_split = 1562 std::__stable_partition_adaptive(__first, __middle, __pred, 1563 __len / 2, __buffer, 1564 __buffer_size); 1565 1566 // Advance past true-predicate values to satisfy this 1567 // function's preconditions. 1568 _Distance __right_len = __len - __len / 2; 1569 _ForwardIterator __right_split = 1570 std::__find_if_not_n(__middle, __right_len, __pred); 1571 1572 if (__right_len) 1573 __right_split = 1574 std::__stable_partition_adaptive(__right_split, __last, __pred, 1575 __right_len, 1576 __buffer, __buffer_size); 1577 1578 return std::rotate(__left_split, __middle, __right_split); 1579 } 1580 1581 template
1582 _ForwardIterator 1583 __stable_partition(_ForwardIterator __first, _ForwardIterator __last, 1584 _Predicate __pred) 1585 { 1586 __first = std::__find_if_not(__first, __last, __pred); 1587 1588 if (__first == __last) 1589 return __first; 1590 1591 typedef typename iterator_traits<_ForwardIterator>::value_type 1592 _ValueType; 1593 typedef typename iterator_traits<_ForwardIterator>::difference_type 1594 _DistanceType; 1595 1596 _Temporary_buffer<_ForwardIterator, _ValueType> 1597 __buf(__first, std::distance(__first, __last)); 1598 return 1599 std::__stable_partition_adaptive(__first, __last, __pred, 1600 _DistanceType(__buf.requested_size()), 1601 __buf.begin(), 1602 _DistanceType(__buf.size())); 1603 } 1604 1605 /** 1606 * @brief Move elements for which a predicate is true to the beginning 1607 * of a sequence, preserving relative ordering. 1608 * @ingroup mutating_algorithms 1609 * @param __first A forward iterator. 1610 * @param __last A forward iterator. 1611 * @param __pred A predicate functor. 1612 * @return An iterator @p middle such that @p __pred(i) is true for each 1613 * iterator @p i in the range @p [first,middle) and false for each @p i 1614 * in the range @p [middle,last). 1615 * 1616 * Performs the same function as @p partition() with the additional 1617 * guarantee that the relative ordering of elements in each group is 1618 * preserved, so any two elements @p x and @p y in the range 1619 * @p [__first,__last) such that @p __pred(x)==__pred(y) will have the same 1620 * relative ordering after calling @p stable_partition(). 1621 */ 1622 template
1623 inline _ForwardIterator 1624 stable_partition(_ForwardIterator __first, _ForwardIterator __last, 1625 _Predicate __pred) 1626 { 1627 // concept requirements 1628 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept< 1629 _ForwardIterator>) 1630 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate, 1631 typename iterator_traits<_ForwardIterator>::value_type>) 1632 __glibcxx_requires_valid_range(__first, __last); 1633 1634 return std::__stable_partition(__first, __last, 1635 __gnu_cxx::__ops::__pred_iter(__pred)); 1636 } 1637 1638 /// This is a helper function for the sort routines. 1639 template
1640 _GLIBCXX20_CONSTEXPR 1641 void 1642 __heap_select(_RandomAccessIterator __first, 1643 _RandomAccessIterator __middle, 1644 _RandomAccessIterator __last, _Compare __comp) 1645 { 1646 std::__make_heap(__first, __middle, __comp); 1647 for (_RandomAccessIterator __i = __middle; __i < __last; ++__i) 1648 if (__comp(__i, __first)) 1649 std::__pop_heap(__first, __middle, __i, __comp); 1650 } 1651 1652 // partial_sort 1653 1654 template
1656 _GLIBCXX20_CONSTEXPR 1657 _RandomAccessIterator 1658 __partial_sort_copy(_InputIterator __first, _InputIterator __last, 1659 _RandomAccessIterator __result_first, 1660 _RandomAccessIterator __result_last, 1661 _Compare __comp) 1662 { 1663 typedef typename iterator_traits<_InputIterator>::value_type 1664 _InputValueType; 1665 typedef iterator_traits<_RandomAccessIterator> _RItTraits; 1666 typedef typename _RItTraits::difference_type _DistanceType; 1667 1668 if (__result_first == __result_last) 1669 return __result_last; 1670 _RandomAccessIterator __result_real_last = __result_first; 1671 while (__first != __last && __result_real_last != __result_last) 1672 { 1673 *__result_real_last = *__first; 1674 ++__result_real_last; 1675 ++__first; 1676 } 1677 1678 std::__make_heap(__result_first, __result_real_last, __comp); 1679 while (__first != __last) 1680 { 1681 if (__comp(__first, __result_first)) 1682 std::__adjust_heap(__result_first, _DistanceType(0), 1683 _DistanceType(__result_real_last 1684 - __result_first), 1685 _InputValueType(*__first), __comp); 1686 ++__first; 1687 } 1688 std::__sort_heap(__result_first, __result_real_last, __comp); 1689 return __result_real_last; 1690 } 1691 1692 /** 1693 * @brief Copy the smallest elements of a sequence. 1694 * @ingroup sorting_algorithms 1695 * @param __first An iterator. 1696 * @param __last Another iterator. 1697 * @param __result_first A random-access iterator. 1698 * @param __result_last Another random-access iterator. 1699 * @return An iterator indicating the end of the resulting sequence. 1700 * 1701 * Copies and sorts the smallest N values from the range @p [__first,__last) 1702 * to the range beginning at @p __result_first, where the number of 1703 * elements to be copied, @p N, is the smaller of @p (__last-__first) and 1704 * @p (__result_last-__result_first). 1705 * After the sort if @e i and @e j are iterators in the range 1706 * @p [__result_first,__result_first+N) such that i precedes j then 1707 * *j<*i is false. 1708 * The value returned is @p __result_first+N. 1709 */ 1710 template
1711 _GLIBCXX20_CONSTEXPR 1712 inline _RandomAccessIterator 1713 partial_sort_copy(_InputIterator __first, _InputIterator __last, 1714 _RandomAccessIterator __result_first, 1715 _RandomAccessIterator __result_last) 1716 { 1717 #ifdef _GLIBCXX_CONCEPT_CHECKS 1718 typedef typename iterator_traits<_InputIterator>::value_type 1719 _InputValueType; 1720 typedef typename iterator_traits<_RandomAccessIterator>::value_type 1721 _OutputValueType; 1722 #endif 1723 1724 // concept requirements 1725 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>) 1726 __glibcxx_function_requires(_ConvertibleConcept<_InputValueType, 1727 _OutputValueType>) 1728 __glibcxx_function_requires(_LessThanOpConcept<_InputValueType, 1729 _OutputValueType>) 1730 __glibcxx_function_requires(_LessThanComparableConcept<_OutputValueType>) 1731 __glibcxx_requires_valid_range(__first, __last); 1732 __glibcxx_requires_irreflexive(__first, __last); 1733 __glibcxx_requires_valid_range(__result_first, __result_last); 1734 1735 return std::__partial_sort_copy(__first, __last, 1736 __result_first, __result_last, 1737 __gnu_cxx::__ops::__iter_less_iter()); 1738 } 1739 1740 /** 1741 * @brief Copy the smallest elements of a sequence using a predicate for 1742 * comparison. 1743 * @ingroup sorting_algorithms 1744 * @param __first An input iterator. 1745 * @param __last Another input iterator. 1746 * @param __result_first A random-access iterator. 1747 * @param __result_last Another random-access iterator. 1748 * @param __comp A comparison functor. 1749 * @return An iterator indicating the end of the resulting sequence. 1750 * 1751 * Copies and sorts the smallest N values from the range @p [__first,__last) 1752 * to the range beginning at @p result_first, where the number of 1753 * elements to be copied, @p N, is the smaller of @p (__last-__first) and 1754 * @p (__result_last-__result_first). 1755 * After the sort if @e i and @e j are iterators in the range 1756 * @p [__result_first,__result_first+N) such that i precedes j then 1757 * @p __comp(*j,*i) is false. 1758 * The value returned is @p __result_first+N. 1759 */ 1760 template
1762 _GLIBCXX20_CONSTEXPR 1763 inline _RandomAccessIterator 1764 partial_sort_copy(_InputIterator __first, _InputIterator __last, 1765 _RandomAccessIterator __result_first, 1766 _RandomAccessIterator __result_last, 1767 _Compare __comp) 1768 { 1769 #ifdef _GLIBCXX_CONCEPT_CHECKS 1770 typedef typename iterator_traits<_InputIterator>::value_type 1771 _InputValueType; 1772 typedef typename iterator_traits<_RandomAccessIterator>::value_type 1773 _OutputValueType; 1774 #endif 1775 1776 // concept requirements 1777 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>) 1778 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept< 1779 _RandomAccessIterator>) 1780 __glibcxx_function_requires(_ConvertibleConcept<_InputValueType, 1781 _OutputValueType>) 1782 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare, 1783 _InputValueType, _OutputValueType>) 1784 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare, 1785 _OutputValueType, _OutputValueType>) 1786 __glibcxx_requires_valid_range(__first, __last); 1787 __glibcxx_requires_irreflexive_pred(__first, __last, __comp); 1788 __glibcxx_requires_valid_range(__result_first, __result_last); 1789 1790 return std::__partial_sort_copy(__first, __last, 1791 __result_first, __result_last, 1792 __gnu_cxx::__ops::__iter_comp_iter(__comp)); 1793 } 1794 1795 /// This is a helper function for the sort routine. 1796 template
1797 _GLIBCXX20_CONSTEXPR 1798 void 1799 __unguarded_linear_insert(_RandomAccessIterator __last, 1800 _Compare __comp) 1801 { 1802 typename iterator_traits<_RandomAccessIterator>::value_type 1803 __val = _GLIBCXX_MOVE(*__last); 1804 _RandomAccessIterator __next = __last; 1805 --__next; 1806 while (__comp(__val, __next)) 1807 { 1808 *__last = _GLIBCXX_MOVE(*__next); 1809 __last = __next; 1810 --__next; 1811 } 1812 *__last = _GLIBCXX_MOVE(__val); 1813 } 1814 1815 /// This is a helper function for the sort routine. 1816 template
1817 _GLIBCXX20_CONSTEXPR 1818 void 1819 __insertion_sort(_RandomAccessIterator __first, 1820 _RandomAccessIterator __last, _Compare __comp) 1821 { 1822 if (__first == __last) return; 1823 1824 for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i) 1825 { 1826 if (__comp(__i, __first)) 1827 { 1828 typename iterator_traits<_RandomAccessIterator>::value_type 1829 __val = _GLIBCXX_MOVE(*__i); 1830 _GLIBCXX_MOVE_BACKWARD3(__first, __i, __i + 1); 1831 *__first = _GLIBCXX_MOVE(__val); 1832 } 1833 else 1834 std::__unguarded_linear_insert(__i, 1835 __gnu_cxx::__ops::__val_comp_iter(__comp)); 1836 } 1837 } 1838 1839 /// This is a helper function for the sort routine. 1840 template
1841 _GLIBCXX20_CONSTEXPR 1842 inline void 1843 __unguarded_insertion_sort(_RandomAccessIterator __first, 1844 _RandomAccessIterator __last, _Compare __comp) 1845 { 1846 for (_RandomAccessIterator __i = __first; __i != __last; ++__i) 1847 std::__unguarded_linear_insert(__i, 1848 __gnu_cxx::__ops::__val_comp_iter(__comp)); 1849 } 1850 1851 /** 1852 * @doctodo 1853 * This controls some aspect of the sort routines. 1854 */ 1855 enum { _S_threshold = 16 }; 1856 1857 /// This is a helper function for the sort routine. 1858 template
1859 _GLIBCXX20_CONSTEXPR 1860 void 1861 __final_insertion_sort(_RandomAccessIterator __first, 1862 _RandomAccessIterator __last, _Compare __comp) 1863 { 1864 if (__last - __first > int(_S_threshold)) 1865 { 1866 std::__insertion_sort(__first, __first + int(_S_threshold), __comp); 1867 std::__unguarded_insertion_sort(__first + int(_S_threshold), __last, 1868 __comp); 1869 } 1870 else 1871 std::__insertion_sort(__first, __last, __comp); 1872 } 1873 1874 /// This is a helper function... 1875 template
1876 _GLIBCXX20_CONSTEXPR 1877 _RandomAccessIterator 1878 __unguarded_partition(_RandomAccessIterator __first, 1879 _RandomAccessIterator __last, 1880 _RandomAccessIterator __pivot, _Compare __comp) 1881 { 1882 while (true) 1883 { 1884 while (__comp(__first, __pivot)) 1885 ++__first; 1886 --__last; 1887 while (__comp(__pivot, __last)) 1888 --__last; 1889 if (!(__first < __last)) 1890 return __first; 1891 std::iter_swap(__first, __last); 1892 ++__first; 1893 } 1894 } 1895 1896 /// This is a helper function... 1897 template
1898 _GLIBCXX20_CONSTEXPR 1899 inline _RandomAccessIterator 1900 __unguarded_partition_pivot(_RandomAccessIterator __first, 1901 _RandomAccessIterator __last, _Compare __comp) 1902 { 1903 _RandomAccessIterator __mid = __first + (__last - __first) / 2; 1904 std::__move_median_to_first(__first, __first + 1, __mid, __last - 1, 1905 __comp); 1906 return std::__unguarded_partition(__first + 1, __last, __first, __comp); 1907 } 1908 1909 template
1910 _GLIBCXX20_CONSTEXPR 1911 inline void 1912 __partial_sort(_RandomAccessIterator __first, 1913 _RandomAccessIterator __middle, 1914 _RandomAccessIterator __last, 1915 _Compare __comp) 1916 { 1917 std::__heap_select(__first, __middle, __last, __comp); 1918 std::__sort_heap(__first, __middle, __comp); 1919 } 1920 1921 /// This is a helper function for the sort routine. 1922 template
1923 _GLIBCXX20_CONSTEXPR 1924 void 1925 __introsort_loop(_RandomAccessIterator __first, 1926 _RandomAccessIterator __last, 1927 _Size __depth_limit, _Compare __comp) 1928 { 1929 while (__last - __first > int(_S_threshold)) 1930 { 1931 if (__depth_limit == 0) 1932 { 1933 std::__partial_sort(__first, __last, __last, __comp); 1934 return; 1935 } 1936 --__depth_limit; 1937 _RandomAccessIterator __cut = 1938 std::__unguarded_partition_pivot(__first, __last, __comp); 1939 std::__introsort_loop(__cut, __last, __depth_limit, __comp); 1940 __last = __cut; 1941 } 1942 } 1943 1944 // sort 1945 1946 template
1947 _GLIBCXX20_CONSTEXPR 1948 inline void 1949 __sort(_RandomAccessIterator __first, _RandomAccessIterator __last, 1950 _Compare __comp) 1951 { 1952 if (__first != __last) 1953 { 1954 std::__introsort_loop(__first, __last, 1955 std::__lg(__last - __first) * 2, 1956 __comp); 1957 std::__final_insertion_sort(__first, __last, __comp); 1958 } 1959 } 1960 1961 template
1962 _GLIBCXX20_CONSTEXPR 1963 void 1964 __introselect(_RandomAccessIterator __first, _RandomAccessIterator __nth, 1965 _RandomAccessIterator __last, _Size __depth_limit, 1966 _Compare __comp) 1967 { 1968 while (__last - __first > 3) 1969 { 1970 if (__depth_limit == 0) 1971 { 1972 std::__heap_select(__first, __nth + 1, __last, __comp); 1973 // Place the nth largest element in its final position. 1974 std::iter_swap(__first, __nth); 1975 return; 1976 } 1977 --__depth_limit; 1978 _RandomAccessIterator __cut = 1979 std::__unguarded_partition_pivot(__first, __last, __comp); 1980 if (__cut <= __nth) 1981 __first = __cut; 1982 else 1983 __last = __cut; 1984 } 1985 std::__insertion_sort(__first, __last, __comp); 1986 } 1987 1988 // nth_element 1989 1990 // lower_bound moved to stl_algobase.h 1991 1992 /** 1993 * @brief Finds the first position in which @p __val could be inserted 1994 * without changing the ordering. 1995 * @ingroup binary_search_algorithms 1996 * @param __first An iterator. 1997 * @param __last Another iterator. 1998 * @param __val The search term. 1999 * @param __comp A functor to use for comparisons. 2000 * @return An iterator pointing to the first element
not less 2001 * than
@p __val, or end() if every element is less 2002 * than @p __val. 2003 * @ingroup binary_search_algorithms 2004 * 2005 * The comparison function should have the same effects on ordering as 2006 * the function used for the initial sort. 2007 */ 2008 template
2009 _GLIBCXX20_CONSTEXPR 2010 inline _ForwardIterator 2011 lower_bound(_ForwardIterator __first, _ForwardIterator __last, 2012 const _Tp& __val, _Compare __comp) 2013 { 2014 // concept requirements 2015 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>) 2016 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare, 2017 typename iterator_traits<_ForwardIterator>::value_type, _Tp>) 2018 __glibcxx_requires_partitioned_lower_pred(__first, __last, 2019 __val, __comp); 2020 2021 return std::__lower_bound(__first, __last, __val, 2022 __gnu_cxx::__ops::__iter_comp_val(__comp)); 2023 } 2024 2025 template
2026 _GLIBCXX20_CONSTEXPR 2027 _ForwardIterator 2028 __upper_bound(_ForwardIterator __first, _ForwardIterator __last, 2029 const _Tp& __val, _Compare __comp) 2030 { 2031 typedef typename iterator_traits<_ForwardIterator>::difference_type 2032 _DistanceType; 2033 2034 _DistanceType __len = std::distance(__first, __last); 2035 2036 while (__len > 0) 2037 { 2038 _DistanceType __half = __len >> 1; 2039 _ForwardIterator __middle = __first; 2040 std::advance(__middle, __half); 2041 if (__comp(__val, __middle)) 2042 __len = __half; 2043 else 2044 { 2045 __first = __middle; 2046 ++__first; 2047 __len = __len - __half - 1; 2048 } 2049 } 2050 return __first; 2051 } 2052 2053 /** 2054 * @brief Finds the last position in which @p __val could be inserted 2055 * without changing the ordering. 2056 * @ingroup binary_search_algorithms 2057 * @param __first An iterator. 2058 * @param __last Another iterator. 2059 * @param __val The search term. 2060 * @return An iterator pointing to the first element greater than @p __val, 2061 * or end() if no elements are greater than @p __val. 2062 * @ingroup binary_search_algorithms 2063 */ 2064 template
2065 _GLIBCXX20_CONSTEXPR 2066 inline _ForwardIterator 2067 upper_bound(_ForwardIterator __first, _ForwardIterator __last, 2068 const _Tp& __val) 2069 { 2070 // concept requirements 2071 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>) 2072 __glibcxx_function_requires(_LessThanOpConcept< 2073 _Tp, typename iterator_traits<_ForwardIterator>::value_type>) 2074 __glibcxx_requires_partitioned_upper(__first, __last, __val); 2075 2076 return std::__upper_bound(__first, __last, __val, 2077 __gnu_cxx::__ops::__val_less_iter()); 2078 } 2079 2080 /** 2081 * @brief Finds the last position in which @p __val could be inserted 2082 * without changing the ordering. 2083 * @ingroup binary_search_algorithms 2084 * @param __first An iterator. 2085 * @param __last Another iterator. 2086 * @param __val The search term. 2087 * @param __comp A functor to use for comparisons. 2088 * @return An iterator pointing to the first element greater than @p __val, 2089 * or end() if no elements are greater than @p __val. 2090 * @ingroup binary_search_algorithms 2091 * 2092 * The comparison function should have the same effects on ordering as 2093 * the function used for the initial sort. 2094 */ 2095 template
2096 _GLIBCXX20_CONSTEXPR 2097 inline _ForwardIterator 2098 upper_bound(_ForwardIterator __first, _ForwardIterator __last, 2099 const _Tp& __val, _Compare __comp) 2100 { 2101 // concept requirements 2102 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>) 2103 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare, 2104 _Tp, typename iterator_traits<_ForwardIterator>::value_type>) 2105 __glibcxx_requires_partitioned_upper_pred(__first, __last, 2106 __val, __comp); 2107 2108 return std::__upper_bound(__first, __last, __val, 2109 __gnu_cxx::__ops::__val_comp_iter(__comp)); 2110 } 2111 2112 template
2114 _GLIBCXX20_CONSTEXPR 2115 pair<_ForwardIterator, _ForwardIterator> 2116 __equal_range(_ForwardIterator __first, _ForwardIterator __last, 2117 const _Tp& __val, 2118 _CompareItTp __comp_it_val, _CompareTpIt __comp_val_it) 2119 { 2120 typedef typename iterator_traits<_ForwardIterator>::difference_type 2121 _DistanceType; 2122 2123 _DistanceType __len = std::distance(__first, __last); 2124 2125 while (__len > 0) 2126 { 2127 _DistanceType __half = __len >> 1; 2128 _ForwardIterator __middle = __first; 2129 std::advance(__middle, __half); 2130 if (__comp_it_val(__middle, __val)) 2131 { 2132 __first = __middle; 2133 ++__first; 2134 __len = __len - __half - 1; 2135 } 2136 else if (__comp_val_it(__val, __middle)) 2137 __len = __half; 2138 else 2139 { 2140 _ForwardIterator __left 2141 = std::__lower_bound(__first, __middle, __val, __comp_it_val); 2142 std::advance(__first, __len); 2143 _ForwardIterator __right 2144 = std::__upper_bound(++__middle, __first, __val, __comp_val_it); 2145 return pair<_ForwardIterator, _ForwardIterator>(__left, __right); 2146 } 2147 } 2148 return pair<_ForwardIterator, _ForwardIterator>(__first, __first); 2149 } 2150 2151 /** 2152 * @brief Finds the largest subrange in which @p __val could be inserted 2153 * at any place in it without changing the ordering. 2154 * @ingroup binary_search_algorithms 2155 * @param __first An iterator. 2156 * @param __last Another iterator. 2157 * @param __val The search term. 2158 * @return An pair of iterators defining the subrange. 2159 * @ingroup binary_search_algorithms 2160 * 2161 * This is equivalent to 2162 * @code 2163 * std::make_pair(lower_bound(__first, __last, __val), 2164 * upper_bound(__first, __last, __val)) 2165 * @endcode 2166 * but does not actually call those functions. 2167 */ 2168 template
2169 _GLIBCXX20_CONSTEXPR 2170 inline pair<_ForwardIterator, _ForwardIterator> 2171 equal_range(_ForwardIterator __first, _ForwardIterator __last, 2172 const _Tp& __val) 2173 { 2174 // concept requirements 2175 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>) 2176 __glibcxx_function_requires(_LessThanOpConcept< 2177 typename iterator_traits<_ForwardIterator>::value_type, _Tp>) 2178 __glibcxx_function_requires(_LessThanOpConcept< 2179 _Tp, typename iterator_traits<_ForwardIterator>::value_type>) 2180 __glibcxx_requires_partitioned_lower(__first, __last, __val); 2181 __glibcxx_requires_partitioned_upper(__first, __last, __val); 2182 2183 return std::__equal_range(__first, __last, __val, 2184 __gnu_cxx::__ops::__iter_less_val(), 2185 __gnu_cxx::__ops::__val_less_iter()); 2186 } 2187 2188 /** 2189 * @brief Finds the largest subrange in which @p __val could be inserted 2190 * at any place in it without changing the ordering. 2191 * @param __first An iterator. 2192 * @param __last Another iterator. 2193 * @param __val The search term. 2194 * @param __comp A functor to use for comparisons. 2195 * @return An pair of iterators defining the subrange. 2196 * @ingroup binary_search_algorithms 2197 * 2198 * This is equivalent to 2199 * @code 2200 * std::make_pair(lower_bound(__first, __last, __val, __comp), 2201 * upper_bound(__first, __last, __val, __comp)) 2202 * @endcode 2203 * but does not actually call those functions. 2204 */ 2205 template
2206 _GLIBCXX20_CONSTEXPR 2207 inline pair<_ForwardIterator, _ForwardIterator> 2208 equal_range(_ForwardIterator __first, _ForwardIterator __last, 2209 const _Tp& __val, _Compare __comp) 2210 { 2211 // concept requirements 2212 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>) 2213 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare, 2214 typename iterator_traits<_ForwardIterator>::value_type, _Tp>) 2215 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare, 2216 _Tp, typename iterator_traits<_ForwardIterator>::value_type>) 2217 __glibcxx_requires_partitioned_lower_pred(__first, __last, 2218 __val, __comp); 2219 __glibcxx_requires_partitioned_upper_pred(__first, __last, 2220 __val, __comp); 2221 2222 return std::__equal_range(__first, __last, __val, 2223 __gnu_cxx::__ops::__iter_comp_val(__comp), 2224 __gnu_cxx::__ops::__val_comp_iter(__comp)); 2225 } 2226 2227 /** 2228 * @brief Determines whether an element exists in a range. 2229 * @ingroup binary_search_algorithms 2230 * @param __first An iterator. 2231 * @param __last Another iterator. 2232 * @param __val The search term. 2233 * @return True if @p __val (or its equivalent) is in [@p 2234 * __first,@p __last ]. 2235 * 2236 * Note that this does not actually return an iterator to @p __val. For 2237 * that, use std::find or a container's specialized find member functions. 2238 */ 2239 template
2240 _GLIBCXX20_CONSTEXPR 2241 bool 2242 binary_search(_ForwardIterator __first, _ForwardIterator __last, 2243 const _Tp& __val) 2244 { 2245 // concept requirements 2246 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>) 2247 __glibcxx_function_requires(_LessThanOpConcept< 2248 _Tp, typename iterator_traits<_ForwardIterator>::value_type>) 2249 __glibcxx_requires_partitioned_lower(__first, __last, __val); 2250 __glibcxx_requires_partitioned_upper(__first, __last, __val); 2251 2252 _ForwardIterator __i 2253 = std::__lower_bound(__first, __last, __val, 2254 __gnu_cxx::__ops::__iter_less_val()); 2255 return __i != __last && !(__val < *__i); 2256 } 2257 2258 /** 2259 * @brief Determines whether an element exists in a range. 2260 * @ingroup binary_search_algorithms 2261 * @param __first An iterator. 2262 * @param __last Another iterator. 2263 * @param __val The search term. 2264 * @param __comp A functor to use for comparisons. 2265 * @return True if @p __val (or its equivalent) is in @p [__first,__last]. 2266 * 2267 * Note that this does not actually return an iterator to @p __val. For 2268 * that, use std::find or a container's specialized find member functions. 2269 * 2270 * The comparison function should have the same effects on ordering as 2271 * the function used for the initial sort. 2272 */ 2273 template
2274 _GLIBCXX20_CONSTEXPR 2275 bool 2276 binary_search(_ForwardIterator __first, _ForwardIterator __last, 2277 const _Tp& __val, _Compare __comp) 2278 { 2279 // concept requirements 2280 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>) 2281 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare, 2282 _Tp, typename iterator_traits<_ForwardIterator>::value_type>) 2283 __glibcxx_requires_partitioned_lower_pred(__first, __last, 2284 __val, __comp); 2285 __glibcxx_requires_partitioned_upper_pred(__first, __last, 2286 __val, __comp); 2287 2288 _ForwardIterator __i 2289 = std::__lower_bound(__first, __last, __val, 2290 __gnu_cxx::__ops::__iter_comp_val(__comp)); 2291 return __i != __last && !bool(__comp(__val, *__i)); 2292 } 2293 2294 // merge 2295 2296 /// This is a helper function for the __merge_adaptive routines. 2297 template
2299 void 2300 __move_merge_adaptive(_InputIterator1 __first1, _InputIterator1 __last1, 2301 _InputIterator2 __first2, _InputIterator2 __last2, 2302 _OutputIterator __result, _Compare __comp) 2303 { 2304 while (__first1 != __last1 && __first2 != __last2) 2305 { 2306 if (__comp(__first2, __first1)) 2307 { 2308 *__result = _GLIBCXX_MOVE(*__first2); 2309 ++__first2; 2310 } 2311 else 2312 { 2313 *__result = _GLIBCXX_MOVE(*__first1); 2314 ++__first1; 2315 } 2316 ++__result; 2317 } 2318 if (__first1 != __last1) 2319 _GLIBCXX_MOVE3(__first1, __last1, __result); 2320 } 2321 2322 /// This is a helper function for the __merge_adaptive routines. 2323 template
2325 void 2326 __move_merge_adaptive_backward(_BidirectionalIterator1 __first1, 2327 _BidirectionalIterator1 __last1, 2328 _BidirectionalIterator2 __first2, 2329 _BidirectionalIterator2 __last2, 2330 _BidirectionalIterator3 __result, 2331 _Compare __comp) 2332 { 2333 if (__first1 == __last1) 2334 { 2335 _GLIBCXX_MOVE_BACKWARD3(__first2, __last2, __result); 2336 return; 2337 } 2338 else if (__first2 == __last2) 2339 return; 2340 2341 --__last1; 2342 --__last2; 2343 while (true) 2344 { 2345 if (__comp(__last2, __last1)) 2346 { 2347 *--__result = _GLIBCXX_MOVE(*__last1); 2348 if (__first1 == __last1) 2349 { 2350 _GLIBCXX_MOVE_BACKWARD3(__first2, ++__last2, __result); 2351 return; 2352 } 2353 --__last1; 2354 } 2355 else 2356 { 2357 *--__result = _GLIBCXX_MOVE(*__last2); 2358 if (__first2 == __last2) 2359 return; 2360 --__last2; 2361 } 2362 } 2363 } 2364 2365 /// This is a helper function for the merge routines. 2366 template
2368 _BidirectionalIterator1 2369 __rotate_adaptive(_BidirectionalIterator1 __first, 2370 _BidirectionalIterator1 __middle, 2371 _BidirectionalIterator1 __last, 2372 _Distance __len1, _Distance __len2, 2373 _BidirectionalIterator2 __buffer, 2374 _Distance __buffer_size) 2375 { 2376 _BidirectionalIterator2 __buffer_end; 2377 if (__len1 > __len2 && __len2 <= __buffer_size) 2378 { 2379 if (__len2) 2380 { 2381 __buffer_end = _GLIBCXX_MOVE3(__middle, __last, __buffer); 2382 _GLIBCXX_MOVE_BACKWARD3(__first, __middle, __last); 2383 return _GLIBCXX_MOVE3(__buffer, __buffer_end, __first); 2384 } 2385 else 2386 return __first; 2387 } 2388 else if (__len1 <= __buffer_size) 2389 { 2390 if (__len1) 2391 { 2392 __buffer_end = _GLIBCXX_MOVE3(__first, __middle, __buffer); 2393 _GLIBCXX_MOVE3(__middle, __last, __first); 2394 return _GLIBCXX_MOVE_BACKWARD3(__buffer, __buffer_end, __last); 2395 } 2396 else 2397 return __last; 2398 } 2399 else 2400 return std::rotate(__first, __middle, __last); 2401 } 2402 2403 /// This is a helper function for the merge routines. 2404 template
2406 void 2407 __merge_adaptive(_BidirectionalIterator __first, 2408 _BidirectionalIterator __middle, 2409 _BidirectionalIterator __last, 2410 _Distance __len1, _Distance __len2, 2411 _Pointer __buffer, _Distance __buffer_size, 2412 _Compare __comp) 2413 { 2414 if (__len1 <= __len2 && __len1 <= __buffer_size) 2415 { 2416 _Pointer __buffer_end = _GLIBCXX_MOVE3(__first, __middle, __buffer); 2417 std::__move_merge_adaptive(__buffer, __buffer_end, __middle, __last, 2418 __first, __comp); 2419 } 2420 else if (__len2 <= __buffer_size) 2421 { 2422 _Pointer __buffer_end = _GLIBCXX_MOVE3(__middle, __last, __buffer); 2423 std::__move_merge_adaptive_backward(__first, __middle, __buffer, 2424 __buffer_end, __last, __comp); 2425 } 2426 else 2427 { 2428 _BidirectionalIterator __first_cut = __first; 2429 _BidirectionalIterator __second_cut = __middle; 2430 _Distance __len11 = 0; 2431 _Distance __len22 = 0; 2432 if (__len1 > __len2) 2433 { 2434 __len11 = __len1 / 2; 2435 std::advance(__first_cut, __len11); 2436 __second_cut 2437 = std::__lower_bound(__middle, __last, *__first_cut, 2438 __gnu_cxx::__ops::__iter_comp_val(__comp)); 2439 __len22 = std::distance(__middle, __second_cut); 2440 } 2441 else 2442 { 2443 __len22 = __len2 / 2; 2444 std::advance(__second_cut, __len22); 2445 __first_cut 2446 = std::__upper_bound(__first, __middle, *__second_cut, 2447 __gnu_cxx::__ops::__val_comp_iter(__comp)); 2448 __len11 = std::distance(__first, __first_cut); 2449 } 2450 2451 _BidirectionalIterator __new_middle 2452 = std::__rotate_adaptive(__first_cut, __middle, __second_cut, 2453 __len1 - __len11, __len22, __buffer, 2454 __buffer_size); 2455 std::__merge_adaptive(__first, __first_cut, __new_middle, __len11, 2456 __len22, __buffer, __buffer_size, __comp); 2457 std::__merge_adaptive(__new_middle, __second_cut, __last, 2458 __len1 - __len11, 2459 __len2 - __len22, __buffer, 2460 __buffer_size, __comp); 2461 } 2462 } 2463 2464 /// This is a helper function for the merge routines. 2465 template
2467 void 2468 __merge_without_buffer(_BidirectionalIterator __first, 2469 _BidirectionalIterator __middle, 2470 _BidirectionalIterator __last, 2471 _Distance __len1, _Distance __len2, 2472 _Compare __comp) 2473 { 2474 if (__len1 == 0 || __len2 == 0) 2475 return; 2476 2477 if (__len1 + __len2 == 2) 2478 { 2479 if (__comp(__middle, __first)) 2480 std::iter_swap(__first, __middle); 2481 return; 2482 } 2483 2484 _BidirectionalIterator __first_cut = __first; 2485 _BidirectionalIterator __second_cut = __middle; 2486 _Distance __len11 = 0; 2487 _Distance __len22 = 0; 2488 if (__len1 > __len2) 2489 { 2490 __len11 = __len1 / 2; 2491 std::advance(__first_cut, __len11); 2492 __second_cut 2493 = std::__lower_bound(__middle, __last, *__first_cut, 2494 __gnu_cxx::__ops::__iter_comp_val(__comp)); 2495 __len22 = std::distance(__middle, __second_cut); 2496 } 2497 else 2498 { 2499 __len22 = __len2 / 2; 2500 std::advance(__second_cut, __len22); 2501 __first_cut 2502 = std::__upper_bound(__first, __middle, *__second_cut, 2503 __gnu_cxx::__ops::__val_comp_iter(__comp)); 2504 __len11 = std::distance(__first, __first_cut); 2505 } 2506 2507 _BidirectionalIterator __new_middle 2508 = std::rotate(__first_cut, __middle, __second_cut); 2509 std::__merge_without_buffer(__first, __first_cut, __new_middle, 2510 __len11, __len22, __comp); 2511 std::__merge_without_buffer(__new_middle, __second_cut, __last, 2512 __len1 - __len11, __len2 - __len22, __comp); 2513 } 2514 2515 template
2516 void 2517 __inplace_merge(_BidirectionalIterator __first, 2518 _BidirectionalIterator __middle, 2519 _BidirectionalIterator __last, 2520 _Compare __comp) 2521 { 2522 typedef typename iterator_traits<_BidirectionalIterator>::value_type 2523 _ValueType; 2524 typedef typename iterator_traits<_BidirectionalIterator>::difference_type 2525 _DistanceType; 2526 typedef _Temporary_buffer<_BidirectionalIterator, _ValueType> _TmpBuf; 2527 2528 if (__first == __middle || __middle == __last) 2529 return; 2530 2531 const _DistanceType __len1 = std::distance(__first, __middle); 2532 const _DistanceType __len2 = std::distance(__middle, __last); 2533 2534 // __merge_adaptive will use a buffer for the smaller of 2535 // [first,middle) and [middle,last). 2536 _TmpBuf __buf(__first, std::min(__len1, __len2)); 2537 2538 if (__buf.begin() == 0) 2539 std::__merge_without_buffer 2540 (__first, __middle, __last, __len1, __len2, __comp); 2541 else 2542 std::__merge_adaptive 2543 (__first, __middle, __last, __len1, __len2, __buf.begin(), 2544 _DistanceType(__buf.size()), __comp); 2545 } 2546 2547 /** 2548 * @brief Merges two sorted ranges in place. 2549 * @ingroup sorting_algorithms 2550 * @param __first An iterator. 2551 * @param __middle Another iterator. 2552 * @param __last Another iterator. 2553 * @return Nothing. 2554 * 2555 * Merges two sorted and consecutive ranges, [__first,__middle) and 2556 * [__middle,__last), and puts the result in [__first,__last). The 2557 * output will be sorted. The sort is @e stable, that is, for 2558 * equivalent elements in the two ranges, elements from the first 2559 * range will always come before elements from the second. 2560 * 2561 * If enough additional memory is available, this takes (__last-__first)-1 2562 * comparisons. Otherwise an NlogN algorithm is used, where N is 2563 * distance(__first,__last). 2564 */ 2565 template
2566 inline void 2567 inplace_merge(_BidirectionalIterator __first, 2568 _BidirectionalIterator __middle, 2569 _BidirectionalIterator __last) 2570 { 2571 // concept requirements 2572 __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept< 2573 _BidirectionalIterator>) 2574 __glibcxx_function_requires(_LessThanComparableConcept< 2575 typename iterator_traits<_BidirectionalIterator>::value_type>) 2576 __glibcxx_requires_sorted(__first, __middle); 2577 __glibcxx_requires_sorted(__middle, __last); 2578 __glibcxx_requires_irreflexive(__first, __last); 2579 2580 std::__inplace_merge(__first, __middle, __last, 2581 __gnu_cxx::__ops::__iter_less_iter()); 2582 } 2583 2584 /** 2585 * @brief Merges two sorted ranges in place. 2586 * @ingroup sorting_algorithms 2587 * @param __first An iterator. 2588 * @param __middle Another iterator. 2589 * @param __last Another iterator. 2590 * @param __comp A functor to use for comparisons. 2591 * @return Nothing. 2592 * 2593 * Merges two sorted and consecutive ranges, [__first,__middle) and 2594 * [middle,last), and puts the result in [__first,__last). The output will 2595 * be sorted. The sort is @e stable, that is, for equivalent 2596 * elements in the two ranges, elements from the first range will always 2597 * come before elements from the second. 2598 * 2599 * If enough additional memory is available, this takes (__last-__first)-1 2600 * comparisons. Otherwise an NlogN algorithm is used, where N is 2601 * distance(__first,__last). 2602 * 2603 * The comparison function should have the same effects on ordering as 2604 * the function used for the initial sort. 2605 */ 2606 template
2607 inline void 2608 inplace_merge(_BidirectionalIterator __first, 2609 _BidirectionalIterator __middle, 2610 _BidirectionalIterator __last, 2611 _Compare __comp) 2612 { 2613 // concept requirements 2614 __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept< 2615 _BidirectionalIterator>) 2616 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare, 2617 typename iterator_traits<_BidirectionalIterator>::value_type, 2618 typename iterator_traits<_BidirectionalIterator>::value_type>) 2619 __glibcxx_requires_sorted_pred(__first, __middle, __comp); 2620 __glibcxx_requires_sorted_pred(__middle, __last, __comp); 2621 __glibcxx_requires_irreflexive_pred(__first, __last, __comp); 2622 2623 std::__inplace_merge(__first, __middle, __last, 2624 __gnu_cxx::__ops::__iter_comp_iter(__comp)); 2625 } 2626 2627 2628 /// This is a helper function for the __merge_sort_loop routines. 2629 template
2631 _OutputIterator 2632 __move_merge(_InputIterator __first1, _InputIterator __last1, 2633 _InputIterator __first2, _InputIterator __last2, 2634 _OutputIterator __result, _Compare __comp) 2635 { 2636 while (__first1 != __last1 && __first2 != __last2) 2637 { 2638 if (__comp(__first2, __first1)) 2639 { 2640 *__result = _GLIBCXX_MOVE(*__first2); 2641 ++__first2; 2642 } 2643 else 2644 { 2645 *__result = _GLIBCXX_MOVE(*__first1); 2646 ++__first1; 2647 } 2648 ++__result; 2649 } 2650 return _GLIBCXX_MOVE3(__first2, __last2, 2651 _GLIBCXX_MOVE3(__first1, __last1, 2652 __result)); 2653 } 2654 2655 template
2657 void 2658 __merge_sort_loop(_RandomAccessIterator1 __first, 2659 _RandomAccessIterator1 __last, 2660 _RandomAccessIterator2 __result, _Distance __step_size, 2661 _Compare __comp) 2662 { 2663 const _Distance __two_step = 2 * __step_size; 2664 2665 while (__last - __first >= __two_step) 2666 { 2667 __result = std::__move_merge(__first, __first + __step_size, 2668 __first + __step_size, 2669 __first + __two_step, 2670 __result, __comp); 2671 __first += __two_step; 2672 } 2673 __step_size = std::min(_Distance(__last - __first), __step_size); 2674 2675 std::__move_merge(__first, __first + __step_size, 2676 __first + __step_size, __last, __result, __comp); 2677 } 2678 2679 template
2681 _GLIBCXX20_CONSTEXPR 2682 void 2683 __chunk_insertion_sort(_RandomAccessIterator __first, 2684 _RandomAccessIterator __last, 2685 _Distance __chunk_size, _Compare __comp) 2686 { 2687 while (__last - __first >= __chunk_size) 2688 { 2689 std::__insertion_sort(__first, __first + __chunk_size, __comp); 2690 __first += __chunk_size; 2691 } 2692 std::__insertion_sort(__first, __last, __comp); 2693 } 2694 2695 enum { _S_chunk_size = 7 }; 2696 2697 template
2698 void 2699 __merge_sort_with_buffer(_RandomAccessIterator __first, 2700 _RandomAccessIterator __last, 2701 _Pointer __buffer, _Compare __comp) 2702 { 2703 typedef typename iterator_traits<_RandomAccessIterator>::difference_type 2704 _Distance; 2705 2706 const _Distance __len = __last - __first; 2707 const _Pointer __buffer_last = __buffer + __len; 2708 2709 _Distance __step_size = _S_chunk_size; 2710 std::__chunk_insertion_sort(__first, __last, __step_size, __comp); 2711 2712 while (__step_size < __len) 2713 { 2714 std::__merge_sort_loop(__first, __last, __buffer, 2715 __step_size, __comp); 2716 __step_size *= 2; 2717 std::__merge_sort_loop(__buffer, __buffer_last, __first, 2718 __step_size, __comp); 2719 __step_size *= 2; 2720 } 2721 } 2722 2723 template
2725 void 2726 __stable_sort_adaptive(_RandomAccessIterator __first, 2727 _RandomAccessIterator __last, 2728 _Pointer __buffer, _Distance __buffer_size, 2729 _Compare __comp) 2730 { 2731 const _Distance __len = (__last - __first + 1) / 2; 2732 const _RandomAccessIterator __middle = __first + __len; 2733 if (__len > __buffer_size) 2734 { 2735 std::__stable_sort_adaptive(__first, __middle, __buffer, 2736 __buffer_size, __comp); 2737 std::__stable_sort_adaptive(__middle, __last, __buffer, 2738 __buffer_size, __comp); 2739 } 2740 else 2741 { 2742 std::__merge_sort_with_buffer(__first, __middle, __buffer, __comp); 2743 std::__merge_sort_with_buffer(__middle, __last, __buffer, __comp); 2744 } 2745 2746 std::__merge_adaptive(__first, __middle, __last, 2747 _Distance(__middle - __first), 2748 _Distance(__last - __middle), 2749 __buffer, __buffer_size, 2750 __comp); 2751 } 2752 2753 /// This is a helper function for the stable sorting routines. 2754 template
2755 void 2756 __inplace_stable_sort(_RandomAccessIterator __first, 2757 _RandomAccessIterator __last, _Compare __comp) 2758 { 2759 if (__last - __first < 15) 2760 { 2761 std::__insertion_sort(__first, __last, __comp); 2762 return; 2763 } 2764 _RandomAccessIterator __middle = __first + (__last - __first) / 2; 2765 std::__inplace_stable_sort(__first, __middle, __comp); 2766 std::__inplace_stable_sort(__middle, __last, __comp); 2767 std::__merge_without_buffer(__first, __middle, __last, 2768 __middle - __first, 2769 __last - __middle, 2770 __comp); 2771 } 2772 2773 // stable_sort 2774 2775 // Set algorithms: includes, set_union, set_intersection, set_difference, 2776 // set_symmetric_difference. All of these algorithms have the precondition 2777 // that their input ranges are sorted and the postcondition that their output 2778 // ranges are sorted. 2779 2780 template
2782 _GLIBCXX20_CONSTEXPR 2783 bool 2784 __includes(_InputIterator1 __first1, _InputIterator1 __last1, 2785 _InputIterator2 __first2, _InputIterator2 __last2, 2786 _Compare __comp) 2787 { 2788 while (__first1 != __last1 && __first2 != __last2) 2789 { 2790 if (__comp(__first2, __first1)) 2791 return false; 2792 if (!__comp(__first1, __first2)) 2793 ++__first2; 2794 ++__first1; 2795 } 2796 2797 return __first2 == __last2; 2798 } 2799 2800 /** 2801 * @brief Determines whether all elements of a sequence exists in a range. 2802 * @param __first1 Start of search range. 2803 * @param __last1 End of search range. 2804 * @param __first2 Start of sequence 2805 * @param __last2 End of sequence. 2806 * @return True if each element in [__first2,__last2) is contained in order 2807 * within [__first1,__last1). False otherwise. 2808 * @ingroup set_algorithms 2809 * 2810 * This operation expects both [__first1,__last1) and 2811 * [__first2,__last2) to be sorted. Searches for the presence of 2812 * each element in [__first2,__last2) within [__first1,__last1). 2813 * The iterators over each range only move forward, so this is a 2814 * linear algorithm. If an element in [__first2,__last2) is not 2815 * found before the search iterator reaches @p __last2, false is 2816 * returned. 2817 */ 2818 template
2819 _GLIBCXX20_CONSTEXPR 2820 inline bool 2821 includes(_InputIterator1 __first1, _InputIterator1 __last1, 2822 _InputIterator2 __first2, _InputIterator2 __last2) 2823 { 2824 // concept requirements 2825 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>) 2826 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>) 2827 __glibcxx_function_requires(_LessThanOpConcept< 2828 typename iterator_traits<_InputIterator1>::value_type, 2829 typename iterator_traits<_InputIterator2>::value_type>) 2830 __glibcxx_function_requires(_LessThanOpConcept< 2831 typename iterator_traits<_InputIterator2>::value_type, 2832 typename iterator_traits<_InputIterator1>::value_type>) 2833 __glibcxx_requires_sorted_set(__first1, __last1, __first2); 2834 __glibcxx_requires_sorted_set(__first2, __last2, __first1); 2835 __glibcxx_requires_irreflexive2(__first1, __last1); 2836 __glibcxx_requires_irreflexive2(__first2, __last2); 2837 2838 return std::__includes(__first1, __last1, __first2, __last2, 2839 __gnu_cxx::__ops::__iter_less_iter()); 2840 } 2841 2842 /** 2843 * @brief Determines whether all elements of a sequence exists in a range 2844 * using comparison. 2845 * @ingroup set_algorithms 2846 * @param __first1 Start of search range. 2847 * @param __last1 End of search range. 2848 * @param __first2 Start of sequence 2849 * @param __last2 End of sequence. 2850 * @param __comp Comparison function to use. 2851 * @return True if each element in [__first2,__last2) is contained 2852 * in order within [__first1,__last1) according to comp. False 2853 * otherwise. @ingroup set_algorithms 2854 * 2855 * This operation expects both [__first1,__last1) and 2856 * [__first2,__last2) to be sorted. Searches for the presence of 2857 * each element in [__first2,__last2) within [__first1,__last1), 2858 * using comp to decide. The iterators over each range only move 2859 * forward, so this is a linear algorithm. If an element in 2860 * [__first2,__last2) is not found before the search iterator 2861 * reaches @p __last2, false is returned. 2862 */ 2863 template
2865 _GLIBCXX20_CONSTEXPR 2866 inline bool 2867 includes(_InputIterator1 __first1, _InputIterator1 __last1, 2868 _InputIterator2 __first2, _InputIterator2 __last2, 2869 _Compare __comp) 2870 { 2871 // concept requirements 2872 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>) 2873 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>) 2874 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare, 2875 typename iterator_traits<_InputIterator1>::value_type, 2876 typename iterator_traits<_InputIterator2>::value_type>) 2877 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare, 2878 typename iterator_traits<_InputIterator2>::value_type, 2879 typename iterator_traits<_InputIterator1>::value_type>) 2880 __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp); 2881 __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp); 2882 __glibcxx_requires_irreflexive_pred2(__first1, __last1, __comp); 2883 __glibcxx_requires_irreflexive_pred2(__first2, __last2, __comp); 2884 2885 return std::__includes(__first1, __last1, __first2, __last2, 2886 __gnu_cxx::__ops::__iter_comp_iter(__comp)); 2887 } 2888 2889 // nth_element 2890 // merge 2891 // set_difference 2892 // set_intersection 2893 // set_union 2894 // stable_sort 2895 // set_symmetric_difference 2896 // min_element 2897 // max_element 2898 2899 template
2900 _GLIBCXX20_CONSTEXPR 2901 bool 2902 __next_permutation(_BidirectionalIterator __first, 2903 _BidirectionalIterator __last, _Compare __comp) 2904 { 2905 if (__first == __last) 2906 return false; 2907 _BidirectionalIterator __i = __first; 2908 ++__i; 2909 if (__i == __last) 2910 return false; 2911 __i = __last; 2912 --__i; 2913 2914 for(;;) 2915 { 2916 _BidirectionalIterator __ii = __i; 2917 --__i; 2918 if (__comp(__i, __ii)) 2919 { 2920 _BidirectionalIterator __j = __last; 2921 while (!__comp(__i, --__j)) 2922 {} 2923 std::iter_swap(__i, __j); 2924 std::__reverse(__ii, __last, 2925 std::__iterator_category(__first)); 2926 return true; 2927 } 2928 if (__i == __first) 2929 { 2930 std::__reverse(__first, __last, 2931 std::__iterator_category(__first)); 2932 return false; 2933 } 2934 } 2935 } 2936 2937 /** 2938 * @brief Permute range into the next @e dictionary ordering. 2939 * @ingroup sorting_algorithms 2940 * @param __first Start of range. 2941 * @param __last End of range. 2942 * @return False if wrapped to first permutation, true otherwise. 2943 * 2944 * Treats all permutations of the range as a set of @e dictionary sorted 2945 * sequences. Permutes the current sequence into the next one of this set. 2946 * Returns true if there are more sequences to generate. If the sequence 2947 * is the largest of the set, the smallest is generated and false returned. 2948 */ 2949 template
2950 _GLIBCXX20_CONSTEXPR 2951 inline bool 2952 next_permutation(_BidirectionalIterator __first, 2953 _BidirectionalIterator __last) 2954 { 2955 // concept requirements 2956 __glibcxx_function_requires(_BidirectionalIteratorConcept< 2957 _BidirectionalIterator>) 2958 __glibcxx_function_requires(_LessThanComparableConcept< 2959 typename iterator_traits<_BidirectionalIterator>::value_type>) 2960 __glibcxx_requires_valid_range(__first, __last); 2961 __glibcxx_requires_irreflexive(__first, __last); 2962 2963 return std::__next_permutation 2964 (__first, __last, __gnu_cxx::__ops::__iter_less_iter()); 2965 } 2966 2967 /** 2968 * @brief Permute range into the next @e dictionary ordering using 2969 * comparison functor. 2970 * @ingroup sorting_algorithms 2971 * @param __first Start of range. 2972 * @param __last End of range. 2973 * @param __comp A comparison functor. 2974 * @return False if wrapped to first permutation, true otherwise. 2975 * 2976 * Treats all permutations of the range [__first,__last) as a set of 2977 * @e dictionary sorted sequences ordered by @p __comp. Permutes the current 2978 * sequence into the next one of this set. Returns true if there are more 2979 * sequences to generate. If the sequence is the largest of the set, the 2980 * smallest is generated and false returned. 2981 */ 2982 template
2983 _GLIBCXX20_CONSTEXPR 2984 inline bool 2985 next_permutation(_BidirectionalIterator __first, 2986 _BidirectionalIterator __last, _Compare __comp) 2987 { 2988 // concept requirements 2989 __glibcxx_function_requires(_BidirectionalIteratorConcept< 2990 _BidirectionalIterator>) 2991 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare, 2992 typename iterator_traits<_BidirectionalIterator>::value_type, 2993 typename iterator_traits<_BidirectionalIterator>::value_type>) 2994 __glibcxx_requires_valid_range(__first, __last); 2995 __glibcxx_requires_irreflexive_pred(__first, __last, __comp); 2996 2997 return std::__next_permutation 2998 (__first, __last, __gnu_cxx::__ops::__iter_comp_iter(__comp)); 2999 } 3000 3001 template
3002 _GLIBCXX20_CONSTEXPR 3003 bool 3004 __prev_permutation(_BidirectionalIterator __first, 3005 _BidirectionalIterator __last, _Compare __comp) 3006 { 3007 if (__first == __last) 3008 return false; 3009 _BidirectionalIterator __i = __first; 3010 ++__i; 3011 if (__i == __last) 3012 return false; 3013 __i = __last; 3014 --__i; 3015 3016 for(;;) 3017 { 3018 _BidirectionalIterator __ii = __i; 3019 --__i; 3020 if (__comp(__ii, __i)) 3021 { 3022 _BidirectionalIterator __j = __last; 3023 while (!__comp(--__j, __i)) 3024 {} 3025 std::iter_swap(__i, __j); 3026 std::__reverse(__ii, __last, 3027 std::__iterator_category(__first)); 3028 return true; 3029 } 3030 if (__i == __first) 3031 { 3032 std::__reverse(__first, __last, 3033 std::__iterator_category(__first)); 3034 return false; 3035 } 3036 } 3037 } 3038 3039 /** 3040 * @brief Permute range into the previous @e dictionary ordering. 3041 * @ingroup sorting_algorithms 3042 * @param __first Start of range. 3043 * @param __last End of range. 3044 * @return False if wrapped to last permutation, true otherwise. 3045 * 3046 * Treats all permutations of the range as a set of @e dictionary sorted 3047 * sequences. Permutes the current sequence into the previous one of this 3048 * set. Returns true if there are more sequences to generate. If the 3049 * sequence is the smallest of the set, the largest is generated and false 3050 * returned. 3051 */ 3052 template
3053 _GLIBCXX20_CONSTEXPR 3054 inline bool 3055 prev_permutation(_BidirectionalIterator __first, 3056 _BidirectionalIterator __last) 3057 { 3058 // concept requirements 3059 __glibcxx_function_requires(_BidirectionalIteratorConcept< 3060 _BidirectionalIterator>) 3061 __glibcxx_function_requires(_LessThanComparableConcept< 3062 typename iterator_traits<_BidirectionalIterator>::value_type>) 3063 __glibcxx_requires_valid_range(__first, __last); 3064 __glibcxx_requires_irreflexive(__first, __last); 3065 3066 return std::__prev_permutation(__first, __last, 3067 __gnu_cxx::__ops::__iter_less_iter()); 3068 } 3069 3070 /** 3071 * @brief Permute range into the previous @e dictionary ordering using 3072 * comparison functor. 3073 * @ingroup sorting_algorithms 3074 * @param __first Start of range. 3075 * @param __last End of range. 3076 * @param __comp A comparison functor. 3077 * @return False if wrapped to last permutation, true otherwise. 3078 * 3079 * Treats all permutations of the range [__first,__last) as a set of 3080 * @e dictionary sorted sequences ordered by @p __comp. Permutes the current 3081 * sequence into the previous one of this set. Returns true if there are 3082 * more sequences to generate. If the sequence is the smallest of the set, 3083 * the largest is generated and false returned. 3084 */ 3085 template
3086 _GLIBCXX20_CONSTEXPR 3087 inline bool 3088 prev_permutation(_BidirectionalIterator __first, 3089 _BidirectionalIterator __last, _Compare __comp) 3090 { 3091 // concept requirements 3092 __glibcxx_function_requires(_BidirectionalIteratorConcept< 3093 _BidirectionalIterator>) 3094 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare, 3095 typename iterator_traits<_BidirectionalIterator>::value_type, 3096 typename iterator_traits<_BidirectionalIterator>::value_type>) 3097 __glibcxx_requires_valid_range(__first, __last); 3098 __glibcxx_requires_irreflexive_pred(__first, __last, __comp); 3099 3100 return std::__prev_permutation(__first, __last, 3101 __gnu_cxx::__ops::__iter_comp_iter(__comp)); 3102 } 3103 3104 // replace 3105 // replace_if 3106 3107 template
3109 _GLIBCXX20_CONSTEXPR 3110 _OutputIterator 3111 __replace_copy_if(_InputIterator __first, _InputIterator __last, 3112 _OutputIterator __result, 3113 _Predicate __pred, const _Tp& __new_value) 3114 { 3115 for (; __first != __last; ++__first, (void)++__result) 3116 if (__pred(__first)) 3117 *__result = __new_value; 3118 else 3119 *__result = *__first; 3120 return __result; 3121 } 3122 3123 /** 3124 * @brief Copy a sequence, replacing each element of one value with another 3125 * value. 3126 * @param __first An input iterator. 3127 * @param __last An input iterator. 3128 * @param __result An output iterator. 3129 * @param __old_value The value to be replaced. 3130 * @param __new_value The replacement value. 3131 * @return The end of the output sequence, @p result+(last-first). 3132 * 3133 * Copies each element in the input range @p [__first,__last) to the 3134 * output range @p [__result,__result+(__last-__first)) replacing elements 3135 * equal to @p __old_value with @p __new_value. 3136 */ 3137 template
3138 _GLIBCXX20_CONSTEXPR 3139 inline _OutputIterator 3140 replace_copy(_InputIterator __first, _InputIterator __last, 3141 _OutputIterator __result, 3142 const _Tp& __old_value, const _Tp& __new_value) 3143 { 3144 // concept requirements 3145 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>) 3146 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator, 3147 typename iterator_traits<_InputIterator>::value_type>) 3148 __glibcxx_function_requires(_EqualOpConcept< 3149 typename iterator_traits<_InputIterator>::value_type, _Tp>) 3150 __glibcxx_requires_valid_range(__first, __last); 3151 3152 return std::__replace_copy_if(__first, __last, __result, 3153 __gnu_cxx::__ops::__iter_equals_val(__old_value), 3154 __new_value); 3155 } 3156 3157 /** 3158 * @brief Copy a sequence, replacing each value for which a predicate 3159 * returns true with another value. 3160 * @ingroup mutating_algorithms 3161 * @param __first An input iterator. 3162 * @param __last An input iterator. 3163 * @param __result An output iterator. 3164 * @param __pred A predicate. 3165 * @param __new_value The replacement value. 3166 * @return The end of the output sequence, @p __result+(__last-__first). 3167 * 3168 * Copies each element in the range @p [__first,__last) to the range 3169 * @p [__result,__result+(__last-__first)) replacing elements for which 3170 * @p __pred returns true with @p __new_value. 3171 */ 3172 template
3174 _GLIBCXX20_CONSTEXPR 3175 inline _OutputIterator 3176 replace_copy_if(_InputIterator __first, _InputIterator __last, 3177 _OutputIterator __result, 3178 _Predicate __pred, const _Tp& __new_value) 3179 { 3180 // concept requirements 3181 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>) 3182 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator, 3183 typename iterator_traits<_InputIterator>::value_type>) 3184 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate, 3185 typename iterator_traits<_InputIterator>::value_type>) 3186 __glibcxx_requires_valid_range(__first, __last); 3187 3188 return std::__replace_copy_if(__first, __last, __result, 3189 __gnu_cxx::__ops::__pred_iter(__pred), 3190 __new_value); 3191 } 3192 3193 #if __cplusplus >= 201103L 3194 /** 3195 * @brief Determines whether the elements of a sequence are sorted. 3196 * @ingroup sorting_algorithms 3197 * @param __first An iterator. 3198 * @param __last Another iterator. 3199 * @return True if the elements are sorted, false otherwise. 3200 */ 3201 template
3202 _GLIBCXX20_CONSTEXPR 3203 inline bool 3204 is_sorted(_ForwardIterator __first, _ForwardIterator __last) 3205 { return std::is_sorted_until(__first, __last) == __last; } 3206 3207 /** 3208 * @brief Determines whether the elements of a sequence are sorted 3209 * according to a comparison functor. 3210 * @ingroup sorting_algorithms 3211 * @param __first An iterator. 3212 * @param __last Another iterator. 3213 * @param __comp A comparison functor. 3214 * @return True if the elements are sorted, false otherwise. 3215 */ 3216 template
3217 _GLIBCXX20_CONSTEXPR 3218 inline bool 3219 is_sorted(_ForwardIterator __first, _ForwardIterator __last, 3220 _Compare __comp) 3221 { return std::is_sorted_until(__first, __last, __comp) == __last; } 3222 3223 template
3224 _GLIBCXX20_CONSTEXPR 3225 _ForwardIterator 3226 __is_sorted_until(_ForwardIterator __first, _ForwardIterator __last, 3227 _Compare __comp) 3228 { 3229 if (__first == __last) 3230 return __last; 3231 3232 _ForwardIterator __next = __first; 3233 for (++__next; __next != __last; __first = __next, (void)++__next) 3234 if (__comp(__next, __first)) 3235 return __next; 3236 return __next; 3237 } 3238 3239 /** 3240 * @brief Determines the end of a sorted sequence. 3241 * @ingroup sorting_algorithms 3242 * @param __first An iterator. 3243 * @param __last Another iterator. 3244 * @return An iterator pointing to the last iterator i in [__first, __last) 3245 * for which the range [__first, i) is sorted. 3246 */ 3247 template
3248 _GLIBCXX20_CONSTEXPR 3249 inline _ForwardIterator 3250 is_sorted_until(_ForwardIterator __first, _ForwardIterator __last) 3251 { 3252 // concept requirements 3253 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>) 3254 __glibcxx_function_requires(_LessThanComparableConcept< 3255 typename iterator_traits<_ForwardIterator>::value_type>) 3256 __glibcxx_requires_valid_range(__first, __last); 3257 __glibcxx_requires_irreflexive(__first, __last); 3258 3259 return std::__is_sorted_until(__first, __last, 3260 __gnu_cxx::__ops::__iter_less_iter()); 3261 } 3262 3263 /** 3264 * @brief Determines the end of a sorted sequence using comparison functor. 3265 * @ingroup sorting_algorithms 3266 * @param __first An iterator. 3267 * @param __last Another iterator. 3268 * @param __comp A comparison functor. 3269 * @return An iterator pointing to the last iterator i in [__first, __last) 3270 * for which the range [__first, i) is sorted. 3271 */ 3272 template
3273 _GLIBCXX20_CONSTEXPR 3274 inline _ForwardIterator 3275 is_sorted_until(_ForwardIterator __first, _ForwardIterator __last, 3276 _Compare __comp) 3277 { 3278 // concept requirements 3279 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>) 3280 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare, 3281 typename iterator_traits<_ForwardIterator>::value_type, 3282 typename iterator_traits<_ForwardIterator>::value_type>) 3283 __glibcxx_requires_valid_range(__first, __last); 3284 __glibcxx_requires_irreflexive_pred(__first, __last, __comp); 3285 3286 return std::__is_sorted_until(__first, __last, 3287 __gnu_cxx::__ops::__iter_comp_iter(__comp)); 3288 } 3289 3290 /** 3291 * @brief Determines min and max at once as an ordered pair. 3292 * @ingroup sorting_algorithms 3293 * @param __a A thing of arbitrary type. 3294 * @param __b Another thing of arbitrary type. 3295 * @return A pair(__b, __a) if __b is smaller than __a, pair(__a, 3296 * __b) otherwise. 3297 */ 3298 template
3299 _GLIBCXX14_CONSTEXPR 3300 inline pair
3301 minmax(const _Tp& __a, const _Tp& __b) 3302 { 3303 // concept requirements 3304 __glibcxx_function_requires(_LessThanComparableConcept<_Tp>) 3305 3306 return __b < __a ? pair
(__b, __a) 3307 : pair
(__a, __b); 3308 } 3309 3310 /** 3311 * @brief Determines min and max at once as an ordered pair. 3312 * @ingroup sorting_algorithms 3313 * @param __a A thing of arbitrary type. 3314 * @param __b Another thing of arbitrary type. 3315 * @param __comp A @link comparison_functors comparison functor @endlink. 3316 * @return A pair(__b, __a) if __b is smaller than __a, pair(__a, 3317 * __b) otherwise. 3318 */ 3319 template
3320 _GLIBCXX14_CONSTEXPR 3321 inline pair
3322 minmax(const _Tp& __a, const _Tp& __b, _Compare __comp) 3323 { 3324 return __comp(__b, __a) ? pair
(__b, __a) 3325 : pair
(__a, __b); 3326 } 3327 3328 template
3329 _GLIBCXX14_CONSTEXPR 3330 pair<_ForwardIterator, _ForwardIterator> 3331 __minmax_element(_ForwardIterator __first, _ForwardIterator __last, 3332 _Compare __comp) 3333 { 3334 _ForwardIterator __next = __first; 3335 if (__first == __last 3336 || ++__next == __last) 3337 return std::make_pair(__first, __first); 3338 3339 _ForwardIterator __min{}, __max{}; 3340 if (__comp(__next, __first)) 3341 { 3342 __min = __next; 3343 __max = __first; 3344 } 3345 else 3346 { 3347 __min = __first; 3348 __max = __next; 3349 } 3350 3351 __first = __next; 3352 ++__first; 3353 3354 while (__first != __last) 3355 { 3356 __next = __first; 3357 if (++__next == __last) 3358 { 3359 if (__comp(__first, __min)) 3360 __min = __first; 3361 else if (!__comp(__first, __max)) 3362 __max = __first; 3363 break; 3364 } 3365 3366 if (__comp(__next, __first)) 3367 { 3368 if (__comp(__next, __min)) 3369 __min = __next; 3370 if (!__comp(__first, __max)) 3371 __max = __first; 3372 } 3373 else 3374 { 3375 if (__comp(__first, __min)) 3376 __min = __first; 3377 if (!__comp(__next, __max)) 3378 __max = __next; 3379 } 3380 3381 __first = __next; 3382 ++__first; 3383 } 3384 3385 return std::make_pair(__min, __max); 3386 } 3387 3388 /** 3389 * @brief Return a pair of iterators pointing to the minimum and maximum 3390 * elements in a range. 3391 * @ingroup sorting_algorithms 3392 * @param __first Start of range. 3393 * @param __last End of range. 3394 * @return make_pair(m, M), where m is the first iterator i in 3395 * [__first, __last) such that no other element in the range is 3396 * smaller, and where M is the last iterator i in [__first, __last) 3397 * such that no other element in the range is larger. 3398 */ 3399 template
3400 _GLIBCXX14_CONSTEXPR 3401 inline pair<_ForwardIterator, _ForwardIterator> 3402 minmax_element(_ForwardIterator __first, _ForwardIterator __last) 3403 { 3404 // concept requirements 3405 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>) 3406 __glibcxx_function_requires(_LessThanComparableConcept< 3407 typename iterator_traits<_ForwardIterator>::value_type>) 3408 __glibcxx_requires_valid_range(__first, __last); 3409 __glibcxx_requires_irreflexive(__first, __last); 3410 3411 return std::__minmax_element(__first, __last, 3412 __gnu_cxx::__ops::__iter_less_iter()); 3413 } 3414 3415 /** 3416 * @brief Return a pair of iterators pointing to the minimum and maximum 3417 * elements in a range. 3418 * @ingroup sorting_algorithms 3419 * @param __first Start of range. 3420 * @param __last End of range. 3421 * @param __comp Comparison functor. 3422 * @return make_pair(m, M), where m is the first iterator i in 3423 * [__first, __last) such that no other element in the range is 3424 * smaller, and where M is the last iterator i in [__first, __last) 3425 * such that no other element in the range is larger. 3426 */ 3427 template
3428 _GLIBCXX14_CONSTEXPR 3429 inline pair<_ForwardIterator, _ForwardIterator> 3430 minmax_element(_ForwardIterator __first, _ForwardIterator __last, 3431 _Compare __comp) 3432 { 3433 // concept requirements 3434 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>) 3435 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare, 3436 typename iterator_traits<_ForwardIterator>::value_type, 3437 typename iterator_traits<_ForwardIterator>::value_type>) 3438 __glibcxx_requires_valid_range(__first, __last); 3439 __glibcxx_requires_irreflexive_pred(__first, __last, __comp); 3440 3441 return std::__minmax_element(__first, __last, 3442 __gnu_cxx::__ops::__iter_comp_iter(__comp)); 3443 } 3444 3445 // N2722 + DR 915. 3446 template
3447 _GLIBCXX14_CONSTEXPR 3448 inline _Tp 3449 min(initializer_list<_Tp> __l) 3450 { return *std::min_element(__l.begin(), __l.end()); } 3451 3452 template
3453 _GLIBCXX14_CONSTEXPR 3454 inline _Tp 3455 min(initializer_list<_Tp> __l, _Compare __comp) 3456 { return *std::min_element(__l.begin(), __l.end(), __comp); } 3457 3458 template
3459 _GLIBCXX14_CONSTEXPR 3460 inline _Tp 3461 max(initializer_list<_Tp> __l) 3462 { return *std::max_element(__l.begin(), __l.end()); } 3463 3464 template
3465 _GLIBCXX14_CONSTEXPR 3466 inline _Tp 3467 max(initializer_list<_Tp> __l, _Compare __comp) 3468 { return *std::max_element(__l.begin(), __l.end(), __comp); } 3469 3470 template
3471 _GLIBCXX14_CONSTEXPR 3472 inline pair<_Tp, _Tp> 3473 minmax(initializer_list<_Tp> __l) 3474 { 3475 pair
__p = 3476 std::minmax_element(__l.begin(), __l.end()); 3477 return std::make_pair(*__p.first, *__p.second); 3478 } 3479 3480 template
3481 _GLIBCXX14_CONSTEXPR 3482 inline pair<_Tp, _Tp> 3483 minmax(initializer_list<_Tp> __l, _Compare __comp) 3484 { 3485 pair
__p = 3486 std::minmax_element(__l.begin(), __l.end(), __comp); 3487 return std::make_pair(*__p.first, *__p.second); 3488 } 3489 3490 /** 3491 * @brief Checks whether a permutation of the second sequence is equal 3492 * to the first sequence. 3493 * @ingroup non_mutating_algorithms 3494 * @param __first1 Start of first range. 3495 * @param __last1 End of first range. 3496 * @param __first2 Start of second range. 3497 * @param __pred A binary predicate. 3498 * @return true if there exists a permutation of the elements in 3499 * the range [__first2, __first2 + (__last1 - __first1)), 3500 * beginning with ForwardIterator2 begin, such that 3501 * equal(__first1, __last1, __begin, __pred) returns true; 3502 * otherwise, returns false. 3503 */ 3504 template
3506 _GLIBCXX20_CONSTEXPR 3507 inline bool 3508 is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1, 3509 _ForwardIterator2 __first2, _BinaryPredicate __pred) 3510 { 3511 // concept requirements 3512 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>) 3513 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>) 3514 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate, 3515 typename iterator_traits<_ForwardIterator1>::value_type, 3516 typename iterator_traits<_ForwardIterator2>::value_type>) 3517 __glibcxx_requires_valid_range(__first1, __last1); 3518 3519 return std::__is_permutation(__first1, __last1, __first2, 3520 __gnu_cxx::__ops::__iter_comp_iter(__pred)); 3521 } 3522 3523 #if __cplusplus > 201103L 3524 template
3526 _GLIBCXX20_CONSTEXPR 3527 bool 3528 __is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1, 3529 _ForwardIterator2 __first2, _ForwardIterator2 __last2, 3530 _BinaryPredicate __pred) 3531 { 3532 using _Cat1 3533 = typename iterator_traits<_ForwardIterator1>::iterator_category; 3534 using _Cat2 3535 = typename iterator_traits<_ForwardIterator2>::iterator_category; 3536 using _It1_is_RA = is_same<_Cat1, random_access_iterator_tag>; 3537 using _It2_is_RA = is_same<_Cat2, random_access_iterator_tag>; 3538 constexpr bool __ra_iters = _It1_is_RA() && _It2_is_RA(); 3539 if (__ra_iters) 3540 { 3541 auto __d1 = std::distance(__first1, __last1); 3542 auto __d2 = std::distance(__first2, __last2); 3543 if (__d1 != __d2) 3544 return false; 3545 } 3546 3547 // Efficiently compare identical prefixes: O(N) if sequences 3548 // have the same elements in the same order. 3549 for (; __first1 != __last1 && __first2 != __last2; 3550 ++__first1, (void)++__first2) 3551 if (!__pred(__first1, __first2)) 3552 break; 3553 3554 if (__ra_iters) 3555 { 3556 if (__first1 == __last1) 3557 return true; 3558 } 3559 else 3560 { 3561 auto __d1 = std::distance(__first1, __last1); 3562 auto __d2 = std::distance(__first2, __last2); 3563 if (__d1 == 0 && __d2 == 0) 3564 return true; 3565 if (__d1 != __d2) 3566 return false; 3567 } 3568 3569 for (_ForwardIterator1 __scan = __first1; __scan != __last1; ++__scan) 3570 { 3571 if (__scan != std::__find_if(__first1, __scan, 3572 __gnu_cxx::__ops::__iter_comp_iter(__pred, __scan))) 3573 continue; // We've seen this one before. 3574 3575 auto __matches = std::__count_if(__first2, __last2, 3576 __gnu_cxx::__ops::__iter_comp_iter(__pred, __scan)); 3577 if (0 == __matches 3578 || std::__count_if(__scan, __last1, 3579 __gnu_cxx::__ops::__iter_comp_iter(__pred, __scan)) 3580 != __matches) 3581 return false; 3582 } 3583 return true; 3584 } 3585 3586 /** 3587 * @brief Checks whether a permutaion of the second sequence is equal 3588 * to the first sequence. 3589 * @ingroup non_mutating_algorithms 3590 * @param __first1 Start of first range. 3591 * @param __last1 End of first range. 3592 * @param __first2 Start of second range. 3593 * @param __last2 End of first range. 3594 * @return true if there exists a permutation of the elements in the range 3595 * [__first2, __last2), beginning with ForwardIterator2 begin, 3596 * such that equal(__first1, __last1, begin) returns true; 3597 * otherwise, returns false. 3598 */ 3599 template
3600 _GLIBCXX20_CONSTEXPR 3601 inline bool 3602 is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1, 3603 _ForwardIterator2 __first2, _ForwardIterator2 __last2) 3604 { 3605 __glibcxx_requires_valid_range(__first1, __last1); 3606 __glibcxx_requires_valid_range(__first2, __last2); 3607 3608 return 3609 std::__is_permutation(__first1, __last1, __first2, __last2, 3610 __gnu_cxx::__ops::__iter_equal_to_iter()); 3611 } 3612 3613 /** 3614 * @brief Checks whether a permutation of the second sequence is equal 3615 * to the first sequence. 3616 * @ingroup non_mutating_algorithms 3617 * @param __first1 Start of first range. 3618 * @param __last1 End of first range. 3619 * @param __first2 Start of second range. 3620 * @param __last2 End of first range. 3621 * @param __pred A binary predicate. 3622 * @return true if there exists a permutation of the elements in the range 3623 * [__first2, __last2), beginning with ForwardIterator2 begin, 3624 * such that equal(__first1, __last1, __begin, __pred) returns true; 3625 * otherwise, returns false. 3626 */ 3627 template
3629 _GLIBCXX20_CONSTEXPR 3630 inline bool 3631 is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1, 3632 _ForwardIterator2 __first2, _ForwardIterator2 __last2, 3633 _BinaryPredicate __pred) 3634 { 3635 __glibcxx_requires_valid_range(__first1, __last1); 3636 __glibcxx_requires_valid_range(__first2, __last2); 3637 3638 return std::__is_permutation(__first1, __last1, __first2, __last2, 3639 __gnu_cxx::__ops::__iter_comp_iter(__pred)); 3640 } 3641 3642 #if __cplusplus > 201402L 3643 3644 #define __cpp_lib_clamp 201603 3645 3646 /** 3647 * @brief Returns the value clamped between lo and hi. 3648 * @ingroup sorting_algorithms 3649 * @param __val A value of arbitrary type. 3650 * @param __lo A lower limit of arbitrary type. 3651 * @param __hi An upper limit of arbitrary type. 3652 * @return max(__val, __lo) if __val < __hi or min(__val, __hi) otherwise. 3653 */ 3654 template
3655 constexpr const _Tp& 3656 clamp(const _Tp& __val, const _Tp& __lo, const _Tp& __hi) 3657 { 3658 __glibcxx_assert(!(__hi < __lo)); 3659 return (__val < __lo) ? __lo : (__hi < __val) ? __hi : __val; 3660 } 3661 3662 /** 3663 * @brief Returns the value clamped between lo and hi. 3664 * @ingroup sorting_algorithms 3665 * @param __val A value of arbitrary type. 3666 * @param __lo A lower limit of arbitrary type. 3667 * @param __hi An upper limit of arbitrary type. 3668 * @param __comp A comparison functor. 3669 * @return max(__val, __lo, __comp) if __comp(__val, __hi) 3670 * or min(__val, __hi, __comp) otherwise. 3671 */ 3672 template
3673 constexpr const _Tp& 3674 clamp(const _Tp& __val, const _Tp& __lo, const _Tp& __hi, _Compare __comp) 3675 { 3676 __glibcxx_assert(!__comp(__hi, __lo)); 3677 return __comp(__val, __lo) ? __lo : __comp(__hi, __val) ? __hi : __val; 3678 } 3679 #endif // C++17 3680 #endif // C++14 3681 3682 #ifdef _GLIBCXX_USE_C99_STDINT_TR1 3683 /** 3684 * @brief Generate two uniformly distributed integers using a 3685 * single distribution invocation. 3686 * @param __b0 The upper bound for the first integer. 3687 * @param __b1 The upper bound for the second integer. 3688 * @param __g A UniformRandomBitGenerator. 3689 * @return A pair (i, j) with i and j uniformly distributed 3690 * over [0, __b0) and [0, __b1), respectively. 3691 * 3692 * Requires: __b0 * __b1 <= __g.max() - __g.min(). 3693 * 3694 * Using uniform_int_distribution with a range that is very 3695 * small relative to the range of the generator ends up wasting 3696 * potentially expensively generated randomness, since 3697 * uniform_int_distribution does not store leftover randomness 3698 * between invocations. 3699 * 3700 * If we know we want two integers in ranges that are sufficiently 3701 * small, we can compose the ranges, use a single distribution 3702 * invocation, and significantly reduce the waste. 3703 */ 3704 template
3705 pair<_IntType, _IntType> 3706 __gen_two_uniform_ints(_IntType __b0, _IntType __b1, 3707 _UniformRandomBitGenerator&& __g) 3708 { 3709 _IntType __x 3710 = uniform_int_distribution<_IntType>{0, (__b0 * __b1) - 1}(__g); 3711 return std::make_pair(__x / __b1, __x % __b1); 3712 } 3713 3714 /** 3715 * @brief Shuffle the elements of a sequence using a uniform random 3716 * number generator. 3717 * @ingroup mutating_algorithms 3718 * @param __first A forward iterator. 3719 * @param __last A forward iterator. 3720 * @param __g A UniformRandomNumberGenerator (26.5.1.3). 3721 * @return Nothing. 3722 * 3723 * Reorders the elements in the range @p [__first,__last) using @p __g to 3724 * provide random numbers. 3725 */ 3726 template
3728 void 3729 shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last, 3730 _UniformRandomNumberGenerator&& __g) 3731 { 3732 // concept requirements 3733 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept< 3734 _RandomAccessIterator>) 3735 __glibcxx_requires_valid_range(__first, __last); 3736 3737 if (__first == __last) 3738 return; 3739 3740 typedef typename iterator_traits<_RandomAccessIterator>::difference_type 3741 _DistanceType; 3742 3743 typedef typename std::make_unsigned<_DistanceType>::type __ud_type; 3744 typedef typename std::uniform_int_distribution<__ud_type> __distr_type; 3745 typedef typename __distr_type::param_type __p_type; 3746 3747 typedef typename remove_reference<_UniformRandomNumberGenerator>::type 3748 _Gen; 3749 typedef typename common_type
::type 3750 __uc_type; 3751 3752 const __uc_type __urngrange = __g.max() - __g.min(); 3753 const __uc_type __urange = __uc_type(__last - __first); 3754 3755 if (__urngrange / __urange >= __urange) 3756 // I.e. (__urngrange >= __urange * __urange) but without wrap issues. 3757 { 3758 _RandomAccessIterator __i = __first + 1; 3759 3760 // Since we know the range isn't empty, an even number of elements 3761 // means an uneven number of elements /to swap/, in which case we 3762 // do the first one up front: 3763 3764 if ((__urange % 2) == 0) 3765 { 3766 __distr_type __d{0, 1}; 3767 std::iter_swap(__i++, __first + __d(__g)); 3768 } 3769 3770 // Now we know that __last - __i is even, so we do the rest in pairs, 3771 // using a single distribution invocation to produce swap positions 3772 // for two successive elements at a time: 3773 3774 while (__i != __last) 3775 { 3776 const __uc_type __swap_range = __uc_type(__i - __first) + 1; 3777 3778 const pair<__uc_type, __uc_type> __pospos = 3779 __gen_two_uniform_ints(__swap_range, __swap_range + 1, __g); 3780 3781 std::iter_swap(__i++, __first + __pospos.first); 3782 std::iter_swap(__i++, __first + __pospos.second); 3783 } 3784 3785 return; 3786 } 3787 3788 __distr_type __d; 3789 3790 for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i) 3791 std::iter_swap(__i, __first + __d(__g, __p_type(0, __i - __first))); 3792 } 3793 #endif 3794 3795 #endif // C++11 3796 3797 _GLIBCXX_BEGIN_NAMESPACE_ALGO 3798 3799 /** 3800 * @brief Apply a function to every element of a sequence. 3801 * @ingroup non_mutating_algorithms 3802 * @param __first An input iterator. 3803 * @param __last An input iterator. 3804 * @param __f A unary function object. 3805 * @return @p __f 3806 * 3807 * Applies the function object @p __f to each element in the range 3808 * @p [first,last). @p __f must not modify the order of the sequence. 3809 * If @p __f has a return value it is ignored. 3810 */ 3811 template
3812 _GLIBCXX20_CONSTEXPR 3813 _Function 3814 for_each(_InputIterator __first, _InputIterator __last, _Function __f) 3815 { 3816 // concept requirements 3817 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>) 3818 __glibcxx_requires_valid_range(__first, __last); 3819 for (; __first != __last; ++__first) 3820 __f(*__first); 3821 return __f; // N.B. [alg.foreach] says std::move(f) but it's redundant. 3822 } 3823 3824 #if __cplusplus >= 201703L 3825 /** 3826 * @brief Apply a function to every element of a sequence. 3827 * @ingroup non_mutating_algorithms 3828 * @param __first An input iterator. 3829 * @param __n A value convertible to an integer. 3830 * @param __f A unary function object. 3831 * @return `__first+__n` 3832 * 3833 * Applies the function object `__f` to each element in the range 3834 * `[first, first+n)`. `__f` must not modify the order of the sequence. 3835 * If `__f` has a return value it is ignored. 3836 */ 3837 template
3838 _GLIBCXX20_CONSTEXPR 3839 _InputIterator 3840 for_each_n(_InputIterator __first, _Size __n, _Function __f) 3841 { 3842 auto __n2 = std::__size_to_integer(__n); 3843 using _Cat = typename iterator_traits<_InputIterator>::iterator_category; 3844 if constexpr (is_base_of_v
) 3845 { 3846 if (__n2 <= 0) 3847 return __first; 3848 auto __last = __first + __n2; 3849 std::for_each(__first, __last, std::move(__f)); 3850 return __last; 3851 } 3852 else 3853 { 3854 while (__n2-->0) 3855 { 3856 __f(*__first); 3857 ++__first; 3858 } 3859 return __first; 3860 } 3861 } 3862 #endif // C++17 3863 3864 /** 3865 * @brief Find the first occurrence of a value in a sequence. 3866 * @ingroup non_mutating_algorithms 3867 * @param __first An input iterator. 3868 * @param __last An input iterator. 3869 * @param __val The value to find. 3870 * @return The first iterator @c i in the range @p [__first,__last) 3871 * such that @c *i == @p __val, or @p __last if no such iterator exists. 3872 */ 3873 template
3874 _GLIBCXX20_CONSTEXPR 3875 inline _InputIterator 3876 find(_InputIterator __first, _InputIterator __last, 3877 const _Tp& __val) 3878 { 3879 // concept requirements 3880 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>) 3881 __glibcxx_function_requires(_EqualOpConcept< 3882 typename iterator_traits<_InputIterator>::value_type, _Tp>) 3883 __glibcxx_requires_valid_range(__first, __last); 3884 return std::__find_if(__first, __last, 3885 __gnu_cxx::__ops::__iter_equals_val(__val)); 3886 } 3887 3888 /** 3889 * @brief Find the first element in a sequence for which a 3890 * predicate is true. 3891 * @ingroup non_mutating_algorithms 3892 * @param __first An input iterator. 3893 * @param __last An input iterator. 3894 * @param __pred A predicate. 3895 * @return The first iterator @c i in the range @p [__first,__last) 3896 * such that @p __pred(*i) is true, or @p __last if no such iterator exists. 3897 */ 3898 template
3899 _GLIBCXX20_CONSTEXPR 3900 inline _InputIterator 3901 find_if(_InputIterator __first, _InputIterator __last, 3902 _Predicate __pred) 3903 { 3904 // concept requirements 3905 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>) 3906 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate, 3907 typename iterator_traits<_InputIterator>::value_type>) 3908 __glibcxx_requires_valid_range(__first, __last); 3909 3910 return std::__find_if(__first, __last, 3911 __gnu_cxx::__ops::__pred_iter(__pred)); 3912 } 3913 3914 /** 3915 * @brief Find element from a set in a sequence. 3916 * @ingroup non_mutating_algorithms 3917 * @param __first1 Start of range to search. 3918 * @param __last1 End of range to search. 3919 * @param __first2 Start of match candidates. 3920 * @param __last2 End of match candidates. 3921 * @return The first iterator @c i in the range 3922 * @p [__first1,__last1) such that @c *i == @p *(i2) such that i2 is an 3923 * iterator in [__first2,__last2), or @p __last1 if no such iterator exists. 3924 * 3925 * Searches the range @p [__first1,__last1) for an element that is 3926 * equal to some element in the range [__first2,__last2). If 3927 * found, returns an iterator in the range [__first1,__last1), 3928 * otherwise returns @p __last1. 3929 */ 3930 template
3931 _GLIBCXX20_CONSTEXPR 3932 _InputIterator 3933 find_first_of(_InputIterator __first1, _InputIterator __last1, 3934 _ForwardIterator __first2, _ForwardIterator __last2) 3935 { 3936 // concept requirements 3937 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>) 3938 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>) 3939 __glibcxx_function_requires(_EqualOpConcept< 3940 typename iterator_traits<_InputIterator>::value_type, 3941 typename iterator_traits<_ForwardIterator>::value_type>) 3942 __glibcxx_requires_valid_range(__first1, __last1); 3943 __glibcxx_requires_valid_range(__first2, __last2); 3944 3945 for (; __first1 != __last1; ++__first1) 3946 for (_ForwardIterator __iter = __first2; __iter != __last2; ++__iter) 3947 if (*__first1 == *__iter) 3948 return __first1; 3949 return __last1; 3950 } 3951 3952 /** 3953 * @brief Find element from a set in a sequence using a predicate. 3954 * @ingroup non_mutating_algorithms 3955 * @param __first1 Start of range to search. 3956 * @param __last1 End of range to search. 3957 * @param __first2 Start of match candidates. 3958 * @param __last2 End of match candidates. 3959 * @param __comp Predicate to use. 3960 * @return The first iterator @c i in the range 3961 * @p [__first1,__last1) such that @c comp(*i, @p *(i2)) is true 3962 * and i2 is an iterator in [__first2,__last2), or @p __last1 if no 3963 * such iterator exists. 3964 * 3965 3966 * Searches the range @p [__first1,__last1) for an element that is 3967 * equal to some element in the range [__first2,__last2). If 3968 * found, returns an iterator in the range [__first1,__last1), 3969 * otherwise returns @p __last1. 3970 */ 3971 template
3973 _GLIBCXX20_CONSTEXPR 3974 _InputIterator 3975 find_first_of(_InputIterator __first1, _InputIterator __last1, 3976 _ForwardIterator __first2, _ForwardIterator __last2, 3977 _BinaryPredicate __comp) 3978 { 3979 // concept requirements 3980 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>) 3981 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>) 3982 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate, 3983 typename iterator_traits<_InputIterator>::value_type, 3984 typename iterator_traits<_ForwardIterator>::value_type>) 3985 __glibcxx_requires_valid_range(__first1, __last1); 3986 __glibcxx_requires_valid_range(__first2, __last2); 3987 3988 for (; __first1 != __last1; ++__first1) 3989 for (_ForwardIterator __iter = __first2; __iter != __last2; ++__iter) 3990 if (__comp(*__first1, *__iter)) 3991 return __first1; 3992 return __last1; 3993 } 3994 3995 /** 3996 * @brief Find two adjacent values in a sequence that are equal. 3997 * @ingroup non_mutating_algorithms 3998 * @param __first A forward iterator. 3999 * @param __last A forward iterator. 4000 * @return The first iterator @c i such that @c i and @c i+1 are both 4001 * valid iterators in @p [__first,__last) and such that @c *i == @c *(i+1), 4002 * or @p __last if no such iterator exists. 4003 */ 4004 template
4005 _GLIBCXX20_CONSTEXPR 4006 inline _ForwardIterator 4007 adjacent_find(_ForwardIterator __first, _ForwardIterator __last) 4008 { 4009 // concept requirements 4010 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>) 4011 __glibcxx_function_requires(_EqualityComparableConcept< 4012 typename iterator_traits<_ForwardIterator>::value_type>) 4013 __glibcxx_requires_valid_range(__first, __last); 4014 4015 return std::__adjacent_find(__first, __last, 4016 __gnu_cxx::__ops::__iter_equal_to_iter()); 4017 } 4018 4019 /** 4020 * @brief Find two adjacent values in a sequence using a predicate. 4021 * @ingroup non_mutating_algorithms 4022 * @param __first A forward iterator. 4023 * @param __last A forward iterator. 4024 * @param __binary_pred A binary predicate. 4025 * @return The first iterator @c i such that @c i and @c i+1 are both 4026 * valid iterators in @p [__first,__last) and such that 4027 * @p __binary_pred(*i,*(i+1)) is true, or @p __last if no such iterator 4028 * exists. 4029 */ 4030 template
4031 _GLIBCXX20_CONSTEXPR 4032 inline _ForwardIterator 4033 adjacent_find(_ForwardIterator __first, _ForwardIterator __last, 4034 _BinaryPredicate __binary_pred) 4035 { 4036 // concept requirements 4037 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>) 4038 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate, 4039 typename iterator_traits<_ForwardIterator>::value_type, 4040 typename iterator_traits<_ForwardIterator>::value_type>) 4041 __glibcxx_requires_valid_range(__first, __last); 4042 4043 return std::__adjacent_find(__first, __last, 4044 __gnu_cxx::__ops::__iter_comp_iter(__binary_pred)); 4045 } 4046 4047 /** 4048 * @brief Count the number of copies of a value in a sequence. 4049 * @ingroup non_mutating_algorithms 4050 * @param __first An input iterator. 4051 * @param __last An input iterator. 4052 * @param __value The value to be counted. 4053 * @return The number of iterators @c i in the range @p [__first,__last) 4054 * for which @c *i == @p __value 4055 */ 4056 template
4057 _GLIBCXX20_CONSTEXPR 4058 inline typename iterator_traits<_InputIterator>::difference_type 4059 count(_InputIterator __first, _InputIterator __last, const _Tp& __value) 4060 { 4061 // concept requirements 4062 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>) 4063 __glibcxx_function_requires(_EqualOpConcept< 4064 typename iterator_traits<_InputIterator>::value_type, _Tp>) 4065 __glibcxx_requires_valid_range(__first, __last); 4066 4067 return std::__count_if(__first, __last, 4068 __gnu_cxx::__ops::__iter_equals_val(__value)); 4069 } 4070 4071 /** 4072 * @brief Count the elements of a sequence for which a predicate is true. 4073 * @ingroup non_mutating_algorithms 4074 * @param __first An input iterator. 4075 * @param __last An input iterator. 4076 * @param __pred A predicate. 4077 * @return The number of iterators @c i in the range @p [__first,__last) 4078 * for which @p __pred(*i) is true. 4079 */ 4080 template
4081 _GLIBCXX20_CONSTEXPR 4082 inline typename iterator_traits<_InputIterator>::difference_type 4083 count_if(_InputIterator __first, _InputIterator __last, _Predicate __pred) 4084 { 4085 // concept requirements 4086 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>) 4087 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate, 4088 typename iterator_traits<_InputIterator>::value_type>) 4089 __glibcxx_requires_valid_range(__first, __last); 4090 4091 return std::__count_if(__first, __last, 4092 __gnu_cxx::__ops::__pred_iter(__pred)); 4093 } 4094 4095 /** 4096 * @brief Search a sequence for a matching sub-sequence. 4097 * @ingroup non_mutating_algorithms 4098 * @param __first1 A forward iterator. 4099 * @param __last1 A forward iterator. 4100 * @param __first2 A forward iterator. 4101 * @param __last2 A forward iterator. 4102 * @return The first iterator @c i in the range @p 4103 * [__first1,__last1-(__last2-__first2)) such that @c *(i+N) == @p 4104 * *(__first2+N) for each @c N in the range @p 4105 * [0,__last2-__first2), or @p __last1 if no such iterator exists. 4106 * 4107 * Searches the range @p [__first1,__last1) for a sub-sequence that 4108 * compares equal value-by-value with the sequence given by @p 4109 * [__first2,__last2) and returns an iterator to the first element 4110 * of the sub-sequence, or @p __last1 if the sub-sequence is not 4111 * found. 4112 * 4113 * Because the sub-sequence must lie completely within the range @p 4114 * [__first1,__last1) it must start at a position less than @p 4115 * __last1-(__last2-__first2) where @p __last2-__first2 is the 4116 * length of the sub-sequence. 4117 * 4118 * This means that the returned iterator @c i will be in the range 4119 * @p [__first1,__last1-(__last2-__first2)) 4120 */ 4121 template
4122 _GLIBCXX20_CONSTEXPR 4123 inline _ForwardIterator1 4124 search(_ForwardIterator1 __first1, _ForwardIterator1 __last1, 4125 _ForwardIterator2 __first2, _ForwardIterator2 __last2) 4126 { 4127 // concept requirements 4128 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>) 4129 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>) 4130 __glibcxx_function_requires(_EqualOpConcept< 4131 typename iterator_traits<_ForwardIterator1>::value_type, 4132 typename iterator_traits<_ForwardIterator2>::value_type>) 4133 __glibcxx_requires_valid_range(__first1, __last1); 4134 __glibcxx_requires_valid_range(__first2, __last2); 4135 4136 return std::__search(__first1, __last1, __first2, __last2, 4137 __gnu_cxx::__ops::__iter_equal_to_iter()); 4138 } 4139 4140 /** 4141 * @brief Search a sequence for a matching sub-sequence using a predicate. 4142 * @ingroup non_mutating_algorithms 4143 * @param __first1 A forward iterator. 4144 * @param __last1 A forward iterator. 4145 * @param __first2 A forward iterator. 4146 * @param __last2 A forward iterator. 4147 * @param __predicate A binary predicate. 4148 * @return The first iterator @c i in the range 4149 * @p [__first1,__last1-(__last2-__first2)) such that 4150 * @p __predicate(*(i+N),*(__first2+N)) is true for each @c N in the range 4151 * @p [0,__last2-__first2), or @p __last1 if no such iterator exists. 4152 * 4153 * Searches the range @p [__first1,__last1) for a sub-sequence that 4154 * compares equal value-by-value with the sequence given by @p 4155 * [__first2,__last2), using @p __predicate to determine equality, 4156 * and returns an iterator to the first element of the 4157 * sub-sequence, or @p __last1 if no such iterator exists. 4158 * 4159 * @see search(_ForwardIter1, _ForwardIter1, _ForwardIter2, _ForwardIter2) 4160 */ 4161 template
4163 _GLIBCXX20_CONSTEXPR 4164 inline _ForwardIterator1 4165 search(_ForwardIterator1 __first1, _ForwardIterator1 __last1, 4166 _ForwardIterator2 __first2, _ForwardIterator2 __last2, 4167 _BinaryPredicate __predicate) 4168 { 4169 // concept requirements 4170 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>) 4171 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>) 4172 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate, 4173 typename iterator_traits<_ForwardIterator1>::value_type, 4174 typename iterator_traits<_ForwardIterator2>::value_type>) 4175 __glibcxx_requires_valid_range(__first1, __last1); 4176 __glibcxx_requires_valid_range(__first2, __last2); 4177 4178 return std::__search(__first1, __last1, __first2, __last2, 4179 __gnu_cxx::__ops::__iter_comp_iter(__predicate)); 4180 } 4181 4182 /** 4183 * @brief Search a sequence for a number of consecutive values. 4184 * @ingroup non_mutating_algorithms 4185 * @param __first A forward iterator. 4186 * @param __last A forward iterator. 4187 * @param __count The number of consecutive values. 4188 * @param __val The value to find. 4189 * @return The first iterator @c i in the range @p 4190 * [__first,__last-__count) such that @c *(i+N) == @p __val for 4191 * each @c N in the range @p [0,__count), or @p __last if no such 4192 * iterator exists. 4193 * 4194 * Searches the range @p [__first,__last) for @p count consecutive elements 4195 * equal to @p __val. 4196 */ 4197 template
4198 _GLIBCXX20_CONSTEXPR 4199 inline _ForwardIterator 4200 search_n(_ForwardIterator __first, _ForwardIterator __last, 4201 _Integer __count, const _Tp& __val) 4202 { 4203 // concept requirements 4204 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>) 4205 __glibcxx_function_requires(_EqualOpConcept< 4206 typename iterator_traits<_ForwardIterator>::value_type, _Tp>) 4207 __glibcxx_requires_valid_range(__first, __last); 4208 4209 return std::__search_n(__first, __last, __count, 4210 __gnu_cxx::__ops::__iter_equals_val(__val)); 4211 } 4212 4213 4214 /** 4215 * @brief Search a sequence for a number of consecutive values using a 4216 * predicate. 4217 * @ingroup non_mutating_algorithms 4218 * @param __first A forward iterator. 4219 * @param __last A forward iterator. 4220 * @param __count The number of consecutive values. 4221 * @param __val The value to find. 4222 * @param __binary_pred A binary predicate. 4223 * @return The first iterator @c i in the range @p 4224 * [__first,__last-__count) such that @p 4225 * __binary_pred(*(i+N),__val) is true for each @c N in the range 4226 * @p [0,__count), or @p __last if no such iterator exists. 4227 * 4228 * Searches the range @p [__first,__last) for @p __count 4229 * consecutive elements for which the predicate returns true. 4230 */ 4231 template
4233 _GLIBCXX20_CONSTEXPR 4234 inline _ForwardIterator 4235 search_n(_ForwardIterator __first, _ForwardIterator __last, 4236 _Integer __count, const _Tp& __val, 4237 _BinaryPredicate __binary_pred) 4238 { 4239 // concept requirements 4240 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>) 4241 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate, 4242 typename iterator_traits<_ForwardIterator>::value_type, _Tp>) 4243 __glibcxx_requires_valid_range(__first, __last); 4244 4245 return std::__search_n(__first, __last, __count, 4246 __gnu_cxx::__ops::__iter_comp_val(__binary_pred, __val)); 4247 } 4248 4249 #if __cplusplus >= 201703L 4250 /** @brief Search a sequence using a Searcher object. 4251 * 4252 * @param __first A forward iterator. 4253 * @param __last A forward iterator. 4254 * @param __searcher A callable object. 4255 * @return @p __searcher(__first,__last).first 4256 */ 4257 template
4258 _GLIBCXX20_CONSTEXPR 4259 inline _ForwardIterator 4260 search(_ForwardIterator __first, _ForwardIterator __last, 4261 const _Searcher& __searcher) 4262 { return __searcher(__first, __last).first; } 4263 #endif 4264 4265 /** 4266 * @brief Perform an operation on a sequence. 4267 * @ingroup mutating_algorithms 4268 * @param __first An input iterator. 4269 * @param __last An input iterator. 4270 * @param __result An output iterator. 4271 * @param __unary_op A unary operator. 4272 * @return An output iterator equal to @p __result+(__last-__first). 4273 * 4274 * Applies the operator to each element in the input range and assigns 4275 * the results to successive elements of the output sequence. 4276 * Evaluates @p *(__result+N)=unary_op(*(__first+N)) for each @c N in the 4277 * range @p [0,__last-__first). 4278 * 4279 * @p unary_op must not alter its argument. 4280 */ 4281 template
4283 _GLIBCXX20_CONSTEXPR 4284 _OutputIterator 4285 transform(_InputIterator __first, _InputIterator __last, 4286 _OutputIterator __result, _UnaryOperation __unary_op) 4287 { 4288 // concept requirements 4289 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>) 4290 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator, 4291 // "the type returned by a _UnaryOperation" 4292 __typeof__(__unary_op(*__first))>) 4293 __glibcxx_requires_valid_range(__first, __last); 4294 4295 for (; __first != __last; ++__first, (void)++__result) 4296 *__result = __unary_op(*__first); 4297 return __result; 4298 } 4299 4300 /** 4301 * @brief Perform an operation on corresponding elements of two sequences. 4302 * @ingroup mutating_algorithms 4303 * @param __first1 An input iterator. 4304 * @param __last1 An input iterator. 4305 * @param __first2 An input iterator. 4306 * @param __result An output iterator. 4307 * @param __binary_op A binary operator. 4308 * @return An output iterator equal to @p result+(last-first). 4309 * 4310 * Applies the operator to the corresponding elements in the two 4311 * input ranges and assigns the results to successive elements of the 4312 * output sequence. 4313 * Evaluates @p 4314 * *(__result+N)=__binary_op(*(__first1+N),*(__first2+N)) for each 4315 * @c N in the range @p [0,__last1-__first1). 4316 * 4317 * @p binary_op must not alter either of its arguments. 4318 */ 4319 template
4321 _GLIBCXX20_CONSTEXPR 4322 _OutputIterator 4323 transform(_InputIterator1 __first1, _InputIterator1 __last1, 4324 _InputIterator2 __first2, _OutputIterator __result, 4325 _BinaryOperation __binary_op) 4326 { 4327 // concept requirements 4328 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>) 4329 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>) 4330 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator, 4331 // "the type returned by a _BinaryOperation" 4332 __typeof__(__binary_op(*__first1,*__first2))>) 4333 __glibcxx_requires_valid_range(__first1, __last1); 4334 4335 for (; __first1 != __last1; ++__first1, (void)++__first2, ++__result) 4336 *__result = __binary_op(*__first1, *__first2); 4337 return __result; 4338 } 4339 4340 /** 4341 * @brief Replace each occurrence of one value in a sequence with another 4342 * value. 4343 * @ingroup mutating_algorithms 4344 * @param __first A forward iterator. 4345 * @param __last A forward iterator. 4346 * @param __old_value The value to be replaced. 4347 * @param __new_value The replacement value. 4348 * @return replace() returns no value. 4349 * 4350 * For each iterator @c i in the range @p [__first,__last) if @c *i == 4351 * @p __old_value then the assignment @c *i = @p __new_value is performed. 4352 */ 4353 template
4354 _GLIBCXX20_CONSTEXPR 4355 void 4356 replace(_ForwardIterator __first, _ForwardIterator __last, 4357 const _Tp& __old_value, const _Tp& __new_value) 4358 { 4359 // concept requirements 4360 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept< 4361 _ForwardIterator>) 4362 __glibcxx_function_requires(_EqualOpConcept< 4363 typename iterator_traits<_ForwardIterator>::value_type, _Tp>) 4364 __glibcxx_function_requires(_ConvertibleConcept<_Tp, 4365 typename iterator_traits<_ForwardIterator>::value_type>) 4366 __glibcxx_requires_valid_range(__first, __last); 4367 4368 for (; __first != __last; ++__first) 4369 if (*__first == __old_value) 4370 *__first = __new_value; 4371 } 4372 4373 /** 4374 * @brief Replace each value in a sequence for which a predicate returns 4375 * true with another value. 4376 * @ingroup mutating_algorithms 4377 * @param __first A forward iterator. 4378 * @param __last A forward iterator. 4379 * @param __pred A predicate. 4380 * @param __new_value The replacement value. 4381 * @return replace_if() returns no value. 4382 * 4383 * For each iterator @c i in the range @p [__first,__last) if @p __pred(*i) 4384 * is true then the assignment @c *i = @p __new_value is performed. 4385 */ 4386 template
4387 _GLIBCXX20_CONSTEXPR 4388 void 4389 replace_if(_ForwardIterator __first, _ForwardIterator __last, 4390 _Predicate __pred, const _Tp& __new_value) 4391 { 4392 // concept requirements 4393 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept< 4394 _ForwardIterator>) 4395 __glibcxx_function_requires(_ConvertibleConcept<_Tp, 4396 typename iterator_traits<_ForwardIterator>::value_type>) 4397 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate, 4398 typename iterator_traits<_ForwardIterator>::value_type>) 4399 __glibcxx_requires_valid_range(__first, __last); 4400 4401 for (; __first != __last; ++__first) 4402 if (__pred(*__first)) 4403 *__first = __new_value; 4404 } 4405 4406 /** 4407 * @brief Assign the result of a function object to each value in a 4408 * sequence. 4409 * @ingroup mutating_algorithms 4410 * @param __first A forward iterator. 4411 * @param __last A forward iterator. 4412 * @param __gen A function object taking no arguments and returning 4413 * std::iterator_traits<_ForwardIterator>::value_type 4414 * @return generate() returns no value. 4415 * 4416 * Performs the assignment @c *i = @p __gen() for each @c i in the range 4417 * @p [__first,__last). 4418 */ 4419 template
4420 _GLIBCXX20_CONSTEXPR 4421 void 4422 generate(_ForwardIterator __first, _ForwardIterator __last, 4423 _Generator __gen) 4424 { 4425 // concept requirements 4426 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>) 4427 __glibcxx_function_requires(_GeneratorConcept<_Generator, 4428 typename iterator_traits<_ForwardIterator>::value_type>) 4429 __glibcxx_requires_valid_range(__first, __last); 4430 4431 for (; __first != __last; ++__first) 4432 *__first = __gen(); 4433 } 4434 4435 /** 4436 * @brief Assign the result of a function object to each value in a 4437 * sequence. 4438 * @ingroup mutating_algorithms 4439 * @param __first A forward iterator. 4440 * @param __n The length of the sequence. 4441 * @param __gen A function object taking no arguments and returning 4442 * std::iterator_traits<_ForwardIterator>::value_type 4443 * @return The end of the sequence, @p __first+__n 4444 * 4445 * Performs the assignment @c *i = @p __gen() for each @c i in the range 4446 * @p [__first,__first+__n). 4447 * 4448 * If @p __n is negative, the function does nothing and returns @p __first. 4449 */ 4450 // _GLIBCXX_RESOLVE_LIB_DEFECTS 4451 // DR 865. More algorithms that throw away information 4452 // DR 426. search_n(), fill_n(), and generate_n() with negative n 4453 template
4454 _GLIBCXX20_CONSTEXPR 4455 _OutputIterator 4456 generate_n(_OutputIterator __first, _Size __n, _Generator __gen) 4457 { 4458 // concept requirements 4459 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator, 4460 // "the type returned by a _Generator" 4461 __typeof__(__gen())>) 4462 4463 typedef __decltype(std::__size_to_integer(__n)) _IntSize; 4464 for (_IntSize __niter = std::__size_to_integer(__n); 4465 __niter > 0; --__niter, (void) ++__first) 4466 *__first = __gen(); 4467 return __first; 4468 } 4469 4470 /** 4471 * @brief Copy a sequence, removing consecutive duplicate values. 4472 * @ingroup mutating_algorithms 4473 * @param __first An input iterator. 4474 * @param __last An input iterator. 4475 * @param __result An output iterator. 4476 * @return An iterator designating the end of the resulting sequence. 4477 * 4478 * Copies each element in the range @p [__first,__last) to the range 4479 * beginning at @p __result, except that only the first element is copied 4480 * from groups of consecutive elements that compare equal. 4481 * unique_copy() is stable, so the relative order of elements that are 4482 * copied is unchanged. 4483 * 4484 * _GLIBCXX_RESOLVE_LIB_DEFECTS 4485 * DR 241. Does unique_copy() require CopyConstructible and Assignable? 4486 * 4487 * _GLIBCXX_RESOLVE_LIB_DEFECTS 4488 * DR 538. 241 again: Does unique_copy() require CopyConstructible and 4489 * Assignable? 4490 */ 4491 template
4492 _GLIBCXX20_CONSTEXPR 4493 inline _OutputIterator 4494 unique_copy(_InputIterator __first, _InputIterator __last, 4495 _OutputIterator __result) 4496 { 4497 // concept requirements 4498 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>) 4499 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator, 4500 typename iterator_traits<_InputIterator>::value_type>) 4501 __glibcxx_function_requires(_EqualityComparableConcept< 4502 typename iterator_traits<_InputIterator>::value_type>) 4503 __glibcxx_requires_valid_range(__first, __last); 4504 4505 if (__first == __last) 4506 return __result; 4507 return std::__unique_copy(__first, __last, __result, 4508 __gnu_cxx::__ops::__iter_equal_to_iter(), 4509 std::__iterator_category(__first), 4510 std::__iterator_category(__result)); 4511 } 4512 4513 /** 4514 * @brief Copy a sequence, removing consecutive values using a predicate. 4515 * @ingroup mutating_algorithms 4516 * @param __first An input iterator. 4517 * @param __last An input iterator. 4518 * @param __result An output iterator. 4519 * @param __binary_pred A binary predicate. 4520 * @return An iterator designating the end of the resulting sequence. 4521 * 4522 * Copies each element in the range @p [__first,__last) to the range 4523 * beginning at @p __result, except that only the first element is copied 4524 * from groups of consecutive elements for which @p __binary_pred returns 4525 * true. 4526 * unique_copy() is stable, so the relative order of elements that are 4527 * copied is unchanged. 4528 * 4529 * _GLIBCXX_RESOLVE_LIB_DEFECTS 4530 * DR 241. Does unique_copy() require CopyConstructible and Assignable? 4531 */ 4532 template
4534 _GLIBCXX20_CONSTEXPR 4535 inline _OutputIterator 4536 unique_copy(_InputIterator __first, _InputIterator __last, 4537 _OutputIterator __result, 4538 _BinaryPredicate __binary_pred) 4539 { 4540 // concept requirements -- predicates checked later 4541 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>) 4542 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator, 4543 typename iterator_traits<_InputIterator>::value_type>) 4544 __glibcxx_requires_valid_range(__first, __last); 4545 4546 if (__first == __last) 4547 return __result; 4548 return std::__unique_copy(__first, __last, __result, 4549 __gnu_cxx::__ops::__iter_comp_iter(__binary_pred), 4550 std::__iterator_category(__first), 4551 std::__iterator_category(__result)); 4552 } 4553 4554 #if _GLIBCXX_HOSTED 4555 /** 4556 * @brief Randomly shuffle the elements of a sequence. 4557 * @ingroup mutating_algorithms 4558 * @param __first A forward iterator. 4559 * @param __last A forward iterator. 4560 * @return Nothing. 4561 * 4562 * Reorder the elements in the range @p [__first,__last) using a random 4563 * distribution, so that every possible ordering of the sequence is 4564 * equally likely. 4565 */ 4566 template
4567 inline void 4568 random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last) 4569 { 4570 // concept requirements 4571 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept< 4572 _RandomAccessIterator>) 4573 __glibcxx_requires_valid_range(__first, __last); 4574 4575 if (__first != __last) 4576 for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i) 4577 { 4578 // XXX rand() % N is not uniformly distributed 4579 _RandomAccessIterator __j = __first 4580 + std::rand() % ((__i - __first) + 1); 4581 if (__i != __j) 4582 std::iter_swap(__i, __j); 4583 } 4584 } 4585 #endif 4586 4587 /** 4588 * @brief Shuffle the elements of a sequence using a random number 4589 * generator. 4590 * @ingroup mutating_algorithms 4591 * @param __first A forward iterator. 4592 * @param __last A forward iterator. 4593 * @param __rand The RNG functor or function. 4594 * @return Nothing. 4595 * 4596 * Reorders the elements in the range @p [__first,__last) using @p __rand to 4597 * provide a random distribution. Calling @p __rand(N) for a positive 4598 * integer @p N should return a randomly chosen integer from the 4599 * range [0,N). 4600 */ 4601 template
4602 void 4603 random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last, 4604 #if __cplusplus >= 201103L 4605 _RandomNumberGenerator&& __rand) 4606 #else 4607 _RandomNumberGenerator& __rand) 4608 #endif 4609 { 4610 // concept requirements 4611 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept< 4612 _RandomAccessIterator>) 4613 __glibcxx_requires_valid_range(__first, __last); 4614 4615 if (__first == __last) 4616 return; 4617 for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i) 4618 { 4619 _RandomAccessIterator __j = __first + __rand((__i - __first) + 1); 4620 if (__i != __j) 4621 std::iter_swap(__i, __j); 4622 } 4623 } 4624 4625 4626 /** 4627 * @brief Move elements for which a predicate is true to the beginning 4628 * of a sequence. 4629 * @ingroup mutating_algorithms 4630 * @param __first A forward iterator. 4631 * @param __last A forward iterator. 4632 * @param __pred A predicate functor. 4633 * @return An iterator @p middle such that @p __pred(i) is true for each 4634 * iterator @p i in the range @p [__first,middle) and false for each @p i 4635 * in the range @p [middle,__last). 4636 * 4637 * @p __pred must not modify its operand. @p partition() does not preserve 4638 * the relative ordering of elements in each group, use 4639 * @p stable_partition() if this is needed. 4640 */ 4641 template
4642 _GLIBCXX20_CONSTEXPR 4643 inline _ForwardIterator 4644 partition(_ForwardIterator __first, _ForwardIterator __last, 4645 _Predicate __pred) 4646 { 4647 // concept requirements 4648 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept< 4649 _ForwardIterator>) 4650 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate, 4651 typename iterator_traits<_ForwardIterator>::value_type>) 4652 __glibcxx_requires_valid_range(__first, __last); 4653 4654 return std::__partition(__first, __last, __pred, 4655 std::__iterator_category(__first)); 4656 } 4657 4658 4659 /** 4660 * @brief Sort the smallest elements of a sequence. 4661 * @ingroup sorting_algorithms 4662 * @param __first An iterator. 4663 * @param __middle Another iterator. 4664 * @param __last Another iterator. 4665 * @return Nothing. 4666 * 4667 * Sorts the smallest @p (__middle-__first) elements in the range 4668 * @p [first,last) and moves them to the range @p [__first,__middle). The 4669 * order of the remaining elements in the range @p [__middle,__last) is 4670 * undefined. 4671 * After the sort if @e i and @e j are iterators in the range 4672 * @p [__first,__middle) such that i precedes j and @e k is an iterator in 4673 * the range @p [__middle,__last) then *j<*i and *k<*i are both false. 4674 */ 4675 template
4676 _GLIBCXX20_CONSTEXPR 4677 inline void 4678 partial_sort(_RandomAccessIterator __first, 4679 _RandomAccessIterator __middle, 4680 _RandomAccessIterator __last) 4681 { 4682 // concept requirements 4683 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept< 4684 _RandomAccessIterator>) 4685 __glibcxx_function_requires(_LessThanComparableConcept< 4686 typename iterator_traits<_RandomAccessIterator>::value_type>) 4687 __glibcxx_requires_valid_range(__first, __middle); 4688 __glibcxx_requires_valid_range(__middle, __last); 4689 __glibcxx_requires_irreflexive(__first, __last); 4690 4691 std::__partial_sort(__first, __middle, __last, 4692 __gnu_cxx::__ops::__iter_less_iter()); 4693 } 4694 4695 /** 4696 * @brief Sort the smallest elements of a sequence using a predicate 4697 * for comparison. 4698 * @ingroup sorting_algorithms 4699 * @param __first An iterator. 4700 * @param __middle Another iterator. 4701 * @param __last Another iterator. 4702 * @param __comp A comparison functor. 4703 * @return Nothing. 4704 * 4705 * Sorts the smallest @p (__middle-__first) elements in the range 4706 * @p [__first,__last) and moves them to the range @p [__first,__middle). The 4707 * order of the remaining elements in the range @p [__middle,__last) is 4708 * undefined. 4709 * After the sort if @e i and @e j are iterators in the range 4710 * @p [__first,__middle) such that i precedes j and @e k is an iterator in 4711 * the range @p [__middle,__last) then @p *__comp(j,*i) and @p __comp(*k,*i) 4712 * are both false. 4713 */ 4714 template
4715 _GLIBCXX20_CONSTEXPR 4716 inline void 4717 partial_sort(_RandomAccessIterator __first, 4718 _RandomAccessIterator __middle, 4719 _RandomAccessIterator __last, 4720 _Compare __comp) 4721 { 4722 // concept requirements 4723 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept< 4724 _RandomAccessIterator>) 4725 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare, 4726 typename iterator_traits<_RandomAccessIterator>::value_type, 4727 typename iterator_traits<_RandomAccessIterator>::value_type>) 4728 __glibcxx_requires_valid_range(__first, __middle); 4729 __glibcxx_requires_valid_range(__middle, __last); 4730 __glibcxx_requires_irreflexive_pred(__first, __last, __comp); 4731 4732 std::__partial_sort(__first, __middle, __last, 4733 __gnu_cxx::__ops::__iter_comp_iter(__comp)); 4734 } 4735 4736 /** 4737 * @brief Sort a sequence just enough to find a particular position. 4738 * @ingroup sorting_algorithms 4739 * @param __first An iterator. 4740 * @param __nth Another iterator. 4741 * @param __last Another iterator. 4742 * @return Nothing. 4743 * 4744 * Rearranges the elements in the range @p [__first,__last) so that @p *__nth 4745 * is the same element that would have been in that position had the 4746 * whole sequence been sorted. The elements either side of @p *__nth are 4747 * not completely sorted, but for any iterator @e i in the range 4748 * @p [__first,__nth) and any iterator @e j in the range @p [__nth,__last) it 4749 * holds that *j < *i is false. 4750 */ 4751 template
4752 _GLIBCXX20_CONSTEXPR 4753 inline void 4754 nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, 4755 _RandomAccessIterator __last) 4756 { 4757 // concept requirements 4758 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept< 4759 _RandomAccessIterator>) 4760 __glibcxx_function_requires(_LessThanComparableConcept< 4761 typename iterator_traits<_RandomAccessIterator>::value_type>) 4762 __glibcxx_requires_valid_range(__first, __nth); 4763 __glibcxx_requires_valid_range(__nth, __last); 4764 __glibcxx_requires_irreflexive(__first, __last); 4765 4766 if (__first == __last || __nth == __last) 4767 return; 4768 4769 std::__introselect(__first, __nth, __last, 4770 std::__lg(__last - __first) * 2, 4771 __gnu_cxx::__ops::__iter_less_iter()); 4772 } 4773 4774 /** 4775 * @brief Sort a sequence just enough to find a particular position 4776 * using a predicate for comparison. 4777 * @ingroup sorting_algorithms 4778 * @param __first An iterator. 4779 * @param __nth Another iterator. 4780 * @param __last Another iterator. 4781 * @param __comp A comparison functor. 4782 * @return Nothing. 4783 * 4784 * Rearranges the elements in the range @p [__first,__last) so that @p *__nth 4785 * is the same element that would have been in that position had the 4786 * whole sequence been sorted. The elements either side of @p *__nth are 4787 * not completely sorted, but for any iterator @e i in the range 4788 * @p [__first,__nth) and any iterator @e j in the range @p [__nth,__last) it 4789 * holds that @p __comp(*j,*i) is false. 4790 */ 4791 template
4792 _GLIBCXX20_CONSTEXPR 4793 inline void 4794 nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, 4795 _RandomAccessIterator __last, _Compare __comp) 4796 { 4797 // concept requirements 4798 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept< 4799 _RandomAccessIterator>) 4800 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare, 4801 typename iterator_traits<_RandomAccessIterator>::value_type, 4802 typename iterator_traits<_RandomAccessIterator>::value_type>) 4803 __glibcxx_requires_valid_range(__first, __nth); 4804 __glibcxx_requires_valid_range(__nth, __last); 4805 __glibcxx_requires_irreflexive_pred(__first, __last, __comp); 4806 4807 if (__first == __last || __nth == __last) 4808 return; 4809 4810 std::__introselect(__first, __nth, __last, 4811 std::__lg(__last - __first) * 2, 4812 __gnu_cxx::__ops::__iter_comp_iter(__comp)); 4813 } 4814 4815 /** 4816 * @brief Sort the elements of a sequence. 4817 * @ingroup sorting_algorithms 4818 * @param __first An iterator. 4819 * @param __last Another iterator. 4820 * @return Nothing. 4821 * 4822 * Sorts the elements in the range @p [__first,__last) in ascending order, 4823 * such that for each iterator @e i in the range @p [__first,__last-1), 4824 * *(i+1)<*i is false. 4825 * 4826 * The relative ordering of equivalent elements is not preserved, use 4827 * @p stable_sort() if this is needed. 4828 */ 4829 template
4830 _GLIBCXX20_CONSTEXPR 4831 inline void 4832 sort(_RandomAccessIterator __first, _RandomAccessIterator __last) 4833 { 4834 // concept requirements 4835 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept< 4836 _RandomAccessIterator>) 4837 __glibcxx_function_requires(_LessThanComparableConcept< 4838 typename iterator_traits<_RandomAccessIterator>::value_type>) 4839 __glibcxx_requires_valid_range(__first, __last); 4840 __glibcxx_requires_irreflexive(__first, __last); 4841 4842 std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter()); 4843 } 4844 4845 /** 4846 * @brief Sort the elements of a sequence using a predicate for comparison. 4847 * @ingroup sorting_algorithms 4848 * @param __first An iterator. 4849 * @param __last Another iterator. 4850 * @param __comp A comparison functor. 4851 * @return Nothing. 4852 * 4853 * Sorts the elements in the range @p [__first,__last) in ascending order, 4854 * such that @p __comp(*(i+1),*i) is false for every iterator @e i in the 4855 * range @p [__first,__last-1). 4856 * 4857 * The relative ordering of equivalent elements is not preserved, use 4858 * @p stable_sort() if this is needed. 4859 */ 4860 template
4861 _GLIBCXX20_CONSTEXPR 4862 inline void 4863 sort(_RandomAccessIterator __first, _RandomAccessIterator __last, 4864 _Compare __comp) 4865 { 4866 // concept requirements 4867 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept< 4868 _RandomAccessIterator>) 4869 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare, 4870 typename iterator_traits<_RandomAccessIterator>::value_type, 4871 typename iterator_traits<_RandomAccessIterator>::value_type>) 4872 __glibcxx_requires_valid_range(__first, __last); 4873 __glibcxx_requires_irreflexive_pred(__first, __last, __comp); 4874 4875 std::__sort(__first, __last, __gnu_cxx::__ops::__iter_comp_iter(__comp)); 4876 } 4877 4878 template
4880 _GLIBCXX20_CONSTEXPR 4881 _OutputIterator 4882 __merge(_InputIterator1 __first1, _InputIterator1 __last1, 4883 _InputIterator2 __first2, _InputIterator2 __last2, 4884 _OutputIterator __result, _Compare __comp) 4885 { 4886 while (__first1 != __last1 && __first2 != __last2) 4887 { 4888 if (__comp(__first2, __first1)) 4889 { 4890 *__result = *__first2; 4891 ++__first2; 4892 } 4893 else 4894 { 4895 *__result = *__first1; 4896 ++__first1; 4897 } 4898 ++__result; 4899 } 4900 return std::copy(__first2, __last2, 4901 std::copy(__first1, __last1, __result)); 4902 } 4903 4904 /** 4905 * @brief Merges two sorted ranges. 4906 * @ingroup sorting_algorithms 4907 * @param __first1 An iterator. 4908 * @param __first2 Another iterator. 4909 * @param __last1 Another iterator. 4910 * @param __last2 Another iterator. 4911 * @param __result An iterator pointing to the end of the merged range. 4912 * @return An output iterator equal to @p __result + (__last1 - __first1) 4913 * + (__last2 - __first2). 4914 * 4915 * Merges the ranges @p [__first1,__last1) and @p [__first2,__last2) into 4916 * the sorted range @p [__result, __result + (__last1-__first1) + 4917 * (__last2-__first2)). Both input ranges must be sorted, and the 4918 * output range must not overlap with either of the input ranges. 4919 * The sort is @e stable, that is, for equivalent elements in the 4920 * two ranges, elements from the first range will always come 4921 * before elements from the second. 4922 */ 4923 template
4925 _GLIBCXX20_CONSTEXPR 4926 inline _OutputIterator 4927 merge(_InputIterator1 __first1, _InputIterator1 __last1, 4928 _InputIterator2 __first2, _InputIterator2 __last2, 4929 _OutputIterator __result) 4930 { 4931 // concept requirements 4932 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>) 4933 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>) 4934 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator, 4935 typename iterator_traits<_InputIterator1>::value_type>) 4936 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator, 4937 typename iterator_traits<_InputIterator2>::value_type>) 4938 __glibcxx_function_requires(_LessThanOpConcept< 4939 typename iterator_traits<_InputIterator2>::value_type, 4940 typename iterator_traits<_InputIterator1>::value_type>) 4941 __glibcxx_requires_sorted_set(__first1, __last1, __first2); 4942 __glibcxx_requires_sorted_set(__first2, __last2, __first1); 4943 __glibcxx_requires_irreflexive2(__first1, __last1); 4944 __glibcxx_requires_irreflexive2(__first2, __last2); 4945 4946 return _GLIBCXX_STD_A::__merge(__first1, __last1, 4947 __first2, __last2, __result, 4948 __gnu_cxx::__ops::__iter_less_iter()); 4949 } 4950 4951 /** 4952 * @brief Merges two sorted ranges. 4953 * @ingroup sorting_algorithms 4954 * @param __first1 An iterator. 4955 * @param __first2 Another iterator. 4956 * @param __last1 Another iterator. 4957 * @param __last2 Another iterator. 4958 * @param __result An iterator pointing to the end of the merged range. 4959 * @param __comp A functor to use for comparisons. 4960 * @return An output iterator equal to @p __result + (__last1 - __first1) 4961 * + (__last2 - __first2). 4962 * 4963 * Merges the ranges @p [__first1,__last1) and @p [__first2,__last2) into 4964 * the sorted range @p [__result, __result + (__last1-__first1) + 4965 * (__last2-__first2)). Both input ranges must be sorted, and the 4966 * output range must not overlap with either of the input ranges. 4967 * The sort is @e stable, that is, for equivalent elements in the 4968 * two ranges, elements from the first range will always come 4969 * before elements from the second. 4970 * 4971 * The comparison function should have the same effects on ordering as 4972 * the function used for the initial sort. 4973 */ 4974 template
4976 _GLIBCXX20_CONSTEXPR 4977 inline _OutputIterator 4978 merge(_InputIterator1 __first1, _InputIterator1 __last1, 4979 _InputIterator2 __first2, _InputIterator2 __last2, 4980 _OutputIterator __result, _Compare __comp) 4981 { 4982 // concept requirements 4983 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>) 4984 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>) 4985 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator, 4986 typename iterator_traits<_InputIterator1>::value_type>) 4987 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator, 4988 typename iterator_traits<_InputIterator2>::value_type>) 4989 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare, 4990 typename iterator_traits<_InputIterator2>::value_type, 4991 typename iterator_traits<_InputIterator1>::value_type>) 4992 __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp); 4993 __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp); 4994 __glibcxx_requires_irreflexive_pred2(__first1, __last1, __comp); 4995 __glibcxx_requires_irreflexive_pred2(__first2, __last2, __comp); 4996 4997 return _GLIBCXX_STD_A::__merge(__first1, __last1, 4998 __first2, __last2, __result, 4999 __gnu_cxx::__ops::__iter_comp_iter(__comp)); 5000 } 5001 5002 template
5003 inline void 5004 __stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, 5005 _Compare __comp) 5006 { 5007 typedef typename iterator_traits<_RandomAccessIterator>::value_type 5008 _ValueType; 5009 typedef typename iterator_traits<_RandomAccessIterator>::difference_type 5010 _DistanceType; 5011 typedef _Temporary_buffer<_RandomAccessIterator, _ValueType> _TmpBuf; 5012 5013 if (__first == __last) 5014 return; 5015 5016 // __stable_sort_adaptive sorts the range in two halves, 5017 // so the buffer only needs to fit half the range at once. 5018 _TmpBuf __buf(__first, (__last - __first + 1) / 2); 5019 5020 if (__buf.begin() == 0) 5021 std::__inplace_stable_sort(__first, __last, __comp); 5022 else 5023 std::__stable_sort_adaptive(__first, __last, __buf.begin(), 5024 _DistanceType(__buf.size()), __comp); 5025 } 5026 5027 /** 5028 * @brief Sort the elements of a sequence, preserving the relative order 5029 * of equivalent elements. 5030 * @ingroup sorting_algorithms 5031 * @param __first An iterator. 5032 * @param __last Another iterator. 5033 * @return Nothing. 5034 * 5035 * Sorts the elements in the range @p [__first,__last) in ascending order, 5036 * such that for each iterator @p i in the range @p [__first,__last-1), 5037 * @p *(i+1)<*i is false. 5038 * 5039 * The relative ordering of equivalent elements is preserved, so any two 5040 * elements @p x and @p y in the range @p [__first,__last) such that 5041 * @p x
5045 inline void 5046 stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last) 5047 { 5048 // concept requirements 5049 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept< 5050 _RandomAccessIterator>) 5051 __glibcxx_function_requires(_LessThanComparableConcept< 5052 typename iterator_traits<_RandomAccessIterator>::value_type>) 5053 __glibcxx_requires_valid_range(__first, __last); 5054 __glibcxx_requires_irreflexive(__first, __last); 5055 5056 _GLIBCXX_STD_A::__stable_sort(__first, __last, 5057 __gnu_cxx::__ops::__iter_less_iter()); 5058 } 5059 5060 /** 5061 * @brief Sort the elements of a sequence using a predicate for comparison, 5062 * preserving the relative order of equivalent elements. 5063 * @ingroup sorting_algorithms 5064 * @param __first An iterator. 5065 * @param __last Another iterator. 5066 * @param __comp A comparison functor. 5067 * @return Nothing. 5068 * 5069 * Sorts the elements in the range @p [__first,__last) in ascending order, 5070 * such that for each iterator @p i in the range @p [__first,__last-1), 5071 * @p __comp(*(i+1),*i) is false. 5072 * 5073 * The relative ordering of equivalent elements is preserved, so any two 5074 * elements @p x and @p y in the range @p [__first,__last) such that 5075 * @p __comp(x,y) is false and @p __comp(y,x) is false will have the same 5076 * relative ordering after calling @p stable_sort(). 5077 */ 5078 template
5079 inline void 5080 stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, 5081 _Compare __comp) 5082 { 5083 // concept requirements 5084 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept< 5085 _RandomAccessIterator>) 5086 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare, 5087 typename iterator_traits<_RandomAccessIterator>::value_type, 5088 typename iterator_traits<_RandomAccessIterator>::value_type>) 5089 __glibcxx_requires_valid_range(__first, __last); 5090 __glibcxx_requires_irreflexive_pred(__first, __last, __comp); 5091 5092 _GLIBCXX_STD_A::__stable_sort(__first, __last, 5093 __gnu_cxx::__ops::__iter_comp_iter(__comp)); 5094 } 5095 5096 template
5099 _GLIBCXX20_CONSTEXPR 5100 _OutputIterator 5101 __set_union(_InputIterator1 __first1, _InputIterator1 __last1, 5102 _InputIterator2 __first2, _InputIterator2 __last2, 5103 _OutputIterator __result, _Compare __comp) 5104 { 5105 while (__first1 != __last1 && __first2 != __last2) 5106 { 5107 if (__comp(__first1, __first2)) 5108 { 5109 *__result = *__first1; 5110 ++__first1; 5111 } 5112 else if (__comp(__first2, __first1)) 5113 { 5114 *__result = *__first2; 5115 ++__first2; 5116 } 5117 else 5118 { 5119 *__result = *__first1; 5120 ++__first1; 5121 ++__first2; 5122 } 5123 ++__result; 5124 } 5125 return std::copy(__first2, __last2, 5126 std::copy(__first1, __last1, __result)); 5127 } 5128 5129 /** 5130 * @brief Return the union of two sorted ranges. 5131 * @ingroup set_algorithms 5132 * @param __first1 Start of first range. 5133 * @param __last1 End of first range. 5134 * @param __first2 Start of second range. 5135 * @param __last2 End of second range. 5136 * @param __result Start of output range. 5137 * @return End of the output range. 5138 * @ingroup set_algorithms 5139 * 5140 * This operation iterates over both ranges, copying elements present in 5141 * each range in order to the output range. Iterators increment for each 5142 * range. When the current element of one range is less than the other, 5143 * that element is copied and the iterator advanced. If an element is 5144 * contained in both ranges, the element from the first range is copied and 5145 * both ranges advance. The output range may not overlap either input 5146 * range. 5147 */ 5148 template
5150 _GLIBCXX20_CONSTEXPR 5151 inline _OutputIterator 5152 set_union(_InputIterator1 __first1, _InputIterator1 __last1, 5153 _InputIterator2 __first2, _InputIterator2 __last2, 5154 _OutputIterator __result) 5155 { 5156 // concept requirements 5157 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>) 5158 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>) 5159 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator, 5160 typename iterator_traits<_InputIterator1>::value_type>) 5161 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator, 5162 typename iterator_traits<_InputIterator2>::value_type>) 5163 __glibcxx_function_requires(_LessThanOpConcept< 5164 typename iterator_traits<_InputIterator1>::value_type, 5165 typename iterator_traits<_InputIterator2>::value_type>) 5166 __glibcxx_function_requires(_LessThanOpConcept< 5167 typename iterator_traits<_InputIterator2>::value_type, 5168 typename iterator_traits<_InputIterator1>::value_type>) 5169 __glibcxx_requires_sorted_set(__first1, __last1, __first2); 5170 __glibcxx_requires_sorted_set(__first2, __last2, __first1); 5171 __glibcxx_requires_irreflexive2(__first1, __last1); 5172 __glibcxx_requires_irreflexive2(__first2, __last2); 5173 5174 return _GLIBCXX_STD_A::__set_union(__first1, __last1, 5175 __first2, __last2, __result, 5176 __gnu_cxx::__ops::__iter_less_iter()); 5177 } 5178 5179 /** 5180 * @brief Return the union of two sorted ranges using a comparison functor. 5181 * @ingroup set_algorithms 5182 * @param __first1 Start of first range. 5183 * @param __last1 End of first range. 5184 * @param __first2 Start of second range. 5185 * @param __last2 End of second range. 5186 * @param __result Start of output range. 5187 * @param __comp The comparison functor. 5188 * @return End of the output range. 5189 * @ingroup set_algorithms 5190 * 5191 * This operation iterates over both ranges, copying elements present in 5192 * each range in order to the output range. Iterators increment for each 5193 * range. When the current element of one range is less than the other 5194 * according to @p __comp, that element is copied and the iterator advanced. 5195 * If an equivalent element according to @p __comp is contained in both 5196 * ranges, the element from the first range is copied and both ranges 5197 * advance. The output range may not overlap either input range. 5198 */ 5199 template
5201 _GLIBCXX20_CONSTEXPR 5202 inline _OutputIterator 5203 set_union(_InputIterator1 __first1, _InputIterator1 __last1, 5204 _InputIterator2 __first2, _InputIterator2 __last2, 5205 _OutputIterator __result, _Compare __comp) 5206 { 5207 // concept requirements 5208 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>) 5209 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>) 5210 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator, 5211 typename iterator_traits<_InputIterator1>::value_type>) 5212 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator, 5213 typename iterator_traits<_InputIterator2>::value_type>) 5214 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare, 5215 typename iterator_traits<_InputIterator1>::value_type, 5216 typename iterator_traits<_InputIterator2>::value_type>) 5217 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare, 5218 typename iterator_traits<_InputIterator2>::value_type, 5219 typename iterator_traits<_InputIterator1>::value_type>) 5220 __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp); 5221 __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp); 5222 __glibcxx_requires_irreflexive_pred2(__first1, __last1, __comp); 5223 __glibcxx_requires_irreflexive_pred2(__first2, __last2, __comp); 5224 5225 return _GLIBCXX_STD_A::__set_union(__first1, __last1, 5226 __first2, __last2, __result, 5227 __gnu_cxx::__ops::__iter_comp_iter(__comp)); 5228 } 5229 5230 template
5233 _GLIBCXX20_CONSTEXPR 5234 _OutputIterator 5235 __set_intersection(_InputIterator1 __first1, _InputIterator1 __last1, 5236 _InputIterator2 __first2, _InputIterator2 __last2, 5237 _OutputIterator __result, _Compare __comp) 5238 { 5239 while (__first1 != __last1 && __first2 != __last2) 5240 if (__comp(__first1, __first2)) 5241 ++__first1; 5242 else if (__comp(__first2, __first1)) 5243 ++__first2; 5244 else 5245 { 5246 *__result = *__first1; 5247 ++__first1; 5248 ++__first2; 5249 ++__result; 5250 } 5251 return __result; 5252 } 5253 5254 /** 5255 * @brief Return the intersection of two sorted ranges. 5256 * @ingroup set_algorithms 5257 * @param __first1 Start of first range. 5258 * @param __last1 End of first range. 5259 * @param __first2 Start of second range. 5260 * @param __last2 End of second range. 5261 * @param __result Start of output range. 5262 * @return End of the output range. 5263 * @ingroup set_algorithms 5264 * 5265 * This operation iterates over both ranges, copying elements present in 5266 * both ranges in order to the output range. Iterators increment for each 5267 * range. When the current element of one range is less than the other, 5268 * that iterator advances. If an element is contained in both ranges, the 5269 * element from the first range is copied and both ranges advance. The 5270 * output range may not overlap either input range. 5271 */ 5272 template
5274 _GLIBCXX20_CONSTEXPR 5275 inline _OutputIterator 5276 set_intersection(_InputIterator1 __first1, _InputIterator1 __last1, 5277 _InputIterator2 __first2, _InputIterator2 __last2, 5278 _OutputIterator __result) 5279 { 5280 // concept requirements 5281 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>) 5282 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>) 5283 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator, 5284 typename iterator_traits<_InputIterator1>::value_type>) 5285 __glibcxx_function_requires(_LessThanOpConcept< 5286 typename iterator_traits<_InputIterator1>::value_type, 5287 typename iterator_traits<_InputIterator2>::value_type>) 5288 __glibcxx_function_requires(_LessThanOpConcept< 5289 typename iterator_traits<_InputIterator2>::value_type, 5290 typename iterator_traits<_InputIterator1>::value_type>) 5291 __glibcxx_requires_sorted_set(__first1, __last1, __first2); 5292 __glibcxx_requires_sorted_set(__first2, __last2, __first1); 5293 __glibcxx_requires_irreflexive2(__first1, __last1); 5294 __glibcxx_requires_irreflexive2(__first2, __last2); 5295 5296 return _GLIBCXX_STD_A::__set_intersection(__first1, __last1, 5297 __first2, __last2, __result, 5298 __gnu_cxx::__ops::__iter_less_iter()); 5299 } 5300 5301 /** 5302 * @brief Return the intersection of two sorted ranges using comparison 5303 * functor. 5304 * @ingroup set_algorithms 5305 * @param __first1 Start of first range. 5306 * @param __last1 End of first range. 5307 * @param __first2 Start of second range. 5308 * @param __last2 End of second range. 5309 * @param __result Start of output range. 5310 * @param __comp The comparison functor. 5311 * @return End of the output range. 5312 * @ingroup set_algorithms 5313 * 5314 * This operation iterates over both ranges, copying elements present in 5315 * both ranges in order to the output range. Iterators increment for each 5316 * range. When the current element of one range is less than the other 5317 * according to @p __comp, that iterator advances. If an element is 5318 * contained in both ranges according to @p __comp, the element from the 5319 * first range is copied and both ranges advance. The output range may not 5320 * overlap either input range. 5321 */ 5322 template
5324 _GLIBCXX20_CONSTEXPR 5325 inline _OutputIterator 5326 set_intersection(_InputIterator1 __first1, _InputIterator1 __last1, 5327 _InputIterator2 __first2, _InputIterator2 __last2, 5328 _OutputIterator __result, _Compare __comp) 5329 { 5330 // concept requirements 5331 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>) 5332 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>) 5333 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator, 5334 typename iterator_traits<_InputIterator1>::value_type>) 5335 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare, 5336 typename iterator_traits<_InputIterator1>::value_type, 5337 typename iterator_traits<_InputIterator2>::value_type>) 5338 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare, 5339 typename iterator_traits<_InputIterator2>::value_type, 5340 typename iterator_traits<_InputIterator1>::value_type>) 5341 __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp); 5342 __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp); 5343 __glibcxx_requires_irreflexive_pred2(__first1, __last1, __comp); 5344 __glibcxx_requires_irreflexive_pred2(__first2, __last2, __comp); 5345 5346 return _GLIBCXX_STD_A::__set_intersection(__first1, __last1, 5347 __first2, __last2, __result, 5348 __gnu_cxx::__ops::__iter_comp_iter(__comp)); 5349 } 5350 5351 template
5354 _GLIBCXX20_CONSTEXPR 5355 _OutputIterator 5356 __set_difference(_InputIterator1 __first1, _InputIterator1 __last1, 5357 _InputIterator2 __first2, _InputIterator2 __last2, 5358 _OutputIterator __result, _Compare __comp) 5359 { 5360 while (__first1 != __last1 && __first2 != __last2) 5361 if (__comp(__first1, __first2)) 5362 { 5363 *__result = *__first1; 5364 ++__first1; 5365 ++__result; 5366 } 5367 else if (__comp(__first2, __first1)) 5368 ++__first2; 5369 else 5370 { 5371 ++__first1; 5372 ++__first2; 5373 } 5374 return std::copy(__first1, __last1, __result); 5375 } 5376 5377 /** 5378 * @brief Return the difference of two sorted ranges. 5379 * @ingroup set_algorithms 5380 * @param __first1 Start of first range. 5381 * @param __last1 End of first range. 5382 * @param __first2 Start of second range. 5383 * @param __last2 End of second range. 5384 * @param __result Start of output range. 5385 * @return End of the output range. 5386 * @ingroup set_algorithms 5387 * 5388 * This operation iterates over both ranges, copying elements present in 5389 * the first range but not the second in order to the output range. 5390 * Iterators increment for each range. When the current element of the 5391 * first range is less than the second, that element is copied and the 5392 * iterator advances. If the current element of the second range is less, 5393 * the iterator advances, but no element is copied. If an element is 5394 * contained in both ranges, no elements are copied and both ranges 5395 * advance. The output range may not overlap either input range. 5396 */ 5397 template
5399 _GLIBCXX20_CONSTEXPR 5400 inline _OutputIterator 5401 set_difference(_InputIterator1 __first1, _InputIterator1 __last1, 5402 _InputIterator2 __first2, _InputIterator2 __last2, 5403 _OutputIterator __result) 5404 { 5405 // concept requirements 5406 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>) 5407 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>) 5408 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator, 5409 typename iterator_traits<_InputIterator1>::value_type>) 5410 __glibcxx_function_requires(_LessThanOpConcept< 5411 typename iterator_traits<_InputIterator1>::value_type, 5412 typename iterator_traits<_InputIterator2>::value_type>) 5413 __glibcxx_function_requires(_LessThanOpConcept< 5414 typename iterator_traits<_InputIterator2>::value_type, 5415 typename iterator_traits<_InputIterator1>::value_type>) 5416 __glibcxx_requires_sorted_set(__first1, __last1, __first2); 5417 __glibcxx_requires_sorted_set(__first2, __last2, __first1); 5418 __glibcxx_requires_irreflexive2(__first1, __last1); 5419 __glibcxx_requires_irreflexive2(__first2, __last2); 5420 5421 return _GLIBCXX_STD_A::__set_difference(__first1, __last1, 5422 __first2, __last2, __result, 5423 __gnu_cxx::__ops::__iter_less_iter()); 5424 } 5425 5426 /** 5427 * @brief Return the difference of two sorted ranges using comparison 5428 * functor. 5429 * @ingroup set_algorithms 5430 * @param __first1 Start of first range. 5431 * @param __last1 End of first range. 5432 * @param __first2 Start of second range. 5433 * @param __last2 End of second range. 5434 * @param __result Start of output range. 5435 * @param __comp The comparison functor. 5436 * @return End of the output range. 5437 * @ingroup set_algorithms 5438 * 5439 * This operation iterates over both ranges, copying elements present in 5440 * the first range but not the second in order to the output range. 5441 * Iterators increment for each range. When the current element of the 5442 * first range is less than the second according to @p __comp, that element 5443 * is copied and the iterator advances. If the current element of the 5444 * second range is less, no element is copied and the iterator advances. 5445 * If an element is contained in both ranges according to @p __comp, no 5446 * elements are copied and both ranges advance. The output range may not 5447 * overlap either input range. 5448 */ 5449 template
5451 _GLIBCXX20_CONSTEXPR 5452 inline _OutputIterator 5453 set_difference(_InputIterator1 __first1, _InputIterator1 __last1, 5454 _InputIterator2 __first2, _InputIterator2 __last2, 5455 _OutputIterator __result, _Compare __comp) 5456 { 5457 // concept requirements 5458 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>) 5459 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>) 5460 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator, 5461 typename iterator_traits<_InputIterator1>::value_type>) 5462 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare, 5463 typename iterator_traits<_InputIterator1>::value_type, 5464 typename iterator_traits<_InputIterator2>::value_type>) 5465 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare, 5466 typename iterator_traits<_InputIterator2>::value_type, 5467 typename iterator_traits<_InputIterator1>::value_type>) 5468 __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp); 5469 __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp); 5470 __glibcxx_requires_irreflexive_pred2(__first1, __last1, __comp); 5471 __glibcxx_requires_irreflexive_pred2(__first2, __last2, __comp); 5472 5473 return _GLIBCXX_STD_A::__set_difference(__first1, __last1, 5474 __first2, __last2, __result, 5475 __gnu_cxx::__ops::__iter_comp_iter(__comp)); 5476 } 5477 5478 template
5481 _GLIBCXX20_CONSTEXPR 5482 _OutputIterator 5483 __set_symmetric_difference(_InputIterator1 __first1, 5484 _InputIterator1 __last1, 5485 _InputIterator2 __first2, 5486 _InputIterator2 __last2, 5487 _OutputIterator __result, 5488 _Compare __comp) 5489 { 5490 while (__first1 != __last1 && __first2 != __last2) 5491 if (__comp(__first1, __first2)) 5492 { 5493 *__result = *__first1; 5494 ++__first1; 5495 ++__result; 5496 } 5497 else if (__comp(__first2, __first1)) 5498 { 5499 *__result = *__first2; 5500 ++__first2; 5501 ++__result; 5502 } 5503 else 5504 { 5505 ++__first1; 5506 ++__first2; 5507 } 5508 return std::copy(__first2, __last2, 5509 std::copy(__first1, __last1, __result)); 5510 } 5511 5512 /** 5513 * @brief Return the symmetric difference of two sorted ranges. 5514 * @ingroup set_algorithms 5515 * @param __first1 Start of first range. 5516 * @param __last1 End of first range. 5517 * @param __first2 Start of second range. 5518 * @param __last2 End of second range. 5519 * @param __result Start of output range. 5520 * @return End of the output range. 5521 * @ingroup set_algorithms 5522 * 5523 * This operation iterates over both ranges, copying elements present in 5524 * one range but not the other in order to the output range. Iterators 5525 * increment for each range. When the current element of one range is less 5526 * than the other, that element is copied and the iterator advances. If an 5527 * element is contained in both ranges, no elements are copied and both 5528 * ranges advance. The output range may not overlap either input range. 5529 */ 5530 template
5532 _GLIBCXX20_CONSTEXPR 5533 inline _OutputIterator 5534 set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1, 5535 _InputIterator2 __first2, _InputIterator2 __last2, 5536 _OutputIterator __result) 5537 { 5538 // concept requirements 5539 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>) 5540 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>) 5541 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator, 5542 typename iterator_traits<_InputIterator1>::value_type>) 5543 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator, 5544 typename iterator_traits<_InputIterator2>::value_type>) 5545 __glibcxx_function_requires(_LessThanOpConcept< 5546 typename iterator_traits<_InputIterator1>::value_type, 5547 typename iterator_traits<_InputIterator2>::value_type>) 5548 __glibcxx_function_requires(_LessThanOpConcept< 5549 typename iterator_traits<_InputIterator2>::value_type, 5550 typename iterator_traits<_InputIterator1>::value_type>) 5551 __glibcxx_requires_sorted_set(__first1, __last1, __first2); 5552 __glibcxx_requires_sorted_set(__first2, __last2, __first1); 5553 __glibcxx_requires_irreflexive2(__first1, __last1); 5554 __glibcxx_requires_irreflexive2(__first2, __last2); 5555 5556 return _GLIBCXX_STD_A::__set_symmetric_difference(__first1, __last1, 5557 __first2, __last2, __result, 5558 __gnu_cxx::__ops::__iter_less_iter()); 5559 } 5560 5561 /** 5562 * @brief Return the symmetric difference of two sorted ranges using 5563 * comparison functor. 5564 * @ingroup set_algorithms 5565 * @param __first1 Start of first range. 5566 * @param __last1 End of first range. 5567 * @param __first2 Start of second range. 5568 * @param __last2 End of second range. 5569 * @param __result Start of output range. 5570 * @param __comp The comparison functor. 5571 * @return End of the output range. 5572 * @ingroup set_algorithms 5573 * 5574 * This operation iterates over both ranges, copying elements present in 5575 * one range but not the other in order to the output range. Iterators 5576 * increment for each range. When the current element of one range is less 5577 * than the other according to @p comp, that element is copied and the 5578 * iterator advances. If an element is contained in both ranges according 5579 * to @p __comp, no elements are copied and both ranges advance. The output 5580 * range may not overlap either input range. 5581 */ 5582 template
5584 _GLIBCXX20_CONSTEXPR 5585 inline _OutputIterator 5586 set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1, 5587 _InputIterator2 __first2, _InputIterator2 __last2, 5588 _OutputIterator __result, 5589 _Compare __comp) 5590 { 5591 // concept requirements 5592 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>) 5593 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>) 5594 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator, 5595 typename iterator_traits<_InputIterator1>::value_type>) 5596 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator, 5597 typename iterator_traits<_InputIterator2>::value_type>) 5598 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare, 5599 typename iterator_traits<_InputIterator1>::value_type, 5600 typename iterator_traits<_InputIterator2>::value_type>) 5601 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare, 5602 typename iterator_traits<_InputIterator2>::value_type, 5603 typename iterator_traits<_InputIterator1>::value_type>) 5604 __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp); 5605 __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp); 5606 __glibcxx_requires_irreflexive_pred2(__first1, __last1, __comp); 5607 __glibcxx_requires_irreflexive_pred2(__first2, __last2, __comp); 5608 5609 return _GLIBCXX_STD_A::__set_symmetric_difference(__first1, __last1, 5610 __first2, __last2, __result, 5611 __gnu_cxx::__ops::__iter_comp_iter(__comp)); 5612 } 5613 5614 template
5615 _GLIBCXX14_CONSTEXPR 5616 _ForwardIterator 5617 __min_element(_ForwardIterator __first, _ForwardIterator __last, 5618 _Compare __comp) 5619 { 5620 if (__first == __last) 5621 return __first; 5622 _ForwardIterator __result = __first; 5623 while (++__first != __last) 5624 if (__comp(__first, __result)) 5625 __result = __first; 5626 return __result; 5627 } 5628 5629 /** 5630 * @brief Return the minimum element in a range. 5631 * @ingroup sorting_algorithms 5632 * @param __first Start of range. 5633 * @param __last End of range. 5634 * @return Iterator referencing the first instance of the smallest value. 5635 */ 5636 template
5637 _GLIBCXX14_CONSTEXPR 5638 _ForwardIterator 5639 inline min_element(_ForwardIterator __first, _ForwardIterator __last) 5640 { 5641 // concept requirements 5642 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>) 5643 __glibcxx_function_requires(_LessThanComparableConcept< 5644 typename iterator_traits<_ForwardIterator>::value_type>) 5645 __glibcxx_requires_valid_range(__first, __last); 5646 __glibcxx_requires_irreflexive(__first, __last); 5647 5648 return _GLIBCXX_STD_A::__min_element(__first, __last, 5649 __gnu_cxx::__ops::__iter_less_iter()); 5650 } 5651 5652 /** 5653 * @brief Return the minimum element in a range using comparison functor. 5654 * @ingroup sorting_algorithms 5655 * @param __first Start of range. 5656 * @param __last End of range. 5657 * @param __comp Comparison functor. 5658 * @return Iterator referencing the first instance of the smallest value 5659 * according to __comp. 5660 */ 5661 template
5662 _GLIBCXX14_CONSTEXPR 5663 inline _ForwardIterator 5664 min_element(_ForwardIterator __first, _ForwardIterator __last, 5665 _Compare __comp) 5666 { 5667 // concept requirements 5668 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>) 5669 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare, 5670 typename iterator_traits<_ForwardIterator>::value_type, 5671 typename iterator_traits<_ForwardIterator>::value_type>) 5672 __glibcxx_requires_valid_range(__first, __last); 5673 __glibcxx_requires_irreflexive_pred(__first, __last, __comp); 5674 5675 return _GLIBCXX_STD_A::__min_element(__first, __last, 5676 __gnu_cxx::__ops::__iter_comp_iter(__comp)); 5677 } 5678 5679 template
5680 _GLIBCXX14_CONSTEXPR 5681 _ForwardIterator 5682 __max_element(_ForwardIterator __first, _ForwardIterator __last, 5683 _Compare __comp) 5684 { 5685 if (__first == __last) return __first; 5686 _ForwardIterator __result = __first; 5687 while (++__first != __last) 5688 if (__comp(__result, __first)) 5689 __result = __first; 5690 return __result; 5691 } 5692 5693 /** 5694 * @brief Return the maximum element in a range. 5695 * @ingroup sorting_algorithms 5696 * @param __first Start of range. 5697 * @param __last End of range. 5698 * @return Iterator referencing the first instance of the largest value. 5699 */ 5700 template
5701 _GLIBCXX14_CONSTEXPR 5702 inline _ForwardIterator 5703 max_element(_ForwardIterator __first, _ForwardIterator __last) 5704 { 5705 // concept requirements 5706 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>) 5707 __glibcxx_function_requires(_LessThanComparableConcept< 5708 typename iterator_traits<_ForwardIterator>::value_type>) 5709 __glibcxx_requires_valid_range(__first, __last); 5710 __glibcxx_requires_irreflexive(__first, __last); 5711 5712 return _GLIBCXX_STD_A::__max_element(__first, __last, 5713 __gnu_cxx::__ops::__iter_less_iter()); 5714 } 5715 5716 /** 5717 * @brief Return the maximum element in a range using comparison functor. 5718 * @ingroup sorting_algorithms 5719 * @param __first Start of range. 5720 * @param __last End of range. 5721 * @param __comp Comparison functor. 5722 * @return Iterator referencing the first instance of the largest value 5723 * according to __comp. 5724 */ 5725 template
5726 _GLIBCXX14_CONSTEXPR 5727 inline _ForwardIterator 5728 max_element(_ForwardIterator __first, _ForwardIterator __last, 5729 _Compare __comp) 5730 { 5731 // concept requirements 5732 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>) 5733 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare, 5734 typename iterator_traits<_ForwardIterator>::value_type, 5735 typename iterator_traits<_ForwardIterator>::value_type>) 5736 __glibcxx_requires_valid_range(__first, __last); 5737 __glibcxx_requires_irreflexive_pred(__first, __last, __comp); 5738 5739 return _GLIBCXX_STD_A::__max_element(__first, __last, 5740 __gnu_cxx::__ops::__iter_comp_iter(__comp)); 5741 } 5742 5743 #if __cplusplus >= 201402L 5744 /// Reservoir sampling algorithm. 5745 template
5747 _RandomAccessIterator 5748 __sample(_InputIterator __first, _InputIterator __last, input_iterator_tag, 5749 _RandomAccessIterator __out, random_access_iterator_tag, 5750 _Size __n, _UniformRandomBitGenerator&& __g) 5751 { 5752 using __distrib_type = uniform_int_distribution<_Size>; 5753 using __param_type = typename __distrib_type::param_type; 5754 __distrib_type __d{}; 5755 _Size __sample_sz = 0; 5756 while (__first != __last && __sample_sz != __n) 5757 { 5758 __out[__sample_sz++] = *__first; 5759 ++__first; 5760 } 5761 for (auto __pop_sz = __sample_sz; __first != __last; 5762 ++__first, (void) ++__pop_sz) 5763 { 5764 const auto __k = __d(__g, __param_type{0, __pop_sz}); 5765 if (__k < __n) 5766 __out[__k] = *__first; 5767 } 5768 return __out + __sample_sz; 5769 } 5770 5771 /// Selection sampling algorithm. 5772 template
5774 _OutputIterator 5775 __sample(_ForwardIterator __first, _ForwardIterator __last, 5776 forward_iterator_tag, 5777 _OutputIterator __out, _Cat, 5778 _Size __n, _UniformRandomBitGenerator&& __g) 5779 { 5780 using __distrib_type = uniform_int_distribution<_Size>; 5781 using __param_type = typename __distrib_type::param_type; 5782 using _USize = make_unsigned_t<_Size>; 5783 using _Gen = remove_reference_t<_UniformRandomBitGenerator>; 5784 using __uc_type = common_type_t
; 5785 5786 if (__first == __last) 5787 return __out; 5788 5789 __distrib_type __d{}; 5790 _Size __unsampled_sz = std::distance(__first, __last); 5791 __n = std::min(__n, __unsampled_sz); 5792 5793 // If possible, we use __gen_two_uniform_ints to efficiently produce 5794 // two random numbers using a single distribution invocation: 5795 5796 const __uc_type __urngrange = __g.max() - __g.min(); 5797 if (__urngrange / __uc_type(__unsampled_sz) >= __uc_type(__unsampled_sz)) 5798 // I.e. (__urngrange >= __unsampled_sz * __unsampled_sz) but without 5799 // wrapping issues. 5800 { 5801 while (__n != 0 && __unsampled_sz >= 2) 5802 { 5803 const pair<_Size, _Size> __p = 5804 __gen_two_uniform_ints(__unsampled_sz, __unsampled_sz - 1, __g); 5805 5806 --__unsampled_sz; 5807 if (__p.first < __n) 5808 { 5809 *__out++ = *__first; 5810 --__n; 5811 } 5812 5813 ++__first; 5814 5815 if (__n == 0) break; 5816 5817 --__unsampled_sz; 5818 if (__p.second < __n) 5819 { 5820 *__out++ = *__first; 5821 --__n; 5822 } 5823 5824 ++__first; 5825 } 5826 } 5827 5828 // The loop above is otherwise equivalent to this one-at-a-time version: 5829 5830 for (; __n != 0; ++__first) 5831 if (__d(__g, __param_type{0, --__unsampled_sz}) < __n) 5832 { 5833 *__out++ = *__first; 5834 --__n; 5835 } 5836 return __out; 5837 } 5838 5839 #if __cplusplus > 201402L 5840 #define __cpp_lib_sample 201603 5841 /// Take a random sample from a population. 5842 template
5844 _SampleIterator 5845 sample(_PopulationIterator __first, _PopulationIterator __last, 5846 _SampleIterator __out, _Distance __n, 5847 _UniformRandomBitGenerator&& __g) 5848 { 5849 using __pop_cat = typename 5850 std::iterator_traits<_PopulationIterator>::iterator_category; 5851 using __samp_cat = typename 5852 std::iterator_traits<_SampleIterator>::iterator_category; 5853 5854 static_assert( 5855 __or_
, 5856 is_convertible<__samp_cat, random_access_iterator_tag>>::value, 5857 "output range must use a RandomAccessIterator when input range" 5858 " does not meet the ForwardIterator requirements"); 5859 5860 static_assert(is_integral<_Distance>::value, 5861 "sample size must be an integer type"); 5862 5863 typename iterator_traits<_PopulationIterator>::difference_type __d = __n; 5864 return _GLIBCXX_STD_A:: 5865 __sample(__first, __last, __pop_cat{}, __out, __samp_cat{}, __d, 5866 std::forward<_UniformRandomBitGenerator>(__g)); 5867 } 5868 #endif // C++17 5869 #endif // C++14 5870 5871 _GLIBCXX_END_NAMESPACE_ALGO 5872 _GLIBCXX_END_NAMESPACE_VERSION 5873 } // namespace std 5874 5875 #endif /* _STL_ALGO_H */
Contact us
|
About us
|
Term of use
|
Copyright © 2000-2024 MyWebUniversity.com ™