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