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