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