1 // Algorithm implementation -*- C++ -*-
3 // Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
5 // Free Software Foundation, Inc.
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)
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.
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.
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/>.
30 * Hewlett-Packard Company
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.
42 * Silicon Graphics Computer Systems, Inc.
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.
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}
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
66 #ifdef __GXX_EXPERIMENTAL_CXX0X__
67 #include <random> // for std::uniform_int_distribution
68 #include <functional> // for std::bind
71 // See concept_check.h for the __glibcxx_*_requires macros.
73 namespace std _GLIBCXX_VISIBILITY(default)
75 _GLIBCXX_BEGIN_NAMESPACE_VERSION
77 /// Swaps the median value of *__a, *__b and *__c to *__a
78 template<typename _Iterator>
80 __move_median_first(_Iterator __a, _Iterator __b, _Iterator __c)
82 // concept requirements
83 __glibcxx_function_requires(_LessThanComparableConcept<
84 typename iterator_traits<_Iterator>::value_type>)
89 std::iter_swap(__a, __b);
91 std::iter_swap(__a, __c);
96 std::iter_swap(__a, __c);
98 std::iter_swap(__a, __b);
101 /// Swaps the median value of *__a, *__b and *__c under __comp to *__a
102 template<typename _Iterator, typename _Compare>
104 __move_median_first(_Iterator __a, _Iterator __b, _Iterator __c,
107 // concept requirements
108 __glibcxx_function_requires(_BinaryFunctionConcept<_Compare, bool,
109 typename iterator_traits<_Iterator>::value_type,
110 typename iterator_traits<_Iterator>::value_type>)
112 if (__comp(*__a, *__b))
114 if (__comp(*__b, *__c))
115 std::iter_swap(__a, __b);
116 else if (__comp(*__a, *__c))
117 std::iter_swap(__a, __c);
119 else if (__comp(*__a, *__c))
121 else if (__comp(*__b, *__c))
122 std::iter_swap(__a, __c);
124 std::iter_swap(__a, __b);
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)
135 while (__first != __last && !(*__first == __val))
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)
146 while (__first != __last && !bool(__pred(*__first)))
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)
157 typename iterator_traits<_RandomAccessIterator>::difference_type
158 __trip_count = (__last - __first) >> 2;
160 for (; __trip_count > 0; --__trip_count)
162 if (*__first == __val)
166 if (*__first == __val)
170 if (*__first == __val)
174 if (*__first == __val)
179 switch (__last - __first)
182 if (*__first == __val)
186 if (*__first == __val)
190 if (*__first == __val)
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)
205 typename iterator_traits<_RandomAccessIterator>::difference_type
206 __trip_count = (__last - __first) >> 2;
208 for (; __trip_count > 0; --__trip_count)
210 if (__pred(*__first))
214 if (__pred(*__first))
218 if (__pred(*__first))
222 if (__pred(*__first))
227 switch (__last - __first)
230 if (__pred(*__first))
234 if (__pred(*__first))
238 if (__pred(*__first))
247 #ifdef __GXX_EXPERIMENTAL_CXX0X__
248 /// This is an overload used by find_if_not() for the Input Iterator case.
249 template<typename _InputIterator, typename _Predicate>
250 inline _InputIterator
251 __find_if_not(_InputIterator __first, _InputIterator __last,
252 _Predicate __pred, input_iterator_tag)
254 while (__first != __last && bool(__pred(*__first)))
259 /// This is an overload used by find_if_not() for the RAI case.
260 template<typename _RandomAccessIterator, typename _Predicate>
261 _RandomAccessIterator
262 __find_if_not(_RandomAccessIterator __first, _RandomAccessIterator __last,
263 _Predicate __pred, random_access_iterator_tag)
265 typename iterator_traits<_RandomAccessIterator>::difference_type
266 __trip_count = (__last - __first) >> 2;
268 for (; __trip_count > 0; --__trip_count)
270 if (!bool(__pred(*__first)))
274 if (!bool(__pred(*__first)))
278 if (!bool(__pred(*__first)))
282 if (!bool(__pred(*__first)))
287 switch (__last - __first)
290 if (!bool(__pred(*__first)))
294 if (!bool(__pred(*__first)))
298 if (!bool(__pred(*__first)))
310 // set_symmetric_difference
322 * This is an uglified
323 * search_n(_ForwardIterator, _ForwardIterator, _Integer, const _Tp&)
324 * overloaded for forward iterators.
326 template<typename _ForwardIterator, typename _Integer, typename _Tp>
328 __search_n(_ForwardIterator __first, _ForwardIterator __last,
329 _Integer __count, const _Tp& __val,
330 std::forward_iterator_tag)
332 __first = _GLIBCXX_STD_A::find(__first, __last, __val);
333 while (__first != __last)
335 typename iterator_traits<_ForwardIterator>::difference_type
337 _ForwardIterator __i = __first;
339 while (__i != __last && __n != 1 && *__i == __val)
348 __first = _GLIBCXX_STD_A::find(++__i, __last, __val);
354 * This is an uglified
355 * search_n(_ForwardIterator, _ForwardIterator, _Integer, const _Tp&)
356 * overloaded for random access iterators.
358 template<typename _RandomAccessIter, typename _Integer, typename _Tp>
360 __search_n(_RandomAccessIter __first, _RandomAccessIter __last,
361 _Integer __count, const _Tp& __val,
362 std::random_access_iterator_tag)
365 typedef typename std::iterator_traits<_RandomAccessIter>::difference_type
368 _DistanceType __tailSize = __last - __first;
369 const _DistanceType __pattSize = __count;
371 if (__tailSize < __pattSize)
374 const _DistanceType __skipOffset = __pattSize - 1;
375 _RandomAccessIter __lookAhead = __first + __skipOffset;
376 __tailSize -= __pattSize;
378 while (1) // the main loop...
380 // __lookAhead here is always pointing to the last element of next
382 while (!(*__lookAhead == __val)) // the skip loop...
384 if (__tailSize < __pattSize)
385 return __last; // Failure
386 __lookAhead += __pattSize;
387 __tailSize -= __pattSize;
389 _DistanceType __remainder = __skipOffset;
390 for (_RandomAccessIter __backTrack = __lookAhead - 1;
391 *__backTrack == __val; --__backTrack)
393 if (--__remainder == 0)
394 return (__lookAhead - __skipOffset); // Success
396 if (__remainder > __tailSize)
397 return __last; // Failure
398 __lookAhead += __remainder;
399 __tailSize -= __remainder;
406 * This is an uglified
407 * search_n(_ForwardIterator, _ForwardIterator, _Integer, const _Tp&,
409 * overloaded for forward iterators.
411 template<typename _ForwardIterator, typename _Integer, typename _Tp,
412 typename _BinaryPredicate>
414 __search_n(_ForwardIterator __first, _ForwardIterator __last,
415 _Integer __count, const _Tp& __val,
416 _BinaryPredicate __binary_pred, std::forward_iterator_tag)
418 while (__first != __last && !bool(__binary_pred(*__first, __val)))
421 while (__first != __last)
423 typename iterator_traits<_ForwardIterator>::difference_type
425 _ForwardIterator __i = __first;
427 while (__i != __last && __n != 1 && bool(__binary_pred(*__i, __val)))
437 while (__first != __last
438 && !bool(__binary_pred(*__first, __val)))
445 * This is an uglified
446 * search_n(_ForwardIterator, _ForwardIterator, _Integer, const _Tp&,
448 * overloaded for random access iterators.
450 template<typename _RandomAccessIter, typename _Integer, typename _Tp,
451 typename _BinaryPredicate>
453 __search_n(_RandomAccessIter __first, _RandomAccessIter __last,
454 _Integer __count, const _Tp& __val,
455 _BinaryPredicate __binary_pred, std::random_access_iterator_tag)
458 typedef typename std::iterator_traits<_RandomAccessIter>::difference_type
461 _DistanceType __tailSize = __last - __first;
462 const _DistanceType __pattSize = __count;
464 if (__tailSize < __pattSize)
467 const _DistanceType __skipOffset = __pattSize - 1;
468 _RandomAccessIter __lookAhead = __first + __skipOffset;
469 __tailSize -= __pattSize;
471 while (1) // the main loop...
473 // __lookAhead here is always pointing to the last element of next
475 while (!bool(__binary_pred(*__lookAhead, __val))) // the skip loop...
477 if (__tailSize < __pattSize)
478 return __last; // Failure
479 __lookAhead += __pattSize;
480 __tailSize -= __pattSize;
482 _DistanceType __remainder = __skipOffset;
483 for (_RandomAccessIter __backTrack = __lookAhead - 1;
484 __binary_pred(*__backTrack, __val); --__backTrack)
486 if (--__remainder == 0)
487 return (__lookAhead - __skipOffset); // Success
489 if (__remainder > __tailSize)
490 return __last; // Failure
491 __lookAhead += __remainder;
492 __tailSize -= __remainder;
496 // find_end for forward iterators.
497 template<typename _ForwardIterator1, typename _ForwardIterator2>
499 __find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
500 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
501 forward_iterator_tag, forward_iterator_tag)
503 if (__first2 == __last2)
507 _ForwardIterator1 __result = __last1;
510 _ForwardIterator1 __new_result
511 = _GLIBCXX_STD_A::search(__first1, __last1, __first2, __last2);
512 if (__new_result == __last1)
516 __result = __new_result;
517 __first1 = __new_result;
524 template<typename _ForwardIterator1, typename _ForwardIterator2,
525 typename _BinaryPredicate>
527 __find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
528 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
529 forward_iterator_tag, forward_iterator_tag,
530 _BinaryPredicate __comp)
532 if (__first2 == __last2)
536 _ForwardIterator1 __result = __last1;
539 _ForwardIterator1 __new_result
540 = _GLIBCXX_STD_A::search(__first1, __last1, __first2,
542 if (__new_result == __last1)
546 __result = __new_result;
547 __first1 = __new_result;
554 // find_end for bidirectional iterators (much faster).
555 template<typename _BidirectionalIterator1, typename _BidirectionalIterator2>
556 _BidirectionalIterator1
557 __find_end(_BidirectionalIterator1 __first1,
558 _BidirectionalIterator1 __last1,
559 _BidirectionalIterator2 __first2,
560 _BidirectionalIterator2 __last2,
561 bidirectional_iterator_tag, bidirectional_iterator_tag)
563 // concept requirements
564 __glibcxx_function_requires(_BidirectionalIteratorConcept<
565 _BidirectionalIterator1>)
566 __glibcxx_function_requires(_BidirectionalIteratorConcept<
567 _BidirectionalIterator2>)
569 typedef reverse_iterator<_BidirectionalIterator1> _RevIterator1;
570 typedef reverse_iterator<_BidirectionalIterator2> _RevIterator2;
572 _RevIterator1 __rlast1(__first1);
573 _RevIterator2 __rlast2(__first2);
574 _RevIterator1 __rresult = _GLIBCXX_STD_A::search(_RevIterator1(__last1),
576 _RevIterator2(__last2),
579 if (__rresult == __rlast1)
583 _BidirectionalIterator1 __result = __rresult.base();
584 std::advance(__result, -std::distance(__first2, __last2));
589 template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
590 typename _BinaryPredicate>
591 _BidirectionalIterator1
592 __find_end(_BidirectionalIterator1 __first1,
593 _BidirectionalIterator1 __last1,
594 _BidirectionalIterator2 __first2,
595 _BidirectionalIterator2 __last2,
596 bidirectional_iterator_tag, bidirectional_iterator_tag,
597 _BinaryPredicate __comp)
599 // concept requirements
600 __glibcxx_function_requires(_BidirectionalIteratorConcept<
601 _BidirectionalIterator1>)
602 __glibcxx_function_requires(_BidirectionalIteratorConcept<
603 _BidirectionalIterator2>)
605 typedef reverse_iterator<_BidirectionalIterator1> _RevIterator1;
606 typedef reverse_iterator<_BidirectionalIterator2> _RevIterator2;
608 _RevIterator1 __rlast1(__first1);
609 _RevIterator2 __rlast2(__first2);
610 _RevIterator1 __rresult = std::search(_RevIterator1(__last1), __rlast1,
611 _RevIterator2(__last2), __rlast2,
614 if (__rresult == __rlast1)
618 _BidirectionalIterator1 __result = __rresult.base();
619 std::advance(__result, -std::distance(__first2, __last2));
625 * @brief Find last matching subsequence in a sequence.
626 * @ingroup non_mutating_algorithms
627 * @param __first1 Start of range to search.
628 * @param __last1 End of range to search.
629 * @param __first2 Start of sequence to match.
630 * @param __last2 End of sequence to match.
631 * @return The last iterator @c i in the range
632 * @p [__first1,__last1-(__last2-__first2)) such that @c *(i+N) ==
633 * @p *(__first2+N) for each @c N in the range @p
634 * [0,__last2-__first2), or @p __last1 if no such iterator exists.
636 * Searches the range @p [__first1,__last1) for a sub-sequence that
637 * compares equal value-by-value with the sequence given by @p
638 * [__first2,__last2) and returns an iterator to the __first
639 * element of the sub-sequence, or @p __last1 if the sub-sequence
640 * is not found. The sub-sequence will be the last such
641 * subsequence contained in [__first,__last1).
643 * Because the sub-sequence must lie completely within the range @p
644 * [__first1,__last1) it must start at a position less than @p
645 * __last1-(__last2-__first2) where @p __last2-__first2 is the
646 * length of the sub-sequence. This means that the returned
647 * iterator @c i will be in the range @p
648 * [__first1,__last1-(__last2-__first2))
650 template<typename _ForwardIterator1, typename _ForwardIterator2>
651 inline _ForwardIterator1
652 find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
653 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
655 // concept requirements
656 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
657 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
658 __glibcxx_function_requires(_EqualOpConcept<
659 typename iterator_traits<_ForwardIterator1>::value_type,
660 typename iterator_traits<_ForwardIterator2>::value_type>)
661 __glibcxx_requires_valid_range(__first1, __last1);
662 __glibcxx_requires_valid_range(__first2, __last2);
664 return std::__find_end(__first1, __last1, __first2, __last2,
665 std::__iterator_category(__first1),
666 std::__iterator_category(__first2));
670 * @brief Find last matching subsequence in a sequence using a predicate.
671 * @ingroup non_mutating_algorithms
672 * @param __first1 Start of range to search.
673 * @param __last1 End of range to search.
674 * @param __first2 Start of sequence to match.
675 * @param __last2 End of sequence to match.
676 * @param __comp The predicate to use.
677 * @return The last iterator @c i in the range @p
678 * [__first1,__last1-(__last2-__first2)) such that @c
679 * predicate(*(i+N), @p (__first2+N)) is true for each @c N in the
680 * range @p [0,__last2-__first2), or @p __last1 if no such iterator
683 * Searches the range @p [__first1,__last1) for a sub-sequence that
684 * compares equal value-by-value with the sequence given by @p
685 * [__first2,__last2) using comp as a predicate and returns an
686 * iterator to the first element of the sub-sequence, or @p __last1
687 * if the sub-sequence is not found. The sub-sequence will be the
688 * last such subsequence contained in [__first,__last1).
690 * Because the sub-sequence must lie completely within the range @p
691 * [__first1,__last1) it must start at a position less than @p
692 * __last1-(__last2-__first2) where @p __last2-__first2 is the
693 * length of the sub-sequence. This means that the returned
694 * iterator @c i will be in the range @p
695 * [__first1,__last1-(__last2-__first2))
697 template<typename _ForwardIterator1, typename _ForwardIterator2,
698 typename _BinaryPredicate>
699 inline _ForwardIterator1
700 find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
701 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
702 _BinaryPredicate __comp)
704 // concept requirements
705 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
706 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
707 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
708 typename iterator_traits<_ForwardIterator1>::value_type,
709 typename iterator_traits<_ForwardIterator2>::value_type>)
710 __glibcxx_requires_valid_range(__first1, __last1);
711 __glibcxx_requires_valid_range(__first2, __last2);
713 return std::__find_end(__first1, __last1, __first2, __last2,
714 std::__iterator_category(__first1),
715 std::__iterator_category(__first2),
719 #ifdef __GXX_EXPERIMENTAL_CXX0X__
721 * @brief Checks that a predicate is true for all the elements
723 * @ingroup non_mutating_algorithms
724 * @param __first An input iterator.
725 * @param __last An input iterator.
726 * @param __pred A predicate.
727 * @return True if the check is true, false otherwise.
729 * Returns true if @p __pred is true for each element in the range
730 * @p [__first,__last), and false otherwise.
732 template<typename _InputIterator, typename _Predicate>
734 all_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
735 { return __last == std::find_if_not(__first, __last, __pred); }
738 * @brief Checks that a predicate is false for all the elements
740 * @ingroup non_mutating_algorithms
741 * @param __first An input iterator.
742 * @param __last An input iterator.
743 * @param __pred A predicate.
744 * @return True if the check is true, false otherwise.
746 * Returns true if @p __pred is false for each element in the range
747 * @p [__first,__last), and false otherwise.
749 template<typename _InputIterator, typename _Predicate>
751 none_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
752 { return __last == _GLIBCXX_STD_A::find_if(__first, __last, __pred); }
755 * @brief Checks that a predicate is false for at least an element
757 * @ingroup non_mutating_algorithms
758 * @param __first An input iterator.
759 * @param __last An input iterator.
760 * @param __pred A predicate.
761 * @return True if the check is true, false otherwise.
763 * Returns true if an element exists in the range @p
764 * [__first,__last) such that @p __pred is true, and false
767 template<typename _InputIterator, typename _Predicate>
769 any_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
770 { return !std::none_of(__first, __last, __pred); }
773 * @brief Find the first element in a sequence for which a
774 * predicate is false.
775 * @ingroup non_mutating_algorithms
776 * @param __first An input iterator.
777 * @param __last An input iterator.
778 * @param __pred A predicate.
779 * @return The first iterator @c i in the range @p [__first,__last)
780 * such that @p __pred(*i) is false, or @p __last if no such iterator exists.
782 template<typename _InputIterator, typename _Predicate>
783 inline _InputIterator
784 find_if_not(_InputIterator __first, _InputIterator __last,
787 // concept requirements
788 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
789 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
790 typename iterator_traits<_InputIterator>::value_type>)
791 __glibcxx_requires_valid_range(__first, __last);
792 return std::__find_if_not(__first, __last, __pred,
793 std::__iterator_category(__first));
797 * @brief Checks whether the sequence is partitioned.
798 * @ingroup mutating_algorithms
799 * @param __first An input iterator.
800 * @param __last An input iterator.
801 * @param __pred A predicate.
802 * @return True if the range @p [__first,__last) is partioned by @p __pred,
803 * i.e. if all elements that satisfy @p __pred appear before those that
806 template<typename _InputIterator, typename _Predicate>
808 is_partitioned(_InputIterator __first, _InputIterator __last,
811 __first = std::find_if_not(__first, __last, __pred);
812 return std::none_of(__first, __last, __pred);
816 * @brief Find the partition point of a partitioned range.
817 * @ingroup mutating_algorithms
818 * @param __first An iterator.
819 * @param __last Another iterator.
820 * @param __pred A predicate.
821 * @return An iterator @p mid such that @p all_of(__first, mid, __pred)
822 * and @p none_of(mid, __last, __pred) are both true.
824 template<typename _ForwardIterator, typename _Predicate>
826 partition_point(_ForwardIterator __first, _ForwardIterator __last,
829 // concept requirements
830 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
831 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
832 typename iterator_traits<_ForwardIterator>::value_type>)
834 // A specific debug-mode test will be necessary...
835 __glibcxx_requires_valid_range(__first, __last);
837 typedef typename iterator_traits<_ForwardIterator>::difference_type
840 _DistanceType __len = std::distance(__first, __last);
841 _DistanceType __half;
842 _ForwardIterator __middle;
848 std::advance(__middle, __half);
849 if (__pred(*__middle))
853 __len = __len - __half - 1;
864 * @brief Copy a sequence, removing elements of a given value.
865 * @ingroup mutating_algorithms
866 * @param __first An input iterator.
867 * @param __last An input iterator.
868 * @param __result An output iterator.
869 * @param __value The value to be removed.
870 * @return An iterator designating the end of the resulting sequence.
872 * Copies each element in the range @p [__first,__last) not equal
873 * to @p __value to the range beginning at @p __result.
874 * remove_copy() is stable, so the relative order of elements that
875 * are copied is unchanged.
877 template<typename _InputIterator, typename _OutputIterator, typename _Tp>
879 remove_copy(_InputIterator __first, _InputIterator __last,
880 _OutputIterator __result, const _Tp& __value)
882 // concept requirements
883 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
884 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
885 typename iterator_traits<_InputIterator>::value_type>)
886 __glibcxx_function_requires(_EqualOpConcept<
887 typename iterator_traits<_InputIterator>::value_type, _Tp>)
888 __glibcxx_requires_valid_range(__first, __last);
890 for (; __first != __last; ++__first)
891 if (!(*__first == __value))
893 *__result = *__first;
900 * @brief Copy a sequence, removing elements for which a predicate is true.
901 * @ingroup mutating_algorithms
902 * @param __first An input iterator.
903 * @param __last An input iterator.
904 * @param __result An output iterator.
905 * @param __pred A predicate.
906 * @return An iterator designating the end of the resulting sequence.
908 * Copies each element in the range @p [__first,__last) for which
909 * @p __pred returns false to the range beginning at @p __result.
911 * remove_copy_if() is stable, so the relative order of elements that are
912 * copied is unchanged.
914 template<typename _InputIterator, typename _OutputIterator,
917 remove_copy_if(_InputIterator __first, _InputIterator __last,
918 _OutputIterator __result, _Predicate __pred)
920 // concept requirements
921 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
922 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
923 typename iterator_traits<_InputIterator>::value_type>)
924 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
925 typename iterator_traits<_InputIterator>::value_type>)
926 __glibcxx_requires_valid_range(__first, __last);
928 for (; __first != __last; ++__first)
929 if (!bool(__pred(*__first)))
931 *__result = *__first;
937 #ifdef __GXX_EXPERIMENTAL_CXX0X__
939 * @brief Copy the elements of a sequence for which a predicate is true.
940 * @ingroup mutating_algorithms
941 * @param __first An input iterator.
942 * @param __last An input iterator.
943 * @param __result An output iterator.
944 * @param __pred A predicate.
945 * @return An iterator designating the end of the resulting sequence.
947 * Copies each element in the range @p [__first,__last) for which
948 * @p __pred returns true to the range beginning at @p __result.
950 * copy_if() is stable, so the relative order of elements that are
951 * copied is unchanged.
953 template<typename _InputIterator, typename _OutputIterator,
956 copy_if(_InputIterator __first, _InputIterator __last,
957 _OutputIterator __result, _Predicate __pred)
959 // concept requirements
960 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
961 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
962 typename iterator_traits<_InputIterator>::value_type>)
963 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
964 typename iterator_traits<_InputIterator>::value_type>)
965 __glibcxx_requires_valid_range(__first, __last);
967 for (; __first != __last; ++__first)
968 if (__pred(*__first))
970 *__result = *__first;
977 template<typename _InputIterator, typename _Size, typename _OutputIterator>
979 __copy_n(_InputIterator __first, _Size __n,
980 _OutputIterator __result, input_iterator_tag)
986 *__result = *__first;
997 template<typename _RandomAccessIterator, typename _Size,
998 typename _OutputIterator>
999 inline _OutputIterator
1000 __copy_n(_RandomAccessIterator __first, _Size __n,
1001 _OutputIterator __result, random_access_iterator_tag)
1002 { return std::copy(__first, __first + __n, __result); }
1005 * @brief Copies the range [first,first+n) into [result,result+n).
1006 * @ingroup mutating_algorithms
1007 * @param __first An input iterator.
1008 * @param __n The number of elements to copy.
1009 * @param __result An output iterator.
1012 * This inline function will boil down to a call to @c memmove whenever
1013 * possible. Failing that, if random access iterators are passed, then the
1014 * loop count will be known (and therefore a candidate for compiler
1015 * optimizations such as unrolling).
1017 template<typename _InputIterator, typename _Size, typename _OutputIterator>
1018 inline _OutputIterator
1019 copy_n(_InputIterator __first, _Size __n, _OutputIterator __result)
1021 // concept requirements
1022 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
1023 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
1024 typename iterator_traits<_InputIterator>::value_type>)
1026 return std::__copy_n(__first, __n, __result,
1027 std::__iterator_category(__first));
1031 * @brief Copy the elements of a sequence to separate output sequences
1032 * depending on the truth value of a predicate.
1033 * @ingroup mutating_algorithms
1034 * @param __first An input iterator.
1035 * @param __last An input iterator.
1036 * @param __out_true An output iterator.
1037 * @param __out_false An output iterator.
1038 * @param __pred A predicate.
1039 * @return A pair designating the ends of the resulting sequences.
1041 * Copies each element in the range @p [__first,__last) for which
1042 * @p __pred returns true to the range beginning at @p out_true
1043 * and each element for which @p __pred returns false to @p __out_false.
1045 template<typename _InputIterator, typename _OutputIterator1,
1046 typename _OutputIterator2, typename _Predicate>
1047 pair<_OutputIterator1, _OutputIterator2>
1048 partition_copy(_InputIterator __first, _InputIterator __last,
1049 _OutputIterator1 __out_true, _OutputIterator2 __out_false,
1052 // concept requirements
1053 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
1054 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator1,
1055 typename iterator_traits<_InputIterator>::value_type>)
1056 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator2,
1057 typename iterator_traits<_InputIterator>::value_type>)
1058 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
1059 typename iterator_traits<_InputIterator>::value_type>)
1060 __glibcxx_requires_valid_range(__first, __last);
1062 for (; __first != __last; ++__first)
1063 if (__pred(*__first))
1065 *__out_true = *__first;
1070 *__out_false = *__first;
1074 return pair<_OutputIterator1, _OutputIterator2>(__out_true, __out_false);
1079 * @brief Remove elements from a sequence.
1080 * @ingroup mutating_algorithms
1081 * @param __first An input iterator.
1082 * @param __last An input iterator.
1083 * @param __value The value to be removed.
1084 * @return An iterator designating the end of the resulting sequence.
1086 * All elements equal to @p __value are removed from the range
1087 * @p [__first,__last).
1089 * remove() is stable, so the relative order of elements that are
1090 * not removed is unchanged.
1092 * Elements between the end of the resulting sequence and @p __last
1093 * are still present, but their value is unspecified.
1095 template<typename _ForwardIterator, typename _Tp>
1097 remove(_ForwardIterator __first, _ForwardIterator __last,
1100 // concept requirements
1101 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
1103 __glibcxx_function_requires(_EqualOpConcept<
1104 typename iterator_traits<_ForwardIterator>::value_type, _Tp>)
1105 __glibcxx_requires_valid_range(__first, __last);
1107 __first = _GLIBCXX_STD_A::find(__first, __last, __value);
1108 if(__first == __last)
1110 _ForwardIterator __result = __first;
1112 for(; __first != __last; ++__first)
1113 if(!(*__first == __value))
1115 *__result = _GLIBCXX_MOVE(*__first);
1122 * @brief Remove elements from a sequence using a predicate.
1123 * @ingroup mutating_algorithms
1124 * @param __first A forward iterator.
1125 * @param __last A forward iterator.
1126 * @param __pred A predicate.
1127 * @return An iterator designating the end of the resulting sequence.
1129 * All elements for which @p __pred returns true are removed from the range
1130 * @p [__first,__last).
1132 * remove_if() is stable, so the relative order of elements that are
1133 * not removed is unchanged.
1135 * Elements between the end of the resulting sequence and @p __last
1136 * are still present, but their value is unspecified.
1138 template<typename _ForwardIterator, typename _Predicate>
1140 remove_if(_ForwardIterator __first, _ForwardIterator __last,
1143 // concept requirements
1144 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
1146 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
1147 typename iterator_traits<_ForwardIterator>::value_type>)
1148 __glibcxx_requires_valid_range(__first, __last);
1150 __first = _GLIBCXX_STD_A::find_if(__first, __last, __pred);
1151 if(__first == __last)
1153 _ForwardIterator __result = __first;
1155 for(; __first != __last; ++__first)
1156 if(!bool(__pred(*__first)))
1158 *__result = _GLIBCXX_MOVE(*__first);
1165 * @brief Remove consecutive duplicate values from a sequence.
1166 * @ingroup mutating_algorithms
1167 * @param __first A forward iterator.
1168 * @param __last A forward iterator.
1169 * @return An iterator designating the end of the resulting sequence.
1171 * Removes all but the first element from each group of consecutive
1172 * values that compare equal.
1173 * unique() is stable, so the relative order of elements that are
1174 * not removed is unchanged.
1175 * Elements between the end of the resulting sequence and @p __last
1176 * are still present, but their value is unspecified.
1178 template<typename _ForwardIterator>
1180 unique(_ForwardIterator __first, _ForwardIterator __last)
1182 // concept requirements
1183 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
1185 __glibcxx_function_requires(_EqualityComparableConcept<
1186 typename iterator_traits<_ForwardIterator>::value_type>)
1187 __glibcxx_requires_valid_range(__first, __last);
1189 // Skip the beginning, if already unique.
1190 __first = _GLIBCXX_STD_A::adjacent_find(__first, __last);
1191 if (__first == __last)
1194 // Do the real copy work.
1195 _ForwardIterator __dest = __first;
1197 while (++__first != __last)
1198 if (!(*__dest == *__first))
1199 *++__dest = _GLIBCXX_MOVE(*__first);
1204 * @brief Remove consecutive values from a sequence using a predicate.
1205 * @ingroup mutating_algorithms
1206 * @param __first A forward iterator.
1207 * @param __last A forward iterator.
1208 * @param __binary_pred A binary predicate.
1209 * @return An iterator designating the end of the resulting sequence.
1211 * Removes all but the first element from each group of consecutive
1212 * values for which @p __binary_pred returns true.
1213 * unique() is stable, so the relative order of elements that are
1214 * not removed is unchanged.
1215 * Elements between the end of the resulting sequence and @p __last
1216 * are still present, but their value is unspecified.
1218 template<typename _ForwardIterator, typename _BinaryPredicate>
1220 unique(_ForwardIterator __first, _ForwardIterator __last,
1221 _BinaryPredicate __binary_pred)
1223 // concept requirements
1224 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
1226 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
1227 typename iterator_traits<_ForwardIterator>::value_type,
1228 typename iterator_traits<_ForwardIterator>::value_type>)
1229 __glibcxx_requires_valid_range(__first, __last);
1231 // Skip the beginning, if already unique.
1232 __first = _GLIBCXX_STD_A::adjacent_find(__first, __last, __binary_pred);
1233 if (__first == __last)
1236 // Do the real copy work.
1237 _ForwardIterator __dest = __first;
1239 while (++__first != __last)
1240 if (!bool(__binary_pred(*__dest, *__first)))
1241 *++__dest = _GLIBCXX_MOVE(*__first);
1246 * This is an uglified unique_copy(_InputIterator, _InputIterator,
1248 * overloaded for forward iterators and output iterator as result.
1250 template<typename _ForwardIterator, typename _OutputIterator>
1252 __unique_copy(_ForwardIterator __first, _ForwardIterator __last,
1253 _OutputIterator __result,
1254 forward_iterator_tag, output_iterator_tag)
1256 // concept requirements -- taken care of in dispatching function
1257 _ForwardIterator __next = __first;
1258 *__result = *__first;
1259 while (++__next != __last)
1260 if (!(*__first == *__next))
1263 *++__result = *__first;
1269 * This is an uglified unique_copy(_InputIterator, _InputIterator,
1271 * overloaded for input iterators and output iterator as result.
1273 template<typename _InputIterator, typename _OutputIterator>
1275 __unique_copy(_InputIterator __first, _InputIterator __last,
1276 _OutputIterator __result,
1277 input_iterator_tag, output_iterator_tag)
1279 // concept requirements -- taken care of in dispatching function
1280 typename iterator_traits<_InputIterator>::value_type __value = *__first;
1281 *__result = __value;
1282 while (++__first != __last)
1283 if (!(__value == *__first))
1286 *++__result = __value;
1292 * This is an uglified unique_copy(_InputIterator, _InputIterator,
1294 * overloaded for input iterators and forward iterator as result.
1296 template<typename _InputIterator, typename _ForwardIterator>
1298 __unique_copy(_InputIterator __first, _InputIterator __last,
1299 _ForwardIterator __result,
1300 input_iterator_tag, forward_iterator_tag)
1302 // concept requirements -- taken care of in dispatching function
1303 *__result = *__first;
1304 while (++__first != __last)
1305 if (!(*__result == *__first))
1306 *++__result = *__first;
1311 * This is an uglified
1312 * unique_copy(_InputIterator, _InputIterator, _OutputIterator,
1314 * overloaded for forward iterators and output iterator as result.
1316 template<typename _ForwardIterator, typename _OutputIterator,
1317 typename _BinaryPredicate>
1319 __unique_copy(_ForwardIterator __first, _ForwardIterator __last,
1320 _OutputIterator __result, _BinaryPredicate __binary_pred,
1321 forward_iterator_tag, output_iterator_tag)
1323 // concept requirements -- iterators already checked
1324 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
1325 typename iterator_traits<_ForwardIterator>::value_type,
1326 typename iterator_traits<_ForwardIterator>::value_type>)
1328 _ForwardIterator __next = __first;
1329 *__result = *__first;
1330 while (++__next != __last)
1331 if (!bool(__binary_pred(*__first, *__next)))
1334 *++__result = *__first;
1340 * This is an uglified
1341 * unique_copy(_InputIterator, _InputIterator, _OutputIterator,
1343 * overloaded for input iterators and output iterator as result.
1345 template<typename _InputIterator, typename _OutputIterator,
1346 typename _BinaryPredicate>
1348 __unique_copy(_InputIterator __first, _InputIterator __last,
1349 _OutputIterator __result, _BinaryPredicate __binary_pred,
1350 input_iterator_tag, output_iterator_tag)
1352 // concept requirements -- iterators already checked
1353 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
1354 typename iterator_traits<_InputIterator>::value_type,
1355 typename iterator_traits<_InputIterator>::value_type>)
1357 typename iterator_traits<_InputIterator>::value_type __value = *__first;
1358 *__result = __value;
1359 while (++__first != __last)
1360 if (!bool(__binary_pred(__value, *__first)))
1363 *++__result = __value;
1369 * This is an uglified
1370 * unique_copy(_InputIterator, _InputIterator, _OutputIterator,
1372 * overloaded for input iterators and forward iterator as result.
1374 template<typename _InputIterator, typename _ForwardIterator,
1375 typename _BinaryPredicate>
1377 __unique_copy(_InputIterator __first, _InputIterator __last,
1378 _ForwardIterator __result, _BinaryPredicate __binary_pred,
1379 input_iterator_tag, forward_iterator_tag)
1381 // concept requirements -- iterators already checked
1382 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
1383 typename iterator_traits<_ForwardIterator>::value_type,
1384 typename iterator_traits<_InputIterator>::value_type>)
1386 *__result = *__first;
1387 while (++__first != __last)
1388 if (!bool(__binary_pred(*__result, *__first)))
1389 *++__result = *__first;
1394 * This is an uglified reverse(_BidirectionalIterator,
1395 * _BidirectionalIterator)
1396 * overloaded for bidirectional iterators.
1398 template<typename _BidirectionalIterator>
1400 __reverse(_BidirectionalIterator __first, _BidirectionalIterator __last,
1401 bidirectional_iterator_tag)
1404 if (__first == __last || __first == --__last)
1408 std::iter_swap(__first, __last);
1414 * This is an uglified reverse(_BidirectionalIterator,
1415 * _BidirectionalIterator)
1416 * overloaded for random access iterators.
1418 template<typename _RandomAccessIterator>
1420 __reverse(_RandomAccessIterator __first, _RandomAccessIterator __last,
1421 random_access_iterator_tag)
1423 if (__first == __last)
1426 while (__first < __last)
1428 std::iter_swap(__first, __last);
1435 * @brief Reverse a sequence.
1436 * @ingroup mutating_algorithms
1437 * @param __first A bidirectional iterator.
1438 * @param __last A bidirectional iterator.
1439 * @return reverse() returns no value.
1441 * Reverses the order of the elements in the range @p [__first,__last),
1442 * so that the first element becomes the last etc.
1443 * For every @c i such that @p 0<=i<=(__last-__first)/2), @p reverse()
1444 * swaps @p *(__first+i) and @p *(__last-(i+1))
1446 template<typename _BidirectionalIterator>
1448 reverse(_BidirectionalIterator __first, _BidirectionalIterator __last)
1450 // concept requirements
1451 __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
1452 _BidirectionalIterator>)
1453 __glibcxx_requires_valid_range(__first, __last);
1454 std::__reverse(__first, __last, std::__iterator_category(__first));
1458 * @brief Copy a sequence, reversing its elements.
1459 * @ingroup mutating_algorithms
1460 * @param __first A bidirectional iterator.
1461 * @param __last A bidirectional iterator.
1462 * @param __result An output iterator.
1463 * @return An iterator designating the end of the resulting sequence.
1465 * Copies the elements in the range @p [__first,__last) to the
1466 * range @p [__result,__result+(__last-__first)) such that the
1467 * order of the elements is reversed. For every @c i such that @p
1468 * 0<=i<=(__last-__first), @p reverse_copy() performs the
1469 * assignment @p *(__result+(__last-__first)-i) = *(__first+i).
1470 * The ranges @p [__first,__last) and @p
1471 * [__result,__result+(__last-__first)) must not overlap.
1473 template<typename _BidirectionalIterator, typename _OutputIterator>
1475 reverse_copy(_BidirectionalIterator __first, _BidirectionalIterator __last,
1476 _OutputIterator __result)
1478 // concept requirements
1479 __glibcxx_function_requires(_BidirectionalIteratorConcept<
1480 _BidirectionalIterator>)
1481 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
1482 typename iterator_traits<_BidirectionalIterator>::value_type>)
1483 __glibcxx_requires_valid_range(__first, __last);
1485 while (__first != __last)
1488 *__result = *__last;
1495 * This is a helper function for the rotate algorithm specialized on RAIs.
1496 * It returns the greatest common divisor of two integer values.
1498 template<typename _EuclideanRingElement>
1499 _EuclideanRingElement
1500 __gcd(_EuclideanRingElement __m, _EuclideanRingElement __n)
1504 _EuclideanRingElement __t = __m % __n;
1511 /// This is a helper function for the rotate algorithm.
1512 template<typename _ForwardIterator>
1514 __rotate(_ForwardIterator __first,
1515 _ForwardIterator __middle,
1516 _ForwardIterator __last,
1517 forward_iterator_tag)
1519 if (__first == __middle || __last == __middle)
1522 _ForwardIterator __first2 = __middle;
1525 std::iter_swap(__first, __first2);
1528 if (__first == __middle)
1529 __middle = __first2;
1531 while (__first2 != __last);
1533 __first2 = __middle;
1535 while (__first2 != __last)
1537 std::iter_swap(__first, __first2);
1540 if (__first == __middle)
1541 __middle = __first2;
1542 else if (__first2 == __last)
1543 __first2 = __middle;
1547 /// This is a helper function for the rotate algorithm.
1548 template<typename _BidirectionalIterator>
1550 __rotate(_BidirectionalIterator __first,
1551 _BidirectionalIterator __middle,
1552 _BidirectionalIterator __last,
1553 bidirectional_iterator_tag)
1555 // concept requirements
1556 __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
1557 _BidirectionalIterator>)
1559 if (__first == __middle || __last == __middle)
1562 std::__reverse(__first, __middle, bidirectional_iterator_tag());
1563 std::__reverse(__middle, __last, bidirectional_iterator_tag());
1565 while (__first != __middle && __middle != __last)
1567 std::iter_swap(__first, --__last);
1571 if (__first == __middle)
1572 std::__reverse(__middle, __last, bidirectional_iterator_tag());
1574 std::__reverse(__first, __middle, bidirectional_iterator_tag());
1577 /// This is a helper function for the rotate algorithm.
1578 template<typename _RandomAccessIterator>
1580 __rotate(_RandomAccessIterator __first,
1581 _RandomAccessIterator __middle,
1582 _RandomAccessIterator __last,
1583 random_access_iterator_tag)
1585 // concept requirements
1586 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
1587 _RandomAccessIterator>)
1589 if (__first == __middle || __last == __middle)
1592 typedef typename iterator_traits<_RandomAccessIterator>::difference_type
1594 typedef typename iterator_traits<_RandomAccessIterator>::value_type
1597 _Distance __n = __last - __first;
1598 _Distance __k = __middle - __first;
1600 if (__k == __n - __k)
1602 std::swap_ranges(__first, __middle, __middle);
1606 _RandomAccessIterator __p = __first;
1610 if (__k < __n - __k)
1612 if (__is_pod(_ValueType) && __k == 1)
1614 _ValueType __t = _GLIBCXX_MOVE(*__p);
1615 _GLIBCXX_MOVE3(__p + 1, __p + __n, __p);
1616 *(__p + __n - 1) = _GLIBCXX_MOVE(__t);
1619 _RandomAccessIterator __q = __p + __k;
1620 for (_Distance __i = 0; __i < __n - __k; ++ __i)
1622 std::iter_swap(__p, __q);
1629 std::swap(__n, __k);
1635 if (__is_pod(_ValueType) && __k == 1)
1637 _ValueType __t = _GLIBCXX_MOVE(*(__p + __n - 1));
1638 _GLIBCXX_MOVE_BACKWARD3(__p, __p + __n - 1, __p + __n);
1639 *__p = _GLIBCXX_MOVE(__t);
1642 _RandomAccessIterator __q = __p + __n;
1644 for (_Distance __i = 0; __i < __n - __k; ++ __i)
1648 std::iter_swap(__p, __q);
1653 std::swap(__n, __k);
1659 * @brief Rotate the elements of a sequence.
1660 * @ingroup mutating_algorithms
1661 * @param __first A forward iterator.
1662 * @param __middle A forward iterator.
1663 * @param __last A forward iterator.
1666 * Rotates the elements of the range @p [__first,__last) by
1667 * @p(__middle - __first) positions so that the element at @p __middle
1668 * is moved to @p __first, the element at @p __middle+1 is moved to
1669 * @ __first+1 and so on for each element in the range
1670 * @p [__first,__last).
1672 * This effectively swaps the ranges @p [__first,__middle) and
1673 * @p [__middle,__last).
1676 * @p *(__first+(n+(__last-__middle))%(__last-__first))=*(__first+n)
1677 * for each @p n in the range @p [0,__last-__first).
1679 template<typename _ForwardIterator>
1681 rotate(_ForwardIterator __first, _ForwardIterator __middle,
1682 _ForwardIterator __last)
1684 // concept requirements
1685 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
1687 __glibcxx_requires_valid_range(__first, __middle);
1688 __glibcxx_requires_valid_range(__middle, __last);
1690 typedef typename iterator_traits<_ForwardIterator>::iterator_category
1692 std::__rotate(__first, __middle, __last, _IterType());
1696 * @brief Copy a sequence, rotating its elements.
1697 * @ingroup mutating_algorithms
1698 * @param __first A forward iterator.
1699 * @param __middle A forward iterator.
1700 * @param __last A forward iterator.
1701 * @param __result An output iterator.
1702 * @return An iterator designating the end of the resulting sequence.
1704 * Copies the elements of the range @p [__first,__last) to the
1705 * range beginning at @result, rotating the copied elements by
1706 * @p (__middle-__first) positions so that the element at @p __middle
1707 * is moved to @p __result, the element at @p __middle+1 is moved
1708 * to @__result+1 and so on for each element in the range @p
1712 * @p *(__result+(n+(__last-__middle))%(__last-__first))=*(__first+n)
1713 * for each @p n in the range @p [0,__last-__first).
1715 template<typename _ForwardIterator, typename _OutputIterator>
1717 rotate_copy(_ForwardIterator __first, _ForwardIterator __middle,
1718 _ForwardIterator __last, _OutputIterator __result)
1720 // concept requirements
1721 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
1722 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
1723 typename iterator_traits<_ForwardIterator>::value_type>)
1724 __glibcxx_requires_valid_range(__first, __middle);
1725 __glibcxx_requires_valid_range(__middle, __last);
1727 return std::copy(__first, __middle,
1728 std::copy(__middle, __last, __result));
1731 /// This is a helper function...
1732 template<typename _ForwardIterator, typename _Predicate>
1734 __partition(_ForwardIterator __first, _ForwardIterator __last,
1735 _Predicate __pred, forward_iterator_tag)
1737 if (__first == __last)
1740 while (__pred(*__first))
1741 if (++__first == __last)
1744 _ForwardIterator __next = __first;
1746 while (++__next != __last)
1747 if (__pred(*__next))
1749 std::iter_swap(__first, __next);
1756 /// This is a helper function...
1757 template<typename _BidirectionalIterator, typename _Predicate>
1758 _BidirectionalIterator
1759 __partition(_BidirectionalIterator __first, _BidirectionalIterator __last,
1760 _Predicate __pred, bidirectional_iterator_tag)
1765 if (__first == __last)
1767 else if (__pred(*__first))
1773 if (__first == __last)
1775 else if (!bool(__pred(*__last)))
1779 std::iter_swap(__first, __last);
1786 /// This is a helper function...
1787 template<typename _ForwardIterator, typename _Predicate, typename _Distance>
1789 __inplace_stable_partition(_ForwardIterator __first,
1790 _ForwardIterator __last,
1791 _Predicate __pred, _Distance __len)
1794 return __pred(*__first) ? __last : __first;
1795 _ForwardIterator __middle = __first;
1796 std::advance(__middle, __len / 2);
1797 _ForwardIterator __begin = std::__inplace_stable_partition(__first,
1801 _ForwardIterator __end = std::__inplace_stable_partition(__middle, __last,
1805 std::rotate(__begin, __middle, __end);
1806 std::advance(__begin, std::distance(__middle, __end));
1810 /// This is a helper function...
1811 template<typename _ForwardIterator, typename _Pointer, typename _Predicate,
1814 __stable_partition_adaptive(_ForwardIterator __first,
1815 _ForwardIterator __last,
1816 _Predicate __pred, _Distance __len,
1818 _Distance __buffer_size)
1820 if (__len <= __buffer_size)
1822 _ForwardIterator __result1 = __first;
1823 _Pointer __result2 = __buffer;
1824 for (; __first != __last; ++__first)
1825 if (__pred(*__first))
1827 *__result1 = _GLIBCXX_MOVE(*__first);
1832 *__result2 = _GLIBCXX_MOVE(*__first);
1835 _GLIBCXX_MOVE3(__buffer, __result2, __result1);
1840 _ForwardIterator __middle = __first;
1841 std::advance(__middle, __len / 2);
1842 _ForwardIterator __begin =
1843 std::__stable_partition_adaptive(__first, __middle, __pred,
1844 __len / 2, __buffer,
1846 _ForwardIterator __end =
1847 std::__stable_partition_adaptive(__middle, __last, __pred,
1849 __buffer, __buffer_size);
1850 std::rotate(__begin, __middle, __end);
1851 std::advance(__begin, std::distance(__middle, __end));
1857 * @brief Move elements for which a predicate is true to the beginning
1858 * of a sequence, preserving relative ordering.
1859 * @ingroup mutating_algorithms
1860 * @param __first A forward iterator.
1861 * @param __last A forward iterator.
1862 * @param __pred A predicate functor.
1863 * @return An iterator @p middle such that @p __pred(i) is true for each
1864 * iterator @p i in the range @p [first,middle) and false for each @p i
1865 * in the range @p [middle,last).
1867 * Performs the same function as @p partition() with the additional
1868 * guarantee that the relative ordering of elements in each group is
1869 * preserved, so any two elements @p x and @p y in the range
1870 * @p [__first,__last) such that @p __pred(x)==__pred(y) will have the same
1871 * relative ordering after calling @p stable_partition().
1873 template<typename _ForwardIterator, typename _Predicate>
1875 stable_partition(_ForwardIterator __first, _ForwardIterator __last,
1878 // concept requirements
1879 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
1881 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
1882 typename iterator_traits<_ForwardIterator>::value_type>)
1883 __glibcxx_requires_valid_range(__first, __last);
1885 if (__first == __last)
1889 typedef typename iterator_traits<_ForwardIterator>::value_type
1891 typedef typename iterator_traits<_ForwardIterator>::difference_type
1894 _Temporary_buffer<_ForwardIterator, _ValueType> __buf(__first,
1896 if (__buf.size() > 0)
1898 std::__stable_partition_adaptive(__first, __last, __pred,
1899 _DistanceType(__buf.requested_size()),
1901 _DistanceType(__buf.size()));
1904 std::__inplace_stable_partition(__first, __last, __pred,
1905 _DistanceType(__buf.requested_size()));
1909 /// This is a helper function for the sort routines.
1910 template<typename _RandomAccessIterator>
1912 __heap_select(_RandomAccessIterator __first,
1913 _RandomAccessIterator __middle,
1914 _RandomAccessIterator __last)
1916 std::make_heap(__first, __middle);
1917 for (_RandomAccessIterator __i = __middle; __i < __last; ++__i)
1918 if (*__i < *__first)
1919 std::__pop_heap(__first, __middle, __i);
1922 /// This is a helper function for the sort routines.
1923 template<typename _RandomAccessIterator, typename _Compare>
1925 __heap_select(_RandomAccessIterator __first,
1926 _RandomAccessIterator __middle,
1927 _RandomAccessIterator __last, _Compare __comp)
1929 std::make_heap(__first, __middle, __comp);
1930 for (_RandomAccessIterator __i = __middle; __i < __last; ++__i)
1931 if (__comp(*__i, *__first))
1932 std::__pop_heap(__first, __middle, __i, __comp);
1938 * @brief Copy the smallest elements of a sequence.
1939 * @ingroup sorting_algorithms
1940 * @param __first An iterator.
1941 * @param __last Another iterator.
1942 * @param __result_first A random-access iterator.
1943 * @param __result_last Another random-access iterator.
1944 * @return An iterator indicating the end of the resulting sequence.
1946 * Copies and sorts the smallest N values from the range @p [__first,__last)
1947 * to the range beginning at @p __result_first, where the number of
1948 * elements to be copied, @p N, is the smaller of @p (__last-__first) and
1949 * @p (__result_last-__result_first).
1950 * After the sort if @p i and @j are iterators in the range
1951 * @p [__result_first,__result_first+N) such that @i precedes @j then
1952 * @p *j<*i is false.
1953 * The value returned is @p __result_first+N.
1955 template<typename _InputIterator, typename _RandomAccessIterator>
1956 _RandomAccessIterator
1957 partial_sort_copy(_InputIterator __first, _InputIterator __last,
1958 _RandomAccessIterator __result_first,
1959 _RandomAccessIterator __result_last)
1961 typedef typename iterator_traits<_InputIterator>::value_type
1963 typedef typename iterator_traits<_RandomAccessIterator>::value_type
1965 typedef typename iterator_traits<_RandomAccessIterator>::difference_type
1968 // concept requirements
1969 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
1970 __glibcxx_function_requires(_ConvertibleConcept<_InputValueType,
1972 __glibcxx_function_requires(_LessThanOpConcept<_InputValueType,
1974 __glibcxx_function_requires(_LessThanComparableConcept<_OutputValueType>)
1975 __glibcxx_requires_valid_range(__first, __last);
1976 __glibcxx_requires_valid_range(__result_first, __result_last);
1978 if (__result_first == __result_last)
1979 return __result_last;
1980 _RandomAccessIterator __result_real_last = __result_first;
1981 while(__first != __last && __result_real_last != __result_last)
1983 *__result_real_last = *__first;
1984 ++__result_real_last;
1987 std::make_heap(__result_first, __result_real_last);
1988 while (__first != __last)
1990 if (*__first < *__result_first)
1991 std::__adjust_heap(__result_first, _DistanceType(0),
1992 _DistanceType(__result_real_last
1994 _InputValueType(*__first));
1997 std::sort_heap(__result_first, __result_real_last);
1998 return __result_real_last;
2002 * @brief Copy the smallest elements of a sequence using a predicate for
2004 * @ingroup sorting_algorithms
2005 * @param __first An input iterator.
2006 * @param __last Another input iterator.
2007 * @param __result_first A random-access iterator.
2008 * @param __result_last Another random-access iterator.
2009 * @param __comp A comparison functor.
2010 * @return An iterator indicating the end of the resulting sequence.
2012 * Copies and sorts the smallest N values from the range @p [__first,__last)
2013 * to the range beginning at @p result_first, where the number of
2014 * elements to be copied, @p N, is the smaller of @p (__last-__first) and
2015 * @p (__result_last-__result_first).
2016 * After the sort if @p i and @j are iterators in the range
2017 * @p [__result_first,__result_first+N) such that @i precedes @j then
2018 * @p __comp(*j,*i) is false.
2019 * The value returned is @p __result_first+N.
2021 template<typename _InputIterator, typename _RandomAccessIterator, typename _Compare>
2022 _RandomAccessIterator
2023 partial_sort_copy(_InputIterator __first, _InputIterator __last,
2024 _RandomAccessIterator __result_first,
2025 _RandomAccessIterator __result_last,
2028 typedef typename iterator_traits<_InputIterator>::value_type
2030 typedef typename iterator_traits<_RandomAccessIterator>::value_type
2032 typedef typename iterator_traits<_RandomAccessIterator>::difference_type
2035 // concept requirements
2036 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
2037 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
2038 _RandomAccessIterator>)
2039 __glibcxx_function_requires(_ConvertibleConcept<_InputValueType,
2041 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2042 _InputValueType, _OutputValueType>)
2043 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2044 _OutputValueType, _OutputValueType>)
2045 __glibcxx_requires_valid_range(__first, __last);
2046 __glibcxx_requires_valid_range(__result_first, __result_last);
2048 if (__result_first == __result_last)
2049 return __result_last;
2050 _RandomAccessIterator __result_real_last = __result_first;
2051 while(__first != __last && __result_real_last != __result_last)
2053 *__result_real_last = *__first;
2054 ++__result_real_last;
2057 std::make_heap(__result_first, __result_real_last, __comp);
2058 while (__first != __last)
2060 if (__comp(*__first, *__result_first))
2061 std::__adjust_heap(__result_first, _DistanceType(0),
2062 _DistanceType(__result_real_last
2064 _InputValueType(*__first),
2068 std::sort_heap(__result_first, __result_real_last, __comp);
2069 return __result_real_last;
2072 /// This is a helper function for the sort routine.
2073 template<typename _RandomAccessIterator>
2075 __unguarded_linear_insert(_RandomAccessIterator __last)
2077 typename iterator_traits<_RandomAccessIterator>::value_type
2078 __val = _GLIBCXX_MOVE(*__last);
2079 _RandomAccessIterator __next = __last;
2081 while (__val < *__next)
2083 *__last = _GLIBCXX_MOVE(*__next);
2087 *__last = _GLIBCXX_MOVE(__val);
2090 /// This is a helper function for the sort routine.
2091 template<typename _RandomAccessIterator, typename _Compare>
2093 __unguarded_linear_insert(_RandomAccessIterator __last,
2096 typename iterator_traits<_RandomAccessIterator>::value_type
2097 __val = _GLIBCXX_MOVE(*__last);
2098 _RandomAccessIterator __next = __last;
2100 while (__comp(__val, *__next))
2102 *__last = _GLIBCXX_MOVE(*__next);
2106 *__last = _GLIBCXX_MOVE(__val);
2109 /// This is a helper function for the sort routine.
2110 template<typename _RandomAccessIterator>
2112 __insertion_sort(_RandomAccessIterator __first,
2113 _RandomAccessIterator __last)
2115 if (__first == __last)
2118 for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
2120 if (*__i < *__first)
2122 typename iterator_traits<_RandomAccessIterator>::value_type
2123 __val = _GLIBCXX_MOVE(*__i);
2124 _GLIBCXX_MOVE_BACKWARD3(__first, __i, __i + 1);
2125 *__first = _GLIBCXX_MOVE(__val);
2128 std::__unguarded_linear_insert(__i);
2132 /// This is a helper function for the sort routine.
2133 template<typename _RandomAccessIterator, typename _Compare>
2135 __insertion_sort(_RandomAccessIterator __first,
2136 _RandomAccessIterator __last, _Compare __comp)
2138 if (__first == __last) return;
2140 for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
2142 if (__comp(*__i, *__first))
2144 typename iterator_traits<_RandomAccessIterator>::value_type
2145 __val = _GLIBCXX_MOVE(*__i);
2146 _GLIBCXX_MOVE_BACKWARD3(__first, __i, __i + 1);
2147 *__first = _GLIBCXX_MOVE(__val);
2150 std::__unguarded_linear_insert(__i, __comp);
2154 /// This is a helper function for the sort routine.
2155 template<typename _RandomAccessIterator>
2157 __unguarded_insertion_sort(_RandomAccessIterator __first,
2158 _RandomAccessIterator __last)
2160 typedef typename iterator_traits<_RandomAccessIterator>::value_type
2163 for (_RandomAccessIterator __i = __first; __i != __last; ++__i)
2164 std::__unguarded_linear_insert(__i);
2167 /// This is a helper function for the sort routine.
2168 template<typename _RandomAccessIterator, typename _Compare>
2170 __unguarded_insertion_sort(_RandomAccessIterator __first,
2171 _RandomAccessIterator __last, _Compare __comp)
2173 typedef typename iterator_traits<_RandomAccessIterator>::value_type
2176 for (_RandomAccessIterator __i = __first; __i != __last; ++__i)
2177 std::__unguarded_linear_insert(__i, __comp);
2182 * This controls some aspect of the sort routines.
2184 enum { _S_threshold = 16 };
2186 /// This is a helper function for the sort routine.
2187 template<typename _RandomAccessIterator>
2189 __final_insertion_sort(_RandomAccessIterator __first,
2190 _RandomAccessIterator __last)
2192 if (__last - __first > int(_S_threshold))
2194 std::__insertion_sort(__first, __first + int(_S_threshold));
2195 std::__unguarded_insertion_sort(__first + int(_S_threshold), __last);
2198 std::__insertion_sort(__first, __last);
2201 /// This is a helper function for the sort routine.
2202 template<typename _RandomAccessIterator, typename _Compare>
2204 __final_insertion_sort(_RandomAccessIterator __first,
2205 _RandomAccessIterator __last, _Compare __comp)
2207 if (__last - __first > int(_S_threshold))
2209 std::__insertion_sort(__first, __first + int(_S_threshold), __comp);
2210 std::__unguarded_insertion_sort(__first + int(_S_threshold), __last,
2214 std::__insertion_sort(__first, __last, __comp);
2217 /// This is a helper function...
2218 template<typename _RandomAccessIterator, typename _Tp>
2219 _RandomAccessIterator
2220 __unguarded_partition(_RandomAccessIterator __first,
2221 _RandomAccessIterator __last, const _Tp& __pivot)
2225 while (*__first < __pivot)
2228 while (__pivot < *__last)
2230 if (!(__first < __last))
2232 std::iter_swap(__first, __last);
2237 /// This is a helper function...
2238 template<typename _RandomAccessIterator, typename _Tp, typename _Compare>
2239 _RandomAccessIterator
2240 __unguarded_partition(_RandomAccessIterator __first,
2241 _RandomAccessIterator __last,
2242 const _Tp& __pivot, _Compare __comp)
2246 while (__comp(*__first, __pivot))
2249 while (__comp(__pivot, *__last))
2251 if (!(__first < __last))
2253 std::iter_swap(__first, __last);
2258 /// This is a helper function...
2259 template<typename _RandomAccessIterator>
2260 inline _RandomAccessIterator
2261 __unguarded_partition_pivot(_RandomAccessIterator __first,
2262 _RandomAccessIterator __last)
2264 _RandomAccessIterator __mid = __first + (__last - __first) / 2;
2265 std::__move_median_first(__first, __mid, (__last - 1));
2266 return std::__unguarded_partition(__first + 1, __last, *__first);
2270 /// This is a helper function...
2271 template<typename _RandomAccessIterator, typename _Compare>
2272 inline _RandomAccessIterator
2273 __unguarded_partition_pivot(_RandomAccessIterator __first,
2274 _RandomAccessIterator __last, _Compare __comp)
2276 _RandomAccessIterator __mid = __first + (__last - __first) / 2;
2277 std::__move_median_first(__first, __mid, (__last - 1), __comp);
2278 return std::__unguarded_partition(__first + 1, __last, *__first, __comp);
2281 /// This is a helper function for the sort routine.
2282 template<typename _RandomAccessIterator, typename _Size>
2284 __introsort_loop(_RandomAccessIterator __first,
2285 _RandomAccessIterator __last,
2286 _Size __depth_limit)
2288 while (__last - __first > int(_S_threshold))
2290 if (__depth_limit == 0)
2292 _GLIBCXX_STD_A::partial_sort(__first, __last, __last);
2296 _RandomAccessIterator __cut =
2297 std::__unguarded_partition_pivot(__first, __last);
2298 std::__introsort_loop(__cut, __last, __depth_limit);
2303 /// This is a helper function for the sort routine.
2304 template<typename _RandomAccessIterator, typename _Size, typename _Compare>
2306 __introsort_loop(_RandomAccessIterator __first,
2307 _RandomAccessIterator __last,
2308 _Size __depth_limit, _Compare __comp)
2310 while (__last - __first > int(_S_threshold))
2312 if (__depth_limit == 0)
2314 _GLIBCXX_STD_A::partial_sort(__first, __last, __last, __comp);
2318 _RandomAccessIterator __cut =
2319 std::__unguarded_partition_pivot(__first, __last, __comp);
2320 std::__introsort_loop(__cut, __last, __depth_limit, __comp);
2327 template<typename _RandomAccessIterator, typename _Size>
2329 __introselect(_RandomAccessIterator __first, _RandomAccessIterator __nth,
2330 _RandomAccessIterator __last, _Size __depth_limit)
2332 typedef typename iterator_traits<_RandomAccessIterator>::value_type
2335 while (__last - __first > 3)
2337 if (__depth_limit == 0)
2339 std::__heap_select(__first, __nth + 1, __last);
2341 // Place the nth largest element in its final position.
2342 std::iter_swap(__first, __nth);
2346 _RandomAccessIterator __cut =
2347 std::__unguarded_partition_pivot(__first, __last);
2353 std::__insertion_sort(__first, __last);
2356 template<typename _RandomAccessIterator, typename _Size, typename _Compare>
2358 __introselect(_RandomAccessIterator __first, _RandomAccessIterator __nth,
2359 _RandomAccessIterator __last, _Size __depth_limit,
2362 typedef typename iterator_traits<_RandomAccessIterator>::value_type
2365 while (__last - __first > 3)
2367 if (__depth_limit == 0)
2369 std::__heap_select(__first, __nth + 1, __last, __comp);
2370 // Place the nth largest element in its final position.
2371 std::iter_swap(__first, __nth);
2375 _RandomAccessIterator __cut =
2376 std::__unguarded_partition_pivot(__first, __last, __comp);
2382 std::__insertion_sort(__first, __last, __comp);
2387 // lower_bound moved to stl_algobase.h
2390 * @brief Finds the first position in which @a val could be inserted
2391 * without changing the ordering.
2392 * @ingroup binary_search_algorithms
2393 * @param __first An iterator.
2394 * @param __last Another iterator.
2395 * @param __val The search term.
2396 * @param __comp A functor to use for comparisons.
2397 * @return An iterator pointing to the first element <em>not less
2398 * than</em> @a __val, or end() if every element is less
2400 * @ingroup binary_search_algorithms
2402 * The comparison function should have the same effects on ordering as
2403 * the function used for the initial sort.
2405 template<typename _ForwardIterator, typename _Tp, typename _Compare>
2407 lower_bound(_ForwardIterator __first, _ForwardIterator __last,
2408 const _Tp& __val, _Compare __comp)
2410 typedef typename iterator_traits<_ForwardIterator>::value_type
2412 typedef typename iterator_traits<_ForwardIterator>::difference_type
2415 // concept requirements
2416 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2417 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2419 __glibcxx_requires_partitioned_lower_pred(__first, __last,
2422 _DistanceType __len = std::distance(__first, __last);
2426 _DistanceType __half = __len >> 1;
2427 _ForwardIterator __middle = __first;
2428 std::advance(__middle, __half);
2429 if (__comp(*__middle, __val))
2433 __len = __len - __half - 1;
2442 * @brief Finds the last position in which @a val could be inserted
2443 * without changing the ordering.
2444 * @ingroup binary_search_algorithms
2445 * @param __first An iterator.
2446 * @param __last Another iterator.
2447 * @param __val The search term.
2448 * @return An iterator pointing to the first element greater than @a __val,
2449 * or end() if no elements are greater than @a __val.
2450 * @ingroup binary_search_algorithms
2452 template<typename _ForwardIterator, typename _Tp>
2454 upper_bound(_ForwardIterator __first, _ForwardIterator __last,
2457 typedef typename iterator_traits<_ForwardIterator>::value_type
2459 typedef typename iterator_traits<_ForwardIterator>::difference_type
2462 // concept requirements
2463 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2464 __glibcxx_function_requires(_LessThanOpConcept<_Tp, _ValueType>)
2465 __glibcxx_requires_partitioned_upper(__first, __last, __val);
2467 _DistanceType __len = std::distance(__first, __last);
2471 _DistanceType __half = __len >> 1;
2472 _ForwardIterator __middle = __first;
2473 std::advance(__middle, __half);
2474 if (__val < *__middle)
2480 __len = __len - __half - 1;
2487 * @brief Finds the last position in which @a val could be inserted
2488 * without changing the ordering.
2489 * @ingroup binary_search_algorithms
2490 * @param __first An iterator.
2491 * @param __last Another iterator.
2492 * @param __val The search term.
2493 * @param __comp A functor to use for comparisons.
2494 * @return An iterator pointing to the first element greater than @a __val,
2495 * or end() if no elements are greater than @a __val.
2496 * @ingroup binary_search_algorithms
2498 * The comparison function should have the same effects on ordering as
2499 * the function used for the initial sort.
2501 template<typename _ForwardIterator, typename _Tp, typename _Compare>
2503 upper_bound(_ForwardIterator __first, _ForwardIterator __last,
2504 const _Tp& __val, _Compare __comp)
2506 typedef typename iterator_traits<_ForwardIterator>::value_type
2508 typedef typename iterator_traits<_ForwardIterator>::difference_type
2511 // concept requirements
2512 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2513 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2515 __glibcxx_requires_partitioned_upper_pred(__first, __last,
2518 _DistanceType __len = std::distance(__first, __last);
2522 _DistanceType __half = __len >> 1;
2523 _ForwardIterator __middle = __first;
2524 std::advance(__middle, __half);
2525 if (__comp(__val, *__middle))
2531 __len = __len - __half - 1;
2538 * @brief Finds the largest subrange in which @a val could be inserted
2539 * at any place in it without changing the ordering.
2540 * @ingroup binary_search_algorithms
2541 * @param __first An iterator.
2542 * @param __last Another iterator.
2543 * @param __val The search term.
2544 * @return An pair of iterators defining the subrange.
2545 * @ingroup binary_search_algorithms
2547 * This is equivalent to
2549 * std::make_pair(lower_bound(__first, __last, __val),
2550 * upper_bound(__first, __last, __val))
2552 * but does not actually call those functions.
2554 template<typename _ForwardIterator, typename _Tp>
2555 pair<_ForwardIterator, _ForwardIterator>
2556 equal_range(_ForwardIterator __first, _ForwardIterator __last,
2559 typedef typename iterator_traits<_ForwardIterator>::value_type
2561 typedef typename iterator_traits<_ForwardIterator>::difference_type
2564 // concept requirements
2565 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2566 __glibcxx_function_requires(_LessThanOpConcept<_ValueType, _Tp>)
2567 __glibcxx_function_requires(_LessThanOpConcept<_Tp, _ValueType>)
2568 __glibcxx_requires_partitioned_lower(__first, __last, __val);
2569 __glibcxx_requires_partitioned_upper(__first, __last, __val);
2571 _DistanceType __len = std::distance(__first, __last);
2575 _DistanceType __half = __len >> 1;
2576 _ForwardIterator __middle = __first;
2577 std::advance(__middle, __half);
2578 if (*__middle < __val)
2582 __len = __len - __half - 1;
2584 else if (__val < *__middle)
2588 _ForwardIterator __left = std::lower_bound(__first, __middle,
2590 std::advance(__first, __len);
2591 _ForwardIterator __right = std::upper_bound(++__middle, __first,
2593 return pair<_ForwardIterator, _ForwardIterator>(__left, __right);
2596 return pair<_ForwardIterator, _ForwardIterator>(__first, __first);
2600 * @brief Finds the largest subrange in which @a val could be inserted
2601 * at any place in it without changing the ordering.
2602 * @param __first An iterator.
2603 * @param __last Another iterator.
2604 * @param __val The search term.
2605 * @param __comp A functor to use for comparisons.
2606 * @return An pair of iterators defining the subrange.
2607 * @ingroup binary_search_algorithms
2609 * This is equivalent to
2611 * std::make_pair(lower_bound(__first, __last, __val, __comp),
2612 * upper_bound(__first, __last, __val, __comp))
2614 * but does not actually call those functions.
2616 template<typename _ForwardIterator, typename _Tp, typename _Compare>
2617 pair<_ForwardIterator, _ForwardIterator>
2618 equal_range(_ForwardIterator __first, _ForwardIterator __last,
2619 const _Tp& __val, _Compare __comp)
2621 typedef typename iterator_traits<_ForwardIterator>::value_type
2623 typedef typename iterator_traits<_ForwardIterator>::difference_type
2626 // concept requirements
2627 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2628 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2630 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2632 __glibcxx_requires_partitioned_lower_pred(__first, __last,
2634 __glibcxx_requires_partitioned_upper_pred(__first, __last,
2637 _DistanceType __len = std::distance(__first, __last);
2641 _DistanceType __half = __len >> 1;
2642 _ForwardIterator __middle = __first;
2643 std::advance(__middle, __half);
2644 if (__comp(*__middle, __val))
2648 __len = __len - __half - 1;
2650 else if (__comp(__val, *__middle))
2654 _ForwardIterator __left = std::lower_bound(__first, __middle,
2656 std::advance(__first, __len);
2657 _ForwardIterator __right = std::upper_bound(++__middle, __first,
2659 return pair<_ForwardIterator, _ForwardIterator>(__left, __right);
2662 return pair<_ForwardIterator, _ForwardIterator>(__first, __first);
2666 * @brief Determines whether an element exists in a range.
2667 * @ingroup binary_search_algorithms
2668 * @param __first An iterator.
2669 * @param __last Another iterator.
2670 * @param __val The search term.
2671 * @return True if @a __val (or its equivalent) is in [@a
2672 * __first,@a __last ].
2674 * Note that this does not actually return an iterator to @a __val. For
2675 * that, use std::find or a container's specialized find member functions.
2677 template<typename _ForwardIterator, typename _Tp>
2679 binary_search(_ForwardIterator __first, _ForwardIterator __last,
2682 typedef typename iterator_traits<_ForwardIterator>::value_type
2685 // concept requirements
2686 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2687 __glibcxx_function_requires(_LessThanOpConcept<_Tp, _ValueType>)
2688 __glibcxx_requires_partitioned_lower(__first, __last, __val);
2689 __glibcxx_requires_partitioned_upper(__first, __last, __val);
2691 _ForwardIterator __i = std::lower_bound(__first, __last, __val);
2692 return __i != __last && !(__val < *__i);
2696 * @brief Determines whether an element exists in a range.
2697 * @ingroup binary_search_algorithms
2698 * @param __first An iterator.
2699 * @param __last Another iterator.
2700 * @param __val The search term.
2701 * @param __comp A functor to use for comparisons.
2702 * @return True if @a val (or its equivalent) is in [@a first,@a last ].
2704 * Note that this does not actually return an iterator to @a val. For
2705 * that, use std::find or a container's specialized find member functions.
2707 * The comparison function should have the same effects on ordering as
2708 * the function used for the initial sort.
2710 template<typename _ForwardIterator, typename _Tp, typename _Compare>
2712 binary_search(_ForwardIterator __first, _ForwardIterator __last,
2713 const _Tp& __val, _Compare __comp)
2715 typedef typename iterator_traits<_ForwardIterator>::value_type
2718 // concept requirements
2719 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2720 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2722 __glibcxx_requires_partitioned_lower_pred(__first, __last,
2724 __glibcxx_requires_partitioned_upper_pred(__first, __last,
2727 _ForwardIterator __i = std::lower_bound(__first, __last, __val, __comp);
2728 return __i != __last && !bool(__comp(__val, *__i));
2733 /// This is a helper function for the __merge_adaptive routines.
2734 template<typename _InputIterator1, typename _InputIterator2,
2735 typename _OutputIterator>
2737 __move_merge_adaptive(_InputIterator1 __first1, _InputIterator1 __last1,
2738 _InputIterator2 __first2, _InputIterator2 __last2,
2739 _OutputIterator __result)
2741 while (__first1 != __last1 && __first2 != __last2)
2743 if (*__first2 < *__first1)
2745 *__result = _GLIBCXX_MOVE(*__first2);
2750 *__result = _GLIBCXX_MOVE(*__first1);
2755 if (__first1 != __last1)
2756 _GLIBCXX_MOVE3(__first1, __last1, __result);
2759 /// This is a helper function for the __merge_adaptive routines.
2760 template<typename _InputIterator1, typename _InputIterator2,
2761 typename _OutputIterator, typename _Compare>
2763 __move_merge_adaptive(_InputIterator1 __first1, _InputIterator1 __last1,
2764 _InputIterator2 __first2, _InputIterator2 __last2,
2765 _OutputIterator __result, _Compare __comp)
2767 while (__first1 != __last1 && __first2 != __last2)
2769 if (__comp(*__first2, *__first1))
2771 *__result = _GLIBCXX_MOVE(*__first2);
2776 *__result = _GLIBCXX_MOVE(*__first1);
2781 if (__first1 != __last1)
2782 _GLIBCXX_MOVE3(__first1, __last1, __result);
2785 /// This is a helper function for the __merge_adaptive routines.
2786 template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
2787 typename _BidirectionalIterator3>
2789 __move_merge_adaptive_backward(_BidirectionalIterator1 __first1,
2790 _BidirectionalIterator1 __last1,
2791 _BidirectionalIterator2 __first2,
2792 _BidirectionalIterator2 __last2,
2793 _BidirectionalIterator3 __result)
2795 if (__first1 == __last1)
2797 _GLIBCXX_MOVE_BACKWARD3(__first2, __last2, __result);
2800 else if (__first2 == __last2)
2807 if (*__last2 < *__last1)
2809 *--__result = _GLIBCXX_MOVE(*__last1);
2810 if (__first1 == __last1)
2812 _GLIBCXX_MOVE_BACKWARD3(__first2, ++__last2, __result);
2819 *--__result = _GLIBCXX_MOVE(*__last2);
2820 if (__first2 == __last2)
2827 /// This is a helper function for the __merge_adaptive routines.
2828 template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
2829 typename _BidirectionalIterator3, typename _Compare>
2831 __move_merge_adaptive_backward(_BidirectionalIterator1 __first1,
2832 _BidirectionalIterator1 __last1,
2833 _BidirectionalIterator2 __first2,
2834 _BidirectionalIterator2 __last2,
2835 _BidirectionalIterator3 __result,
2838 if (__first1 == __last1)
2840 _GLIBCXX_MOVE_BACKWARD3(__first2, __last2, __result);
2843 else if (__first2 == __last2)
2850 if (__comp(*__last2, *__last1))
2852 *--__result = _GLIBCXX_MOVE(*__last1);
2853 if (__first1 == __last1)
2855 _GLIBCXX_MOVE_BACKWARD3(__first2, ++__last2, __result);
2862 *--__result = _GLIBCXX_MOVE(*__last2);
2863 if (__first2 == __last2)
2870 /// This is a helper function for the merge routines.
2871 template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
2873 _BidirectionalIterator1
2874 __rotate_adaptive(_BidirectionalIterator1 __first,
2875 _BidirectionalIterator1 __middle,
2876 _BidirectionalIterator1 __last,
2877 _Distance __len1, _Distance __len2,
2878 _BidirectionalIterator2 __buffer,
2879 _Distance __buffer_size)
2881 _BidirectionalIterator2 __buffer_end;
2882 if (__len1 > __len2 && __len2 <= __buffer_size)
2886 __buffer_end = _GLIBCXX_MOVE3(__middle, __last, __buffer);
2887 _GLIBCXX_MOVE_BACKWARD3(__first, __middle, __last);
2888 return _GLIBCXX_MOVE3(__buffer, __buffer_end, __first);
2893 else if (__len1 <= __buffer_size)
2897 __buffer_end = _GLIBCXX_MOVE3(__first, __middle, __buffer);
2898 _GLIBCXX_MOVE3(__middle, __last, __first);
2899 return _GLIBCXX_MOVE_BACKWARD3(__buffer, __buffer_end, __last);
2906 std::rotate(__first, __middle, __last);
2907 std::advance(__first, std::distance(__middle, __last));
2912 /// This is a helper function for the merge routines.
2913 template<typename _BidirectionalIterator, typename _Distance,
2916 __merge_adaptive(_BidirectionalIterator __first,
2917 _BidirectionalIterator __middle,
2918 _BidirectionalIterator __last,
2919 _Distance __len1, _Distance __len2,
2920 _Pointer __buffer, _Distance __buffer_size)
2922 if (__len1 <= __len2 && __len1 <= __buffer_size)
2924 _Pointer __buffer_end = _GLIBCXX_MOVE3(__first, __middle, __buffer);
2925 std::__move_merge_adaptive(__buffer, __buffer_end, __middle, __last,
2928 else if (__len2 <= __buffer_size)
2930 _Pointer __buffer_end = _GLIBCXX_MOVE3(__middle, __last, __buffer);
2931 std::__move_merge_adaptive_backward(__first, __middle, __buffer,
2932 __buffer_end, __last);
2936 _BidirectionalIterator __first_cut = __first;
2937 _BidirectionalIterator __second_cut = __middle;
2938 _Distance __len11 = 0;
2939 _Distance __len22 = 0;
2940 if (__len1 > __len2)
2942 __len11 = __len1 / 2;
2943 std::advance(__first_cut, __len11);
2944 __second_cut = std::lower_bound(__middle, __last,
2946 __len22 = std::distance(__middle, __second_cut);
2950 __len22 = __len2 / 2;
2951 std::advance(__second_cut, __len22);
2952 __first_cut = std::upper_bound(__first, __middle,
2954 __len11 = std::distance(__first, __first_cut);
2956 _BidirectionalIterator __new_middle =
2957 std::__rotate_adaptive(__first_cut, __middle, __second_cut,
2958 __len1 - __len11, __len22, __buffer,
2960 std::__merge_adaptive(__first, __first_cut, __new_middle, __len11,
2961 __len22, __buffer, __buffer_size);
2962 std::__merge_adaptive(__new_middle, __second_cut, __last,
2964 __len2 - __len22, __buffer, __buffer_size);
2968 /// This is a helper function for the merge routines.
2969 template<typename _BidirectionalIterator, typename _Distance,
2970 typename _Pointer, typename _Compare>
2972 __merge_adaptive(_BidirectionalIterator __first,
2973 _BidirectionalIterator __middle,
2974 _BidirectionalIterator __last,
2975 _Distance __len1, _Distance __len2,
2976 _Pointer __buffer, _Distance __buffer_size,
2979 if (__len1 <= __len2 && __len1 <= __buffer_size)
2981 _Pointer __buffer_end = _GLIBCXX_MOVE3(__first, __middle, __buffer);
2982 std::__move_merge_adaptive(__buffer, __buffer_end, __middle, __last,
2985 else if (__len2 <= __buffer_size)
2987 _Pointer __buffer_end = _GLIBCXX_MOVE3(__middle, __last, __buffer);
2988 std::__move_merge_adaptive_backward(__first, __middle, __buffer,
2989 __buffer_end, __last, __comp);
2993 _BidirectionalIterator __first_cut = __first;
2994 _BidirectionalIterator __second_cut = __middle;
2995 _Distance __len11 = 0;
2996 _Distance __len22 = 0;
2997 if (__len1 > __len2)
2999 __len11 = __len1 / 2;
3000 std::advance(__first_cut, __len11);
3001 __second_cut = std::lower_bound(__middle, __last, *__first_cut,
3003 __len22 = std::distance(__middle, __second_cut);
3007 __len22 = __len2 / 2;
3008 std::advance(__second_cut, __len22);
3009 __first_cut = std::upper_bound(__first, __middle, *__second_cut,
3011 __len11 = std::distance(__first, __first_cut);
3013 _BidirectionalIterator __new_middle =
3014 std::__rotate_adaptive(__first_cut, __middle, __second_cut,
3015 __len1 - __len11, __len22, __buffer,
3017 std::__merge_adaptive(__first, __first_cut, __new_middle, __len11,
3018 __len22, __buffer, __buffer_size, __comp);
3019 std::__merge_adaptive(__new_middle, __second_cut, __last,
3021 __len2 - __len22, __buffer,
3022 __buffer_size, __comp);
3026 /// This is a helper function for the merge routines.
3027 template<typename _BidirectionalIterator, typename _Distance>
3029 __merge_without_buffer(_BidirectionalIterator __first,
3030 _BidirectionalIterator __middle,
3031 _BidirectionalIterator __last,
3032 _Distance __len1, _Distance __len2)
3034 if (__len1 == 0 || __len2 == 0)
3036 if (__len1 + __len2 == 2)
3038 if (*__middle < *__first)
3039 std::iter_swap(__first, __middle);
3042 _BidirectionalIterator __first_cut = __first;
3043 _BidirectionalIterator __second_cut = __middle;
3044 _Distance __len11 = 0;
3045 _Distance __len22 = 0;
3046 if (__len1 > __len2)
3048 __len11 = __len1 / 2;
3049 std::advance(__first_cut, __len11);
3050 __second_cut = std::lower_bound(__middle, __last, *__first_cut);
3051 __len22 = std::distance(__middle, __second_cut);
3055 __len22 = __len2 / 2;
3056 std::advance(__second_cut, __len22);
3057 __first_cut = std::upper_bound(__first, __middle, *__second_cut);
3058 __len11 = std::distance(__first, __first_cut);
3060 std::rotate(__first_cut, __middle, __second_cut);
3061 _BidirectionalIterator __new_middle = __first_cut;
3062 std::advance(__new_middle, std::distance(__middle, __second_cut));
3063 std::__merge_without_buffer(__first, __first_cut, __new_middle,
3065 std::__merge_without_buffer(__new_middle, __second_cut, __last,
3066 __len1 - __len11, __len2 - __len22);
3069 /// This is a helper function for the merge routines.
3070 template<typename _BidirectionalIterator, typename _Distance,
3073 __merge_without_buffer(_BidirectionalIterator __first,
3074 _BidirectionalIterator __middle,
3075 _BidirectionalIterator __last,
3076 _Distance __len1, _Distance __len2,
3079 if (__len1 == 0 || __len2 == 0)
3081 if (__len1 + __len2 == 2)
3083 if (__comp(*__middle, *__first))
3084 std::iter_swap(__first, __middle);
3087 _BidirectionalIterator __first_cut = __first;
3088 _BidirectionalIterator __second_cut = __middle;
3089 _Distance __len11 = 0;
3090 _Distance __len22 = 0;
3091 if (__len1 > __len2)
3093 __len11 = __len1 / 2;
3094 std::advance(__first_cut, __len11);
3095 __second_cut = std::lower_bound(__middle, __last, *__first_cut,
3097 __len22 = std::distance(__middle, __second_cut);
3101 __len22 = __len2 / 2;
3102 std::advance(__second_cut, __len22);
3103 __first_cut = std::upper_bound(__first, __middle, *__second_cut,
3105 __len11 = std::distance(__first, __first_cut);
3107 std::rotate(__first_cut, __middle, __second_cut);
3108 _BidirectionalIterator __new_middle = __first_cut;
3109 std::advance(__new_middle, std::distance(__middle, __second_cut));
3110 std::__merge_without_buffer(__first, __first_cut, __new_middle,
3111 __len11, __len22, __comp);
3112 std::__merge_without_buffer(__new_middle, __second_cut, __last,
3113 __len1 - __len11, __len2 - __len22, __comp);
3117 * @brief Merges two sorted ranges in place.
3118 * @ingroup sorting_algorithms
3119 * @param __first An iterator.
3120 * @param __middle Another iterator.
3121 * @param __last Another iterator.
3124 * Merges two sorted and consecutive ranges, [__first,__middle) and
3125 * [__middle,__last), and puts the result in [__first,__last). The
3126 * output will be sorted. The sort is @e stable, that is, for
3127 * equivalent elements in the two ranges, elements from the first
3128 * range will always come before elements from the second.
3130 * If enough additional memory is available, this takes (__last-__first)-1
3131 * comparisons. Otherwise an NlogN algorithm is used, where N is
3132 * distance(__first,__last).
3134 template<typename _BidirectionalIterator>
3136 inplace_merge(_BidirectionalIterator __first,
3137 _BidirectionalIterator __middle,
3138 _BidirectionalIterator __last)
3140 typedef typename iterator_traits<_BidirectionalIterator>::value_type
3142 typedef typename iterator_traits<_BidirectionalIterator>::difference_type
3145 // concept requirements
3146 __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
3147 _BidirectionalIterator>)
3148 __glibcxx_function_requires(_LessThanComparableConcept<_ValueType>)
3149 __glibcxx_requires_sorted(__first, __middle);
3150 __glibcxx_requires_sorted(__middle, __last);
3152 if (__first == __middle || __middle == __last)
3155 _DistanceType __len1 = std::distance(__first, __middle);
3156 _DistanceType __len2 = std::distance(__middle, __last);
3158 _Temporary_buffer<_BidirectionalIterator, _ValueType> __buf(__first,
3160 if (__buf.begin() == 0)
3161 std::__merge_without_buffer(__first, __middle, __last, __len1, __len2);
3163 std::__merge_adaptive(__first, __middle, __last, __len1, __len2,
3164 __buf.begin(), _DistanceType(__buf.size()));
3168 * @brief Merges two sorted ranges in place.
3169 * @ingroup sorting_algorithms
3170 * @param __first An iterator.
3171 * @param __middle Another iterator.
3172 * @param __last Another iterator.
3173 * @param __comp A functor to use for comparisons.
3176 * Merges two sorted and consecutive ranges, [__first,__middle) and
3177 * [middle,last), and puts the result in [__first,__last). The output will
3178 * be sorted. The sort is @e stable, that is, for equivalent
3179 * elements in the two ranges, elements from the first range will always
3180 * come before elements from the second.
3182 * If enough additional memory is available, this takes (__last-__first)-1
3183 * comparisons. Otherwise an NlogN algorithm is used, where N is
3184 * distance(__first,__last).
3186 * The comparison function should have the same effects on ordering as
3187 * the function used for the initial sort.
3189 template<typename _BidirectionalIterator, typename _Compare>
3191 inplace_merge(_BidirectionalIterator __first,
3192 _BidirectionalIterator __middle,
3193 _BidirectionalIterator __last,
3196 typedef typename iterator_traits<_BidirectionalIterator>::value_type
3198 typedef typename iterator_traits<_BidirectionalIterator>::difference_type
3201 // concept requirements
3202 __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
3203 _BidirectionalIterator>)
3204 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
3205 _ValueType, _ValueType>)
3206 __glibcxx_requires_sorted_pred(__first, __middle, __comp);
3207 __glibcxx_requires_sorted_pred(__middle, __last, __comp);
3209 if (__first == __middle || __middle == __last)
3212 const _DistanceType __len1 = std::distance(__first, __middle);
3213 const _DistanceType __len2 = std::distance(__middle, __last);
3215 _Temporary_buffer<_BidirectionalIterator, _ValueType> __buf(__first,
3217 if (__buf.begin() == 0)
3218 std::__merge_without_buffer(__first, __middle, __last, __len1,
3221 std::__merge_adaptive(__first, __middle, __last, __len1, __len2,
3222 __buf.begin(), _DistanceType(__buf.size()),
3227 /// This is a helper function for the __merge_sort_loop routines.
3228 template<typename _InputIterator1, typename _InputIterator2,
3229 typename _OutputIterator>
3231 __move_merge(_InputIterator1 __first1, _InputIterator1 __last1,
3232 _InputIterator2 __first2, _InputIterator2 __last2,
3233 _OutputIterator __result)
3235 while (__first1 != __last1 && __first2 != __last2)
3237 if (*__first2 < *__first1)
3239 *__result = _GLIBCXX_MOVE(*__first2);
3244 *__result = _GLIBCXX_MOVE(*__first1);
3249 return _GLIBCXX_MOVE3(__first2, __last2,
3250 _GLIBCXX_MOVE3(__first1, __last1,
3254 /// This is a helper function for the __merge_sort_loop routines.
3255 template<typename _InputIterator1, typename _InputIterator2,
3256 typename _OutputIterator, typename _Compare>
3258 __move_merge(_InputIterator1 __first1, _InputIterator1 __last1,
3259 _InputIterator2 __first2, _InputIterator2 __last2,
3260 _OutputIterator __result, _Compare __comp)
3262 while (__first1 != __last1 && __first2 != __last2)
3264 if (__comp(*__first2, *__first1))
3266 *__result = _GLIBCXX_MOVE(*__first2);
3271 *__result = _GLIBCXX_MOVE(*__first1);
3276 return _GLIBCXX_MOVE3(__first2, __last2,
3277 _GLIBCXX_MOVE3(__first1, __last1,
3281 template<typename _RandomAccessIterator1, typename _RandomAccessIterator2,
3284 __merge_sort_loop(_RandomAccessIterator1 __first,
3285 _RandomAccessIterator1 __last,
3286 _RandomAccessIterator2 __result,
3287 _Distance __step_size)
3289 const _Distance __two_step = 2 * __step_size;
3291 while (__last - __first >= __two_step)
3293 __result = std::__move_merge(__first, __first + __step_size,
3294 __first + __step_size,
3295 __first + __two_step, __result);
3296 __first += __two_step;
3299 __step_size = std::min(_Distance(__last - __first), __step_size);
3300 std::__move_merge(__first, __first + __step_size,
3301 __first + __step_size, __last, __result);
3304 template<typename _RandomAccessIterator1, typename _RandomAccessIterator2,
3305 typename _Distance, typename _Compare>
3307 __merge_sort_loop(_RandomAccessIterator1 __first,
3308 _RandomAccessIterator1 __last,
3309 _RandomAccessIterator2 __result, _Distance __step_size,
3312 const _Distance __two_step = 2 * __step_size;
3314 while (__last - __first >= __two_step)
3316 __result = std::__move_merge(__first, __first + __step_size,
3317 __first + __step_size,
3318 __first + __two_step,
3320 __first += __two_step;
3322 __step_size = std::min(_Distance(__last - __first), __step_size);
3324 std::__move_merge(__first,__first + __step_size,
3325 __first + __step_size, __last, __result, __comp);
3328 template<typename _RandomAccessIterator, typename _Distance>
3330 __chunk_insertion_sort(_RandomAccessIterator __first,
3331 _RandomAccessIterator __last,
3332 _Distance __chunk_size)
3334 while (__last - __first >= __chunk_size)
3336 std::__insertion_sort(__first, __first + __chunk_size);
3337 __first += __chunk_size;
3339 std::__insertion_sort(__first, __last);
3342 template<typename _RandomAccessIterator, typename _Distance,
3345 __chunk_insertion_sort(_RandomAccessIterator __first,
3346 _RandomAccessIterator __last,
3347 _Distance __chunk_size, _Compare __comp)
3349 while (__last - __first >= __chunk_size)
3351 std::__insertion_sort(__first, __first + __chunk_size, __comp);
3352 __first += __chunk_size;
3354 std::__insertion_sort(__first, __last, __comp);
3357 enum { _S_chunk_size = 7 };
3359 template<typename _RandomAccessIterator, typename _Pointer>
3361 __merge_sort_with_buffer(_RandomAccessIterator __first,
3362 _RandomAccessIterator __last,
3365 typedef typename iterator_traits<_RandomAccessIterator>::difference_type
3368 const _Distance __len = __last - __first;
3369 const _Pointer __buffer_last = __buffer + __len;
3371 _Distance __step_size = _S_chunk_size;
3372 std::__chunk_insertion_sort(__first, __last, __step_size);
3374 while (__step_size < __len)
3376 std::__merge_sort_loop(__first, __last, __buffer, __step_size);
3378 std::__merge_sort_loop(__buffer, __buffer_last, __first, __step_size);
3383 template<typename _RandomAccessIterator, typename _Pointer, typename _Compare>
3385 __merge_sort_with_buffer(_RandomAccessIterator __first,
3386 _RandomAccessIterator __last,
3387 _Pointer __buffer, _Compare __comp)
3389 typedef typename iterator_traits<_RandomAccessIterator>::difference_type
3392 const _Distance __len = __last - __first;
3393 const _Pointer __buffer_last = __buffer + __len;
3395 _Distance __step_size = _S_chunk_size;
3396 std::__chunk_insertion_sort(__first, __last, __step_size, __comp);
3398 while (__step_size < __len)
3400 std::__merge_sort_loop(__first, __last, __buffer,
3401 __step_size, __comp);
3403 std::__merge_sort_loop(__buffer, __buffer_last, __first,
3404 __step_size, __comp);
3409 template<typename _RandomAccessIterator, typename _Pointer,
3412 __stable_sort_adaptive(_RandomAccessIterator __first,
3413 _RandomAccessIterator __last,
3414 _Pointer __buffer, _Distance __buffer_size)
3416 const _Distance __len = (__last - __first + 1) / 2;
3417 const _RandomAccessIterator __middle = __first + __len;
3418 if (__len > __buffer_size)
3420 std::__stable_sort_adaptive(__first, __middle,
3421 __buffer, __buffer_size);
3422 std::__stable_sort_adaptive(__middle, __last,
3423 __buffer, __buffer_size);
3427 std::__merge_sort_with_buffer(__first, __middle, __buffer);
3428 std::__merge_sort_with_buffer(__middle, __last, __buffer);
3430 std::__merge_adaptive(__first, __middle, __last,
3431 _Distance(__middle - __first),
3432 _Distance(__last - __middle),
3433 __buffer, __buffer_size);
3436 template<typename _RandomAccessIterator, typename _Pointer,
3437 typename _Distance, typename _Compare>
3439 __stable_sort_adaptive(_RandomAccessIterator __first,
3440 _RandomAccessIterator __last,
3441 _Pointer __buffer, _Distance __buffer_size,
3444 const _Distance __len = (__last - __first + 1) / 2;
3445 const _RandomAccessIterator __middle = __first + __len;
3446 if (__len > __buffer_size)
3448 std::__stable_sort_adaptive(__first, __middle, __buffer,
3449 __buffer_size, __comp);
3450 std::__stable_sort_adaptive(__middle, __last, __buffer,
3451 __buffer_size, __comp);
3455 std::__merge_sort_with_buffer(__first, __middle, __buffer, __comp);
3456 std::__merge_sort_with_buffer(__middle, __last, __buffer, __comp);
3458 std::__merge_adaptive(__first, __middle, __last,
3459 _Distance(__middle - __first),
3460 _Distance(__last - __middle),
3461 __buffer, __buffer_size,
3465 /// This is a helper function for the stable sorting routines.
3466 template<typename _RandomAccessIterator>
3468 __inplace_stable_sort(_RandomAccessIterator __first,
3469 _RandomAccessIterator __last)
3471 if (__last - __first < 15)
3473 std::__insertion_sort(__first, __last);
3476 _RandomAccessIterator __middle = __first + (__last - __first) / 2;
3477 std::__inplace_stable_sort(__first, __middle);
3478 std::__inplace_stable_sort(__middle, __last);
3479 std::__merge_without_buffer(__first, __middle, __last,
3484 /// This is a helper function for the stable sorting routines.
3485 template<typename _RandomAccessIterator, typename _Compare>
3487 __inplace_stable_sort(_RandomAccessIterator __first,
3488 _RandomAccessIterator __last, _Compare __comp)
3490 if (__last - __first < 15)
3492 std::__insertion_sort(__first, __last, __comp);
3495 _RandomAccessIterator __middle = __first + (__last - __first) / 2;
3496 std::__inplace_stable_sort(__first, __middle, __comp);
3497 std::__inplace_stable_sort(__middle, __last, __comp);
3498 std::__merge_without_buffer(__first, __middle, __last,
3506 // Set algorithms: includes, set_union, set_intersection, set_difference,
3507 // set_symmetric_difference. All of these algorithms have the precondition
3508 // that their input ranges are sorted and the postcondition that their output
3509 // ranges are sorted.
3512 * @brief Determines whether all elements of a sequence exists in a range.
3513 * @param __first1 Start of search range.
3514 * @param __last1 End of search range.
3515 * @param __first2 Start of sequence
3516 * @param __last2 End of sequence.
3517 * @return True if each element in [__first2,__last2) is contained in order
3518 * within [__first1,__last1). False otherwise.
3519 * @ingroup set_algorithms
3521 * This operation expects both [__first1,__last1) and
3522 * [__first2,__last2) to be sorted. Searches for the presence of
3523 * each element in [__first2,__last2) within [__first1,__last1).
3524 * The iterators over each range only move forward, so this is a
3525 * linear algorithm. If an element in [__first2,__last2) is not
3526 * found before the search iterator reaches @a __last2, false is
3529 template<typename _InputIterator1, typename _InputIterator2>
3531 includes(_InputIterator1 __first1, _InputIterator1 __last1,
3532 _InputIterator2 __first2, _InputIterator2 __last2)
3534 typedef typename iterator_traits<_InputIterator1>::value_type
3536 typedef typename iterator_traits<_InputIterator2>::value_type
3539 // concept requirements
3540 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
3541 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
3542 __glibcxx_function_requires(_LessThanOpConcept<_ValueType1, _ValueType2>)
3543 __glibcxx_function_requires(_LessThanOpConcept<_ValueType2, _ValueType1>)
3544 __glibcxx_requires_sorted_set(__first1, __last1, __first2);
3545 __glibcxx_requires_sorted_set(__first2, __last2, __first1);
3547 while (__first1 != __last1 && __first2 != __last2)
3548 if (*__first2 < *__first1)
3550 else if(*__first1 < *__first2)
3553 ++__first1, ++__first2;
3555 return __first2 == __last2;
3559 * @brief Determines whether all elements of a sequence exists in a range
3561 * @ingroup set_algorithms
3562 * @param __first1 Start of search range.
3563 * @param __last1 End of search range.
3564 * @param __first2 Start of sequence
3565 * @param __last2 End of sequence.
3566 * @param __comp Comparison function to use.
3567 * @return True if each element in [__first2,__last2) is contained
3568 * in order within [__first1,__last1) according to comp. False
3569 * otherwise. @ingroup set_algorithms
3571 * This operation expects both [__first1,__last1) and
3572 * [__first2,__last2) to be sorted. Searches for the presence of
3573 * each element in [__first2,__last2) within [__first1,__last1),
3574 * using comp to decide. The iterators over each range only move
3575 * forward, so this is a linear algorithm. If an element in
3576 * [__first2,__last2) is not found before the search iterator
3577 * reaches @a __last2, false is returned.
3579 template<typename _InputIterator1, typename _InputIterator2,
3582 includes(_InputIterator1 __first1, _InputIterator1 __last1,
3583 _InputIterator2 __first2, _InputIterator2 __last2,
3586 typedef typename iterator_traits<_InputIterator1>::value_type
3588 typedef typename iterator_traits<_InputIterator2>::value_type
3591 // concept requirements
3592 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
3593 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
3594 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,