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