1 // Algorithm implementation -*- C++ -*-
3 // Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
4 // Free Software Foundation, Inc.
6 // This file is part of the GNU ISO C++ Library. This library is free
7 // software; you can redistribute it and/or modify it under the
8 // terms of the GNU General Public License as published by the
9 // Free Software Foundation; either version 3, or (at your option)
12 // This library is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 // GNU General Public License for more details.
17 // Under Section 7 of GPL version 3, you are granted additional
18 // permissions described in the GCC Runtime Library Exception, version
19 // 3.1, as published by the Free Software Foundation.
21 // You should have received a copy of the GNU General Public License and
22 // a copy of the GCC Runtime Library Exception along with this program;
23 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
24 // <http://www.gnu.org/licenses/>.
29 * Hewlett-Packard Company
31 * Permission to use, copy, modify, distribute and sell this software
32 * and its documentation for any purpose is hereby granted without fee,
33 * provided that the above copyright notice appear in all copies and
34 * that both that copyright notice and this permission notice appear
35 * in supporting documentation. Hewlett-Packard Company makes no
36 * representations about the suitability of this software for any
37 * purpose. It is provided "as is" without express or implied warranty.
41 * Silicon Graphics Computer Systems, Inc.
43 * Permission to use, copy, modify, distribute and sell this software
44 * and its documentation for any purpose is hereby granted without fee,
45 * provided that the above copyright notice appear in all copies and
46 * that both that copyright notice and this permission notice appear
47 * in supporting documentation. Silicon Graphics makes no
48 * representations about the suitability of this software for any
49 * purpose. It is provided "as is" without express or implied warranty.
53 * This is an internal header file, included by other library headers.
54 * You should not attempt to use it directly.
60 #include <cstdlib> // for rand
61 #include <bits/algorithmfwd.h>
62 #include <bits/stl_heap.h>
63 #include <bits/stl_tempbuf.h> // for _Temporary_buffer
65 #ifdef __GXX_EXPERIMENTAL_CXX0X__
66 #include <random> // for std::uniform_int_distribution
69 // See concept_check.h for the __glibcxx_*_requires macros.
71 _GLIBCXX_BEGIN_NAMESPACE(std)
73 /// Swaps the median value of *__a, *__b and *__c to *__a
74 template<typename _Iterator>
76 __move_median_first(_Iterator __a, _Iterator __b, _Iterator __c)
78 // concept requirements
79 __glibcxx_function_requires(_LessThanComparableConcept<
80 typename iterator_traits<_Iterator>::value_type>)
85 std::iter_swap(__a, __b);
87 std::iter_swap(__a, __c);
92 std::iter_swap(__a, __c);
94 std::iter_swap(__a, __b);
97 /// Swaps the median value of *__a, *__b and *__c under __comp to *__a
98 template<typename _Iterator, typename _Compare>
100 __move_median_first(_Iterator __a, _Iterator __b, _Iterator __c,
103 // concept requirements
104 __glibcxx_function_requires(_BinaryFunctionConcept<_Compare, bool,
105 typename iterator_traits<_Iterator>::value_type,
106 typename iterator_traits<_Iterator>::value_type>)
108 if (__comp(*__a, *__b))
110 if (__comp(*__b, *__c))
111 std::iter_swap(__a, __b);
112 else if (__comp(*__a, *__c))
113 std::iter_swap(__a, __c);
115 else if (__comp(*__a, *__c))
117 else if (__comp(*__b, *__c))
118 std::iter_swap(__a, __c);
120 std::iter_swap(__a, __b);
125 /// This is an overload used by find() for the Input Iterator case.
126 template<typename _InputIterator, typename _Tp>
127 inline _InputIterator
128 __find(_InputIterator __first, _InputIterator __last,
129 const _Tp& __val, input_iterator_tag)
131 while (__first != __last && !(*__first == __val))
136 /// This is an overload used by find_if() for the Input Iterator case.
137 template<typename _InputIterator, typename _Predicate>
138 inline _InputIterator
139 __find_if(_InputIterator __first, _InputIterator __last,
140 _Predicate __pred, input_iterator_tag)
142 while (__first != __last && !bool(__pred(*__first)))
147 /// This is an overload used by find() for the RAI case.
148 template<typename _RandomAccessIterator, typename _Tp>
149 _RandomAccessIterator
150 __find(_RandomAccessIterator __first, _RandomAccessIterator __last,
151 const _Tp& __val, random_access_iterator_tag)
153 typename iterator_traits<_RandomAccessIterator>::difference_type
154 __trip_count = (__last - __first) >> 2;
156 for (; __trip_count > 0; --__trip_count)
158 if (*__first == __val)
162 if (*__first == __val)
166 if (*__first == __val)
170 if (*__first == __val)
175 switch (__last - __first)
178 if (*__first == __val)
182 if (*__first == __val)
186 if (*__first == __val)
195 /// This is an overload used by find_if() for the RAI case.
196 template<typename _RandomAccessIterator, typename _Predicate>
197 _RandomAccessIterator
198 __find_if(_RandomAccessIterator __first, _RandomAccessIterator __last,
199 _Predicate __pred, random_access_iterator_tag)
201 typename iterator_traits<_RandomAccessIterator>::difference_type
202 __trip_count = (__last - __first) >> 2;
204 for (; __trip_count > 0; --__trip_count)
206 if (__pred(*__first))
210 if (__pred(*__first))
214 if (__pred(*__first))
218 if (__pred(*__first))
223 switch (__last - __first)
226 if (__pred(*__first))
230 if (__pred(*__first))
234 if (__pred(*__first))
243 #ifdef __GXX_EXPERIMENTAL_CXX0X__
244 /// This is an overload used by find_if_not() for the Input Iterator case.
245 template<typename _InputIterator, typename _Predicate>
246 inline _InputIterator
247 __find_if_not(_InputIterator __first, _InputIterator __last,
248 _Predicate __pred, input_iterator_tag)
250 while (__first != __last && bool(__pred(*__first)))
255 /// This is an overload used by find_if_not() for the RAI case.
256 template<typename _RandomAccessIterator, typename _Predicate>
257 _RandomAccessIterator
258 __find_if_not(_RandomAccessIterator __first, _RandomAccessIterator __last,
259 _Predicate __pred, random_access_iterator_tag)
261 typename iterator_traits<_RandomAccessIterator>::difference_type
262 __trip_count = (__last - __first) >> 2;
264 for (; __trip_count > 0; --__trip_count)
266 if (!bool(__pred(*__first)))
270 if (!bool(__pred(*__first)))
274 if (!bool(__pred(*__first)))
278 if (!bool(__pred(*__first)))
283 switch (__last - __first)
286 if (!bool(__pred(*__first)))
290 if (!bool(__pred(*__first)))
294 if (!bool(__pred(*__first)))
306 // set_symmetric_difference
318 * This is an uglified
319 * search_n(_ForwardIterator, _ForwardIterator, _Integer, const _Tp&)
320 * overloaded for forward iterators.
322 template<typename _ForwardIterator, typename _Integer, typename _Tp>
324 __search_n(_ForwardIterator __first, _ForwardIterator __last,
325 _Integer __count, const _Tp& __val,
326 std::forward_iterator_tag)
328 __first = _GLIBCXX_STD_P::find(__first, __last, __val);
329 while (__first != __last)
331 typename iterator_traits<_ForwardIterator>::difference_type
333 _ForwardIterator __i = __first;
335 while (__i != __last && __n != 1 && *__i == __val)
344 __first = _GLIBCXX_STD_P::find(++__i, __last, __val);
350 * This is an uglified
351 * search_n(_ForwardIterator, _ForwardIterator, _Integer, const _Tp&)
352 * overloaded for random access iterators.
354 template<typename _RandomAccessIter, typename _Integer, typename _Tp>
356 __search_n(_RandomAccessIter __first, _RandomAccessIter __last,
357 _Integer __count, const _Tp& __val,
358 std::random_access_iterator_tag)
361 typedef typename std::iterator_traits<_RandomAccessIter>::difference_type
364 _DistanceType __tailSize = __last - __first;
365 const _DistanceType __pattSize = __count;
367 if (__tailSize < __pattSize)
370 const _DistanceType __skipOffset = __pattSize - 1;
371 _RandomAccessIter __lookAhead = __first + __skipOffset;
372 __tailSize -= __pattSize;
374 while (1) // the main loop...
376 // __lookAhead here is always pointing to the last element of next
378 while (!(*__lookAhead == __val)) // the skip loop...
380 if (__tailSize < __pattSize)
381 return __last; // Failure
382 __lookAhead += __pattSize;
383 __tailSize -= __pattSize;
385 _DistanceType __remainder = __skipOffset;
386 for (_RandomAccessIter __backTrack = __lookAhead - 1;
387 *__backTrack == __val; --__backTrack)
389 if (--__remainder == 0)
390 return (__lookAhead - __skipOffset); // Success
392 if (__remainder > __tailSize)
393 return __last; // Failure
394 __lookAhead += __remainder;
395 __tailSize -= __remainder;
402 * This is an uglified
403 * search_n(_ForwardIterator, _ForwardIterator, _Integer, const _Tp&,
405 * overloaded for forward iterators.
407 template<typename _ForwardIterator, typename _Integer, typename _Tp,
408 typename _BinaryPredicate>
410 __search_n(_ForwardIterator __first, _ForwardIterator __last,
411 _Integer __count, const _Tp& __val,
412 _BinaryPredicate __binary_pred, std::forward_iterator_tag)
414 while (__first != __last && !bool(__binary_pred(*__first, __val)))
417 while (__first != __last)
419 typename iterator_traits<_ForwardIterator>::difference_type
421 _ForwardIterator __i = __first;
423 while (__i != __last && __n != 1 && bool(__binary_pred(*__i, __val)))
433 while (__first != __last
434 && !bool(__binary_pred(*__first, __val)))
441 * This is an uglified
442 * search_n(_ForwardIterator, _ForwardIterator, _Integer, const _Tp&,
444 * overloaded for random access iterators.
446 template<typename _RandomAccessIter, typename _Integer, typename _Tp,
447 typename _BinaryPredicate>
449 __search_n(_RandomAccessIter __first, _RandomAccessIter __last,
450 _Integer __count, const _Tp& __val,
451 _BinaryPredicate __binary_pred, std::random_access_iterator_tag)
454 typedef typename std::iterator_traits<_RandomAccessIter>::difference_type
457 _DistanceType __tailSize = __last - __first;
458 const _DistanceType __pattSize = __count;
460 if (__tailSize < __pattSize)
463 const _DistanceType __skipOffset = __pattSize - 1;
464 _RandomAccessIter __lookAhead = __first + __skipOffset;
465 __tailSize -= __pattSize;
467 while (1) // the main loop...
469 // __lookAhead here is always pointing to the last element of next
471 while (!bool(__binary_pred(*__lookAhead, __val))) // the skip loop...
473 if (__tailSize < __pattSize)
474 return __last; // Failure
475 __lookAhead += __pattSize;
476 __tailSize -= __pattSize;
478 _DistanceType __remainder = __skipOffset;
479 for (_RandomAccessIter __backTrack = __lookAhead - 1;
480 __binary_pred(*__backTrack, __val); --__backTrack)
482 if (--__remainder == 0)
483 return (__lookAhead - __skipOffset); // Success
485 if (__remainder > __tailSize)
486 return __last; // Failure
487 __lookAhead += __remainder;
488 __tailSize -= __remainder;
492 // find_end for forward iterators.
493 template<typename _ForwardIterator1, typename _ForwardIterator2>
495 __find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
496 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
497 forward_iterator_tag, forward_iterator_tag)
499 if (__first2 == __last2)
503 _ForwardIterator1 __result = __last1;
506 _ForwardIterator1 __new_result
507 = _GLIBCXX_STD_P::search(__first1, __last1, __first2, __last2);
508 if (__new_result == __last1)
512 __result = __new_result;
513 __first1 = __new_result;
520 template<typename _ForwardIterator1, typename _ForwardIterator2,
521 typename _BinaryPredicate>
523 __find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
524 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
525 forward_iterator_tag, forward_iterator_tag,
526 _BinaryPredicate __comp)
528 if (__first2 == __last2)
532 _ForwardIterator1 __result = __last1;
535 _ForwardIterator1 __new_result
536 = _GLIBCXX_STD_P::search(__first1, __last1, __first2,
538 if (__new_result == __last1)
542 __result = __new_result;
543 __first1 = __new_result;
550 // find_end for bidirectional iterators (much faster).
551 template<typename _BidirectionalIterator1, typename _BidirectionalIterator2>
552 _BidirectionalIterator1
553 __find_end(_BidirectionalIterator1 __first1,
554 _BidirectionalIterator1 __last1,
555 _BidirectionalIterator2 __first2,
556 _BidirectionalIterator2 __last2,
557 bidirectional_iterator_tag, bidirectional_iterator_tag)
559 // concept requirements
560 __glibcxx_function_requires(_BidirectionalIteratorConcept<
561 _BidirectionalIterator1>)
562 __glibcxx_function_requires(_BidirectionalIteratorConcept<
563 _BidirectionalIterator2>)
565 typedef reverse_iterator<_BidirectionalIterator1> _RevIterator1;
566 typedef reverse_iterator<_BidirectionalIterator2> _RevIterator2;
568 _RevIterator1 __rlast1(__first1);
569 _RevIterator2 __rlast2(__first2);
570 _RevIterator1 __rresult = _GLIBCXX_STD_P::search(_RevIterator1(__last1),
572 _RevIterator2(__last2),
575 if (__rresult == __rlast1)
579 _BidirectionalIterator1 __result = __rresult.base();
580 std::advance(__result, -std::distance(__first2, __last2));
585 template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
586 typename _BinaryPredicate>
587 _BidirectionalIterator1
588 __find_end(_BidirectionalIterator1 __first1,
589 _BidirectionalIterator1 __last1,
590 _BidirectionalIterator2 __first2,
591 _BidirectionalIterator2 __last2,
592 bidirectional_iterator_tag, bidirectional_iterator_tag,
593 _BinaryPredicate __comp)
595 // concept requirements
596 __glibcxx_function_requires(_BidirectionalIteratorConcept<
597 _BidirectionalIterator1>)
598 __glibcxx_function_requires(_BidirectionalIteratorConcept<
599 _BidirectionalIterator2>)
601 typedef reverse_iterator<_BidirectionalIterator1> _RevIterator1;
602 typedef reverse_iterator<_BidirectionalIterator2> _RevIterator2;
604 _RevIterator1 __rlast1(__first1);
605 _RevIterator2 __rlast2(__first2);
606 _RevIterator1 __rresult = std::search(_RevIterator1(__last1), __rlast1,
607 _RevIterator2(__last2), __rlast2,
610 if (__rresult == __rlast1)
614 _BidirectionalIterator1 __result = __rresult.base();
615 std::advance(__result, -std::distance(__first2, __last2));
621 * @brief Find last matching subsequence in a sequence.
622 * @ingroup non_mutating_algorithms
623 * @param first1 Start of range to search.
624 * @param last1 End of range to search.
625 * @param first2 Start of sequence to match.
626 * @param last2 End of sequence to match.
627 * @return The last iterator @c i in the range
628 * @p [first1,last1-(last2-first2)) such that @c *(i+N) == @p *(first2+N)
629 * for each @c N in the range @p [0,last2-first2), or @p last1 if no
630 * such iterator exists.
632 * Searches the range @p [first1,last1) for a sub-sequence that compares
633 * equal value-by-value with the sequence given by @p [first2,last2) and
634 * returns an iterator to the first element of the sub-sequence, or
635 * @p last1 if the sub-sequence is not found. The sub-sequence will be the
636 * last such subsequence contained in [first,last1).
638 * Because the sub-sequence must lie completely within the range
639 * @p [first1,last1) it must start at a position less than
640 * @p last1-(last2-first2) where @p last2-first2 is the length of the
642 * This means that the returned iterator @c i will be in the range
643 * @p [first1,last1-(last2-first2))
645 template<typename _ForwardIterator1, typename _ForwardIterator2>
646 inline _ForwardIterator1
647 find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
648 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
650 // concept requirements
651 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
652 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
653 __glibcxx_function_requires(_EqualOpConcept<
654 typename iterator_traits<_ForwardIterator1>::value_type,
655 typename iterator_traits<_ForwardIterator2>::value_type>)
656 __glibcxx_requires_valid_range(__first1, __last1);
657 __glibcxx_requires_valid_range(__first2, __last2);
659 return std::__find_end(__first1, __last1, __first2, __last2,
660 std::__iterator_category(__first1),
661 std::__iterator_category(__first2));
665 * @brief Find last matching subsequence in a sequence using a predicate.
666 * @ingroup non_mutating_algorithms
667 * @param first1 Start of range to search.
668 * @param last1 End of range to search.
669 * @param first2 Start of sequence to match.
670 * @param last2 End of sequence to match.
671 * @param comp The predicate to use.
672 * @return The last iterator @c i in the range
673 * @p [first1,last1-(last2-first2)) such that @c predicate(*(i+N), @p
674 * (first2+N)) is true for each @c N in the range @p [0,last2-first2), or
675 * @p last1 if no such iterator exists.
677 * Searches the range @p [first1,last1) for a sub-sequence that compares
678 * equal value-by-value with the sequence given by @p [first2,last2) using
679 * comp as a predicate and returns an iterator to the first element of the
680 * sub-sequence, or @p last1 if the sub-sequence is not found. The
681 * sub-sequence will be the last such subsequence contained in
684 * Because the sub-sequence must lie completely within the range
685 * @p [first1,last1) it must start at a position less than
686 * @p last1-(last2-first2) where @p last2-first2 is the length of the
688 * This means that the returned iterator @c i will be in the range
689 * @p [first1,last1-(last2-first2))
691 template<typename _ForwardIterator1, typename _ForwardIterator2,
692 typename _BinaryPredicate>
693 inline _ForwardIterator1
694 find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
695 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
696 _BinaryPredicate __comp)
698 // concept requirements
699 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
700 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
701 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
702 typename iterator_traits<_ForwardIterator1>::value_type,
703 typename iterator_traits<_ForwardIterator2>::value_type>)
704 __glibcxx_requires_valid_range(__first1, __last1);
705 __glibcxx_requires_valid_range(__first2, __last2);
707 return std::__find_end(__first1, __last1, __first2, __last2,
708 std::__iterator_category(__first1),
709 std::__iterator_category(__first2),
713 #ifdef __GXX_EXPERIMENTAL_CXX0X__
715 * @brief Checks that a predicate is true for all the elements
717 * @ingroup non_mutating_algorithms
718 * @param first An input iterator.
719 * @param last An input iterator.
720 * @param pred A predicate.
721 * @return True if the check is true, false otherwise.
723 * Returns true if @p pred is true for each element in the range
724 * @p [first,last), and false otherwise.
726 template<typename _InputIterator, typename _Predicate>
728 all_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
729 { return __last == std::find_if_not(__first, __last, __pred); }
732 * @brief Checks that a predicate is false for all the elements
734 * @ingroup non_mutating_algorithms
735 * @param first An input iterator.
736 * @param last An input iterator.
737 * @param pred A predicate.
738 * @return True if the check is true, false otherwise.
740 * Returns true if @p pred is false for each element in the range
741 * @p [first,last), and false otherwise.
743 template<typename _InputIterator, typename _Predicate>
745 none_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
746 { return __last == _GLIBCXX_STD_P::find_if(__first, __last, __pred); }
749 * @brief Checks that a predicate is false for at least an element
751 * @ingroup non_mutating_algorithms
752 * @param first An input iterator.
753 * @param last An input iterator.
754 * @param pred A predicate.
755 * @return True if the check is true, false otherwise.
757 * Returns true if an element exists in the range @p [first,last) such that
758 * @p pred is true, and false otherwise.
760 template<typename _InputIterator, typename _Predicate>
762 any_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
763 { return !std::none_of(__first, __last, __pred); }
766 * @brief Find the first element in a sequence for which a
767 * predicate is false.
768 * @ingroup non_mutating_algorithms
769 * @param first An input iterator.
770 * @param last An input iterator.
771 * @param pred A predicate.
772 * @return The first iterator @c i in the range @p [first,last)
773 * such that @p pred(*i) is false, or @p last if no such iterator exists.
775 template<typename _InputIterator, typename _Predicate>
776 inline _InputIterator
777 find_if_not(_InputIterator __first, _InputIterator __last,
780 // concept requirements
781 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
782 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
783 typename iterator_traits<_InputIterator>::value_type>)
784 __glibcxx_requires_valid_range(__first, __last);
785 return std::__find_if_not(__first, __last, __pred,
786 std::__iterator_category(__first));
790 * @brief Checks whether the sequence is partitioned.
791 * @ingroup mutating_algorithms
792 * @param first An input iterator.
793 * @param last An input iterator.
794 * @param pred A predicate.
795 * @return True if the range @p [first,last) is partioned by @p pred,
796 * i.e. if all elements that satisfy @p pred appear before those that
799 template<typename _InputIterator, typename _Predicate>
801 is_partitioned(_InputIterator __first, _InputIterator __last,
804 __first = std::find_if_not(__first, __last, __pred);
805 return std::none_of(__first, __last, __pred);
809 * @brief Find the partition point of a partitioned range.
810 * @ingroup mutating_algorithms
811 * @param first An iterator.
812 * @param last Another iterator.
813 * @param pred A predicate.
814 * @return An iterator @p mid such that @p all_of(first, mid, pred)
815 * and @p none_of(mid, last, pred) are both true.
817 template<typename _ForwardIterator, typename _Predicate>
819 partition_point(_ForwardIterator __first, _ForwardIterator __last,
822 // concept requirements
823 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
824 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
825 typename iterator_traits<_ForwardIterator>::value_type>)
827 // A specific debug-mode test will be necessary...
828 __glibcxx_requires_valid_range(__first, __last);
830 typedef typename iterator_traits<_ForwardIterator>::difference_type
833 _DistanceType __len = std::distance(__first, __last);
834 _DistanceType __half;
835 _ForwardIterator __middle;
841 std::advance(__middle, __half);
842 if (__pred(*__middle))
846 __len = __len - __half - 1;
857 * @brief Copy a sequence, removing elements of a given value.
858 * @ingroup mutating_algorithms
859 * @param first An input iterator.
860 * @param last An input iterator.
861 * @param result An output iterator.
862 * @param value The value to be removed.
863 * @return An iterator designating the end of the resulting sequence.
865 * Copies each element in the range @p [first,last) not equal to @p value
866 * to the range beginning at @p result.
867 * remove_copy() is stable, so the relative order of elements that are
868 * copied is unchanged.
870 template<typename _InputIterator, typename _OutputIterator, typename _Tp>
872 remove_copy(_InputIterator __first, _InputIterator __last,
873 _OutputIterator __result, const _Tp& __value)
875 // concept requirements
876 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
877 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
878 typename iterator_traits<_InputIterator>::value_type>)
879 __glibcxx_function_requires(_EqualOpConcept<
880 typename iterator_traits<_InputIterator>::value_type, _Tp>)
881 __glibcxx_requires_valid_range(__first, __last);
883 for (; __first != __last; ++__first)
884 if (!(*__first == __value))
886 *__result = *__first;
893 * @brief Copy a sequence, removing elements for which a predicate is true.
894 * @ingroup mutating_algorithms
895 * @param first An input iterator.
896 * @param last An input iterator.
897 * @param result An output iterator.
898 * @param pred A predicate.
899 * @return An iterator designating the end of the resulting sequence.
901 * Copies each element in the range @p [first,last) for which
902 * @p pred returns false to the range beginning at @p result.
904 * remove_copy_if() is stable, so the relative order of elements that are
905 * copied is unchanged.
907 template<typename _InputIterator, typename _OutputIterator,
910 remove_copy_if(_InputIterator __first, _InputIterator __last,
911 _OutputIterator __result, _Predicate __pred)
913 // concept requirements
914 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
915 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
916 typename iterator_traits<_InputIterator>::value_type>)
917 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
918 typename iterator_traits<_InputIterator>::value_type>)
919 __glibcxx_requires_valid_range(__first, __last);
921 for (; __first != __last; ++__first)
922 if (!bool(__pred(*__first)))
924 *__result = *__first;
930 #ifdef __GXX_EXPERIMENTAL_CXX0X__
932 * @brief Copy the elements of a sequence for which a predicate is true.
933 * @ingroup mutating_algorithms
934 * @param first An input iterator.
935 * @param last An input iterator.
936 * @param result An output iterator.
937 * @param pred A predicate.
938 * @return An iterator designating the end of the resulting sequence.
940 * Copies each element in the range @p [first,last) for which
941 * @p pred returns true to the range beginning at @p result.
943 * copy_if() is stable, so the relative order of elements that are
944 * copied is unchanged.
946 template<typename _InputIterator, typename _OutputIterator,
949 copy_if(_InputIterator __first, _InputIterator __last,
950 _OutputIterator __result, _Predicate __pred)
952 // concept requirements
953 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
954 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
955 typename iterator_traits<_InputIterator>::value_type>)
956 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
957 typename iterator_traits<_InputIterator>::value_type>)
958 __glibcxx_requires_valid_range(__first, __last);
960 for (; __first != __last; ++__first)
961 if (__pred(*__first))
963 *__result = *__first;
970 template<typename _InputIterator, typename _Size, typename _OutputIterator>
972 __copy_n(_InputIterator __first, _Size __n,
973 _OutputIterator __result, input_iterator_tag)
975 for (; __n > 0; --__n)
977 *__result = *__first;
984 template<typename _RandomAccessIterator, typename _Size,
985 typename _OutputIterator>
986 inline _OutputIterator
987 __copy_n(_RandomAccessIterator __first, _Size __n,
988 _OutputIterator __result, random_access_iterator_tag)
989 { return std::copy(__first, __first + __n, __result); }
992 * @brief Copies the range [first,first+n) into [result,result+n).
993 * @ingroup mutating_algorithms
994 * @param first An input iterator.
995 * @param n The number of elements to copy.
996 * @param result An output iterator.
999 * This inline function will boil down to a call to @c memmove whenever
1000 * possible. Failing that, if random access iterators are passed, then the
1001 * loop count will be known (and therefore a candidate for compiler
1002 * optimizations such as unrolling).
1004 template<typename _InputIterator, typename _Size, typename _OutputIterator>
1005 inline _OutputIterator
1006 copy_n(_InputIterator __first, _Size __n, _OutputIterator __result)
1008 // concept requirements
1009 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
1010 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
1011 typename iterator_traits<_InputIterator>::value_type>)
1013 return std::__copy_n(__first, __n, __result,
1014 std::__iterator_category(__first));
1018 * @brief Copy the elements of a sequence to separate output sequences
1019 * depending on the truth value of a predicate.
1020 * @ingroup mutating_algorithms
1021 * @param first An input iterator.
1022 * @param last An input iterator.
1023 * @param out_true An output iterator.
1024 * @param out_false An output iterator.
1025 * @param pred A predicate.
1026 * @return A pair designating the ends of the resulting sequences.
1028 * Copies each element in the range @p [first,last) for which
1029 * @p pred returns true to the range beginning at @p out_true
1030 * and each element for which @p pred returns false to @p out_false.
1032 template<typename _InputIterator, typename _OutputIterator1,
1033 typename _OutputIterator2, typename _Predicate>
1034 pair<_OutputIterator1, _OutputIterator2>
1035 partition_copy(_InputIterator __first, _InputIterator __last,
1036 _OutputIterator1 __out_true, _OutputIterator2 __out_false,
1039 // concept requirements
1040 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
1041 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator1,
1042 typename iterator_traits<_InputIterator>::value_type>)
1043 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator2,
1044 typename iterator_traits<_InputIterator>::value_type>)
1045 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
1046 typename iterator_traits<_InputIterator>::value_type>)
1047 __glibcxx_requires_valid_range(__first, __last);
1049 for (; __first != __last; ++__first)
1050 if (__pred(*__first))
1052 *__out_true = *__first;
1057 *__out_false = *__first;
1061 return pair<_OutputIterator1, _OutputIterator2>(__out_true, __out_false);
1066 * @brief Remove elements from a sequence.
1067 * @ingroup mutating_algorithms
1068 * @param first An input iterator.
1069 * @param last An input iterator.
1070 * @param value The value to be removed.
1071 * @return An iterator designating the end of the resulting sequence.
1073 * All elements equal to @p value are removed from the range
1076 * remove() is stable, so the relative order of elements that are
1077 * not removed is unchanged.
1079 * Elements between the end of the resulting sequence and @p last
1080 * are still present, but their value is unspecified.
1082 template<typename _ForwardIterator, typename _Tp>
1084 remove(_ForwardIterator __first, _ForwardIterator __last,
1087 // concept requirements
1088 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
1090 __glibcxx_function_requires(_EqualOpConcept<
1091 typename iterator_traits<_ForwardIterator>::value_type, _Tp>)
1092 __glibcxx_requires_valid_range(__first, __last);
1094 __first = _GLIBCXX_STD_P::find(__first, __last, __value);
1095 if(__first == __last)
1097 _ForwardIterator __result = __first;
1099 for(; __first != __last; ++__first)
1100 if(!(*__first == __value))
1102 *__result = _GLIBCXX_MOVE(*__first);
1109 * @brief Remove elements from a sequence using a predicate.
1110 * @ingroup mutating_algorithms
1111 * @param first A forward iterator.
1112 * @param last A forward iterator.
1113 * @param pred A predicate.
1114 * @return An iterator designating the end of the resulting sequence.
1116 * All elements for which @p pred returns true are removed from the range
1119 * remove_if() is stable, so the relative order of elements that are
1120 * not removed is unchanged.
1122 * Elements between the end of the resulting sequence and @p last
1123 * are still present, but their value is unspecified.
1125 template<typename _ForwardIterator, typename _Predicate>
1127 remove_if(_ForwardIterator __first, _ForwardIterator __last,
1130 // concept requirements
1131 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
1133 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
1134 typename iterator_traits<_ForwardIterator>::value_type>)
1135 __glibcxx_requires_valid_range(__first, __last);
1137 __first = _GLIBCXX_STD_P::find_if(__first, __last, __pred);
1138 if(__first == __last)
1140 _ForwardIterator __result = __first;
1142 for(; __first != __last; ++__first)
1143 if(!bool(__pred(*__first)))
1145 *__result = _GLIBCXX_MOVE(*__first);
1152 * @brief Remove consecutive duplicate values from a sequence.
1153 * @ingroup mutating_algorithms
1154 * @param first A forward iterator.
1155 * @param last A forward iterator.
1156 * @return An iterator designating the end of the resulting sequence.
1158 * Removes all but the first element from each group of consecutive
1159 * values that compare equal.
1160 * unique() is stable, so the relative order of elements that are
1161 * not removed is unchanged.
1162 * Elements between the end of the resulting sequence and @p last
1163 * are still present, but their value is unspecified.
1165 template<typename _ForwardIterator>
1167 unique(_ForwardIterator __first, _ForwardIterator __last)
1169 // concept requirements
1170 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
1172 __glibcxx_function_requires(_EqualityComparableConcept<
1173 typename iterator_traits<_ForwardIterator>::value_type>)
1174 __glibcxx_requires_valid_range(__first, __last);
1176 // Skip the beginning, if already unique.
1177 __first = _GLIBCXX_STD_P::adjacent_find(__first, __last);
1178 if (__first == __last)
1181 // Do the real copy work.
1182 _ForwardIterator __dest = __first;
1184 while (++__first != __last)
1185 if (!(*__dest == *__first))
1186 *++__dest = _GLIBCXX_MOVE(*__first);
1191 * @brief Remove consecutive values from a sequence using a predicate.
1192 * @ingroup mutating_algorithms
1193 * @param first A forward iterator.
1194 * @param last A forward iterator.
1195 * @param binary_pred A binary predicate.
1196 * @return An iterator designating the end of the resulting sequence.
1198 * Removes all but the first element from each group of consecutive
1199 * values for which @p binary_pred returns true.
1200 * unique() is stable, so the relative order of elements that are
1201 * not removed is unchanged.
1202 * Elements between the end of the resulting sequence and @p last
1203 * are still present, but their value is unspecified.
1205 template<typename _ForwardIterator, typename _BinaryPredicate>
1207 unique(_ForwardIterator __first, _ForwardIterator __last,
1208 _BinaryPredicate __binary_pred)
1210 // concept requirements
1211 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
1213 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
1214 typename iterator_traits<_ForwardIterator>::value_type,
1215 typename iterator_traits<_ForwardIterator>::value_type>)
1216 __glibcxx_requires_valid_range(__first, __last);
1218 // Skip the beginning, if already unique.
1219 __first = _GLIBCXX_STD_P::adjacent_find(__first, __last, __binary_pred);
1220 if (__first == __last)
1223 // Do the real copy work.
1224 _ForwardIterator __dest = __first;
1226 while (++__first != __last)
1227 if (!bool(__binary_pred(*__dest, *__first)))
1228 *++__dest = _GLIBCXX_MOVE(*__first);
1233 * This is an uglified unique_copy(_InputIterator, _InputIterator,
1235 * overloaded for forward iterators and output iterator as result.
1237 template<typename _ForwardIterator, typename _OutputIterator>
1239 __unique_copy(_ForwardIterator __first, _ForwardIterator __last,
1240 _OutputIterator __result,
1241 forward_iterator_tag, output_iterator_tag)
1243 // concept requirements -- taken care of in dispatching function
1244 _ForwardIterator __next = __first;
1245 *__result = *__first;
1246 while (++__next != __last)
1247 if (!(*__first == *__next))
1250 *++__result = *__first;
1256 * This is an uglified unique_copy(_InputIterator, _InputIterator,
1258 * overloaded for input iterators and output iterator as result.
1260 template<typename _InputIterator, typename _OutputIterator>
1262 __unique_copy(_InputIterator __first, _InputIterator __last,
1263 _OutputIterator __result,
1264 input_iterator_tag, output_iterator_tag)
1266 // concept requirements -- taken care of in dispatching function
1267 typename iterator_traits<_InputIterator>::value_type __value = *__first;
1268 *__result = __value;
1269 while (++__first != __last)
1270 if (!(__value == *__first))
1273 *++__result = __value;
1279 * This is an uglified unique_copy(_InputIterator, _InputIterator,
1281 * overloaded for input iterators and forward iterator as result.
1283 template<typename _InputIterator, typename _ForwardIterator>
1285 __unique_copy(_InputIterator __first, _InputIterator __last,
1286 _ForwardIterator __result,
1287 input_iterator_tag, forward_iterator_tag)
1289 // concept requirements -- taken care of in dispatching function
1290 *__result = *__first;
1291 while (++__first != __last)
1292 if (!(*__result == *__first))
1293 *++__result = *__first;
1298 * This is an uglified
1299 * unique_copy(_InputIterator, _InputIterator, _OutputIterator,
1301 * overloaded for forward iterators and output iterator as result.
1303 template<typename _ForwardIterator, typename _OutputIterator,
1304 typename _BinaryPredicate>
1306 __unique_copy(_ForwardIterator __first, _ForwardIterator __last,
1307 _OutputIterator __result, _BinaryPredicate __binary_pred,
1308 forward_iterator_tag, output_iterator_tag)
1310 // concept requirements -- iterators already checked
1311 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
1312 typename iterator_traits<_ForwardIterator>::value_type,
1313 typename iterator_traits<_ForwardIterator>::value_type>)
1315 _ForwardIterator __next = __first;
1316 *__result = *__first;
1317 while (++__next != __last)
1318 if (!bool(__binary_pred(*__first, *__next)))
1321 *++__result = *__first;
1327 * This is an uglified
1328 * unique_copy(_InputIterator, _InputIterator, _OutputIterator,
1330 * overloaded for input iterators and output iterator as result.
1332 template<typename _InputIterator, typename _OutputIterator,
1333 typename _BinaryPredicate>
1335 __unique_copy(_InputIterator __first, _InputIterator __last,
1336 _OutputIterator __result, _BinaryPredicate __binary_pred,
1337 input_iterator_tag, output_iterator_tag)
1339 // concept requirements -- iterators already checked
1340 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
1341 typename iterator_traits<_InputIterator>::value_type,
1342 typename iterator_traits<_InputIterator>::value_type>)
1344 typename iterator_traits<_InputIterator>::value_type __value = *__first;
1345 *__result = __value;
1346 while (++__first != __last)
1347 if (!bool(__binary_pred(__value, *__first)))
1350 *++__result = __value;
1356 * This is an uglified
1357 * unique_copy(_InputIterator, _InputIterator, _OutputIterator,
1359 * overloaded for input iterators and forward iterator as result.
1361 template<typename _InputIterator, typename _ForwardIterator,
1362 typename _BinaryPredicate>
1364 __unique_copy(_InputIterator __first, _InputIterator __last,
1365 _ForwardIterator __result, _BinaryPredicate __binary_pred,
1366 input_iterator_tag, forward_iterator_tag)
1368 // concept requirements -- iterators already checked
1369 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
1370 typename iterator_traits<_ForwardIterator>::value_type,
1371 typename iterator_traits<_InputIterator>::value_type>)
1373 *__result = *__first;
1374 while (++__first != __last)
1375 if (!bool(__binary_pred(*__result, *__first)))
1376 *++__result = *__first;
1381 * This is an uglified reverse(_BidirectionalIterator,
1382 * _BidirectionalIterator)
1383 * overloaded for bidirectional iterators.
1385 template<typename _BidirectionalIterator>
1387 __reverse(_BidirectionalIterator __first, _BidirectionalIterator __last,
1388 bidirectional_iterator_tag)
1391 if (__first == __last || __first == --__last)
1395 std::iter_swap(__first, __last);
1401 * This is an uglified reverse(_BidirectionalIterator,
1402 * _BidirectionalIterator)
1403 * overloaded for random access iterators.
1405 template<typename _RandomAccessIterator>
1407 __reverse(_RandomAccessIterator __first, _RandomAccessIterator __last,
1408 random_access_iterator_tag)
1410 if (__first == __last)
1413 while (__first < __last)
1415 std::iter_swap(__first, __last);
1422 * @brief Reverse a sequence.
1423 * @ingroup mutating_algorithms
1424 * @param first A bidirectional iterator.
1425 * @param last A bidirectional iterator.
1426 * @return reverse() returns no value.
1428 * Reverses the order of the elements in the range @p [first,last),
1429 * so that the first element becomes the last etc.
1430 * For every @c i such that @p 0<=i<=(last-first)/2), @p reverse()
1431 * swaps @p *(first+i) and @p *(last-(i+1))
1433 template<typename _BidirectionalIterator>
1435 reverse(_BidirectionalIterator __first, _BidirectionalIterator __last)
1437 // concept requirements
1438 __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
1439 _BidirectionalIterator>)
1440 __glibcxx_requires_valid_range(__first, __last);
1441 std::__reverse(__first, __last, std::__iterator_category(__first));
1445 * @brief Copy a sequence, reversing its elements.
1446 * @ingroup mutating_algorithms
1447 * @param first A bidirectional iterator.
1448 * @param last A bidirectional iterator.
1449 * @param result An output iterator.
1450 * @return An iterator designating the end of the resulting sequence.
1452 * Copies the elements in the range @p [first,last) to the range
1453 * @p [result,result+(last-first)) such that the order of the
1454 * elements is reversed.
1455 * For every @c i such that @p 0<=i<=(last-first), @p reverse_copy()
1456 * performs the assignment @p *(result+(last-first)-i) = *(first+i).
1457 * The ranges @p [first,last) and @p [result,result+(last-first))
1460 template<typename _BidirectionalIterator, typename _OutputIterator>
1462 reverse_copy(_BidirectionalIterator __first, _BidirectionalIterator __last,
1463 _OutputIterator __result)
1465 // concept requirements
1466 __glibcxx_function_requires(_BidirectionalIteratorConcept<
1467 _BidirectionalIterator>)
1468 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
1469 typename iterator_traits<_BidirectionalIterator>::value_type>)
1470 __glibcxx_requires_valid_range(__first, __last);
1472 while (__first != __last)
1475 *__result = *__last;
1482 * This is a helper function for the rotate algorithm specialized on RAIs.
1483 * It returns the greatest common divisor of two integer values.
1485 template<typename _EuclideanRingElement>
1486 _EuclideanRingElement
1487 __gcd(_EuclideanRingElement __m, _EuclideanRingElement __n)
1491 _EuclideanRingElement __t = __m % __n;
1498 /// This is a helper function for the rotate algorithm.
1499 template<typename _ForwardIterator>
1501 __rotate(_ForwardIterator __first,
1502 _ForwardIterator __middle,
1503 _ForwardIterator __last,
1504 forward_iterator_tag)
1506 if (__first == __middle || __last == __middle)
1509 _ForwardIterator __first2 = __middle;
1512 std::iter_swap(__first, __first2);
1515 if (__first == __middle)
1516 __middle = __first2;
1518 while (__first2 != __last);
1520 __first2 = __middle;
1522 while (__first2 != __last)
1524 std::iter_swap(__first, __first2);
1527 if (__first == __middle)
1528 __middle = __first2;
1529 else if (__first2 == __last)
1530 __first2 = __middle;
1534 /// This is a helper function for the rotate algorithm.
1535 template<typename _BidirectionalIterator>
1537 __rotate(_BidirectionalIterator __first,
1538 _BidirectionalIterator __middle,
1539 _BidirectionalIterator __last,
1540 bidirectional_iterator_tag)
1542 // concept requirements
1543 __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
1544 _BidirectionalIterator>)
1546 if (__first == __middle || __last == __middle)
1549 std::__reverse(__first, __middle, bidirectional_iterator_tag());
1550 std::__reverse(__middle, __last, bidirectional_iterator_tag());
1552 while (__first != __middle && __middle != __last)
1554 std::iter_swap(__first, --__last);
1558 if (__first == __middle)
1559 std::__reverse(__middle, __last, bidirectional_iterator_tag());
1561 std::__reverse(__first, __middle, bidirectional_iterator_tag());
1564 /// This is a helper function for the rotate algorithm.
1565 template<typename _RandomAccessIterator>
1567 __rotate(_RandomAccessIterator __first,
1568 _RandomAccessIterator __middle,
1569 _RandomAccessIterator __last,
1570 random_access_iterator_tag)
1572 // concept requirements
1573 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
1574 _RandomAccessIterator>)
1576 if (__first == __middle || __last == __middle)
1579 typedef typename iterator_traits<_RandomAccessIterator>::difference_type
1581 typedef typename iterator_traits<_RandomAccessIterator>::value_type
1584 _Distance __n = __last - __first;
1585 _Distance __k = __middle - __first;
1587 if (__k == __n - __k)
1589 std::swap_ranges(__first, __middle, __middle);
1593 _RandomAccessIterator __p = __first;
1597 if (__k < __n - __k)
1599 if (__is_pod(_ValueType) && __k == 1)
1601 _ValueType __t = _GLIBCXX_MOVE(*__p);
1602 _GLIBCXX_MOVE3(__p + 1, __p + __n, __p);
1603 *(__p + __n - 1) = _GLIBCXX_MOVE(__t);
1606 _RandomAccessIterator __q = __p + __k;
1607 for (_Distance __i = 0; __i < __n - __k; ++ __i)
1609 std::iter_swap(__p, __q);
1616 std::swap(__n, __k);
1622 if (__is_pod(_ValueType) && __k == 1)
1624 _ValueType __t = _GLIBCXX_MOVE(*(__p + __n - 1));
1625 _GLIBCXX_MOVE_BACKWARD3(__p, __p + __n - 1, __p + __n);
1626 *__p = _GLIBCXX_MOVE(__t);
1629 _RandomAccessIterator __q = __p + __n;
1631 for (_Distance __i = 0; __i < __n - __k; ++ __i)
1635 std::iter_swap(__p, __q);
1640 std::swap(__n, __k);
1646 * @brief Rotate the elements of a sequence.
1647 * @ingroup mutating_algorithms
1648 * @param first A forward iterator.
1649 * @param middle A forward iterator.
1650 * @param last A forward iterator.
1653 * Rotates the elements of the range @p [first,last) by @p (middle-first)
1654 * positions so that the element at @p middle is moved to @p first, the
1655 * element at @p middle+1 is moved to @first+1 and so on for each element
1656 * in the range @p [first,last).
1658 * This effectively swaps the ranges @p [first,middle) and
1661 * Performs @p *(first+(n+(last-middle))%(last-first))=*(first+n) for
1662 * each @p n in the range @p [0,last-first).
1664 template<typename _ForwardIterator>
1666 rotate(_ForwardIterator __first, _ForwardIterator __middle,
1667 _ForwardIterator __last)
1669 // concept requirements
1670 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
1672 __glibcxx_requires_valid_range(__first, __middle);
1673 __glibcxx_requires_valid_range(__middle, __last);
1675 typedef typename iterator_traits<_ForwardIterator>::iterator_category
1677 std::__rotate(__first, __middle, __last, _IterType());
1681 * @brief Copy a sequence, rotating its elements.
1682 * @ingroup mutating_algorithms
1683 * @param first A forward iterator.
1684 * @param middle A forward iterator.
1685 * @param last A forward iterator.
1686 * @param result An output iterator.
1687 * @return An iterator designating the end of the resulting sequence.
1689 * Copies the elements of the range @p [first,last) to the range
1690 * beginning at @result, rotating the copied elements by @p (middle-first)
1691 * positions so that the element at @p middle is moved to @p result, the
1692 * element at @p middle+1 is moved to @result+1 and so on for each element
1693 * in the range @p [first,last).
1695 * Performs @p *(result+(n+(last-middle))%(last-first))=*(first+n) for
1696 * each @p n in the range @p [0,last-first).
1698 template<typename _ForwardIterator, typename _OutputIterator>
1700 rotate_copy(_ForwardIterator __first, _ForwardIterator __middle,
1701 _ForwardIterator __last, _OutputIterator __result)
1703 // concept requirements
1704 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
1705 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
1706 typename iterator_traits<_ForwardIterator>::value_type>)
1707 __glibcxx_requires_valid_range(__first, __middle);
1708 __glibcxx_requires_valid_range(__middle, __last);
1710 return std::copy(__first, __middle,
1711 std::copy(__middle, __last, __result));
1714 /// This is a helper function...
1715 template<typename _ForwardIterator, typename _Predicate>
1717 __partition(_ForwardIterator __first, _ForwardIterator __last,
1718 _Predicate __pred, forward_iterator_tag)
1720 if (__first == __last)
1723 while (__pred(*__first))
1724 if (++__first == __last)
1727 _ForwardIterator __next = __first;
1729 while (++__next != __last)
1730 if (__pred(*__next))
1732 std::iter_swap(__first, __next);
1739 /// This is a helper function...
1740 template<typename _BidirectionalIterator, typename _Predicate>
1741 _BidirectionalIterator
1742 __partition(_BidirectionalIterator __first, _BidirectionalIterator __last,
1743 _Predicate __pred, bidirectional_iterator_tag)
1748 if (__first == __last)
1750 else if (__pred(*__first))
1756 if (__first == __last)
1758 else if (!bool(__pred(*__last)))
1762 std::iter_swap(__first, __last);
1769 /// This is a helper function...
1770 template<typename _ForwardIterator, typename _Predicate, typename _Distance>
1772 __inplace_stable_partition(_ForwardIterator __first,
1773 _ForwardIterator __last,
1774 _Predicate __pred, _Distance __len)
1777 return __pred(*__first) ? __last : __first;
1778 _ForwardIterator __middle = __first;
1779 std::advance(__middle, __len / 2);
1780 _ForwardIterator __begin = std::__inplace_stable_partition(__first,
1784 _ForwardIterator __end = std::__inplace_stable_partition(__middle, __last,
1788 std::rotate(__begin, __middle, __end);
1789 std::advance(__begin, std::distance(__middle, __end));
1793 /// This is a helper function...
1794 template<typename _ForwardIterator, typename _Pointer, typename _Predicate,
1797 __stable_partition_adaptive(_ForwardIterator __first,
1798 _ForwardIterator __last,
1799 _Predicate __pred, _Distance __len,
1801 _Distance __buffer_size)
1803 if (__len <= __buffer_size)
1805 _ForwardIterator __result1 = __first;
1806 _Pointer __result2 = __buffer;
1807 for (; __first != __last; ++__first)
1808 if (__pred(*__first))
1810 *__result1 = _GLIBCXX_MOVE(*__first);
1815 *__result2 = _GLIBCXX_MOVE(*__first);
1818 _GLIBCXX_MOVE3(__buffer, __result2, __result1);
1823 _ForwardIterator __middle = __first;
1824 std::advance(__middle, __len / 2);
1825 _ForwardIterator __begin =
1826 std::__stable_partition_adaptive(__first, __middle, __pred,
1827 __len / 2, __buffer,
1829 _ForwardIterator __end =
1830 std::__stable_partition_adaptive(__middle, __last, __pred,
1832 __buffer, __buffer_size);
1833 std::rotate(__begin, __middle, __end);
1834 std::advance(__begin, std::distance(__middle, __end));
1840 * @brief Move elements for which a predicate is true to the beginning
1841 * of a sequence, preserving relative ordering.
1842 * @ingroup mutating_algorithms
1843 * @param first A forward iterator.
1844 * @param last A forward iterator.
1845 * @param pred A predicate functor.
1846 * @return An iterator @p middle such that @p pred(i) is true for each
1847 * iterator @p i in the range @p [first,middle) and false for each @p i
1848 * in the range @p [middle,last).
1850 * Performs the same function as @p partition() with the additional
1851 * guarantee that the relative ordering of elements in each group is
1852 * preserved, so any two elements @p x and @p y in the range
1853 * @p [first,last) such that @p pred(x)==pred(y) will have the same
1854 * relative ordering after calling @p stable_partition().
1856 template<typename _ForwardIterator, typename _Predicate>
1858 stable_partition(_ForwardIterator __first, _ForwardIterator __last,
1861 // concept requirements
1862 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
1864 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
1865 typename iterator_traits<_ForwardIterator>::value_type>)
1866 __glibcxx_requires_valid_range(__first, __last);
1868 if (__first == __last)
1872 typedef typename iterator_traits<_ForwardIterator>::value_type
1874 typedef typename iterator_traits<_ForwardIterator>::difference_type
1877 _Temporary_buffer<_ForwardIterator, _ValueType> __buf(__first,
1879 if (__buf.size() > 0)
1881 std::__stable_partition_adaptive(__first, __last, __pred,
1882 _DistanceType(__buf.requested_size()),
1884 _DistanceType(__buf.size()));
1887 std::__inplace_stable_partition(__first, __last, __pred,
1888 _DistanceType(__buf.requested_size()));
1892 /// This is a helper function for the sort routines.
1893 template<typename _RandomAccessIterator>
1895 __heap_select(_RandomAccessIterator __first,
1896 _RandomAccessIterator __middle,
1897 _RandomAccessIterator __last)
1899 std::make_heap(__first, __middle);
1900 for (_RandomAccessIterator __i = __middle; __i < __last; ++__i)
1901 if (*__i < *__first)
1902 std::__pop_heap(__first, __middle, __i);
1905 /// This is a helper function for the sort routines.
1906 template<typename _RandomAccessIterator, typename _Compare>
1908 __heap_select(_RandomAccessIterator __first,
1909 _RandomAccessIterator __middle,
1910 _RandomAccessIterator __last, _Compare __comp)
1912 std::make_heap(__first, __middle, __comp);
1913 for (_RandomAccessIterator __i = __middle; __i < __last; ++__i)
1914 if (__comp(*__i, *__first))
1915 std::__pop_heap(__first, __middle, __i, __comp);
1921 * @brief Copy the smallest elements of a sequence.
1922 * @ingroup sorting_algorithms
1923 * @param first An iterator.
1924 * @param last Another iterator.
1925 * @param result_first A random-access iterator.
1926 * @param result_last Another random-access iterator.
1927 * @return An iterator indicating the end of the resulting sequence.
1929 * Copies and sorts the smallest N values from the range @p [first,last)
1930 * to the range beginning at @p result_first, where the number of
1931 * elements to be copied, @p N, is the smaller of @p (last-first) and
1932 * @p (result_last-result_first).
1933 * After the sort if @p i and @j are iterators in the range
1934 * @p [result_first,result_first+N) such that @i precedes @j then
1935 * @p *j<*i is false.
1936 * The value returned is @p result_first+N.
1938 template<typename _InputIterator, typename _RandomAccessIterator>
1939 _RandomAccessIterator
1940 partial_sort_copy(_InputIterator __first, _InputIterator __last,
1941 _RandomAccessIterator __result_first,
1942 _RandomAccessIterator __result_last)
1944 typedef typename iterator_traits<_InputIterator>::value_type
1946 typedef typename iterator_traits<_RandomAccessIterator>::value_type
1948 typedef typename iterator_traits<_RandomAccessIterator>::difference_type
1951 // concept requirements
1952 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
1953 __glibcxx_function_requires(_ConvertibleConcept<_InputValueType,
1955 __glibcxx_function_requires(_LessThanOpConcept<_InputValueType,
1957 __glibcxx_function_requires(_LessThanComparableConcept<_OutputValueType>)
1958 __glibcxx_requires_valid_range(__first, __last);
1959 __glibcxx_requires_valid_range(__result_first, __result_last);
1961 if (__result_first == __result_last)
1962 return __result_last;
1963 _RandomAccessIterator __result_real_last = __result_first;
1964 while(__first != __last && __result_real_last != __result_last)
1966 *__result_real_last = *__first;
1967 ++__result_real_last;
1970 std::make_heap(__result_first, __result_real_last);
1971 while (__first != __last)
1973 if (*__first < *__result_first)
1974 std::__adjust_heap(__result_first, _DistanceType(0),
1975 _DistanceType(__result_real_last
1977 _InputValueType(*__first));
1980 std::sort_heap(__result_first, __result_real_last);
1981 return __result_real_last;
1985 * @brief Copy the smallest elements of a sequence using a predicate for
1987 * @ingroup sorting_algorithms
1988 * @param first An input iterator.
1989 * @param last Another input iterator.
1990 * @param result_first A random-access iterator.
1991 * @param result_last Another random-access iterator.
1992 * @param comp A comparison functor.
1993 * @return An iterator indicating the end of the resulting sequence.
1995 * Copies and sorts the smallest N values from the range @p [first,last)
1996 * to the range beginning at @p result_first, where the number of
1997 * elements to be copied, @p N, is the smaller of @p (last-first) and
1998 * @p (result_last-result_first).
1999 * After the sort if @p i and @j are iterators in the range
2000 * @p [result_first,result_first+N) such that @i precedes @j then
2001 * @p comp(*j,*i) is false.
2002 * The value returned is @p result_first+N.
2004 template<typename _InputIterator, typename _RandomAccessIterator, typename _Compare>
2005 _RandomAccessIterator
2006 partial_sort_copy(_InputIterator __first, _InputIterator __last,
2007 _RandomAccessIterator __result_first,
2008 _RandomAccessIterator __result_last,
2011 typedef typename iterator_traits<_InputIterator>::value_type
2013 typedef typename iterator_traits<_RandomAccessIterator>::value_type
2015 typedef typename iterator_traits<_RandomAccessIterator>::difference_type
2018 // concept requirements
2019 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
2020 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
2021 _RandomAccessIterator>)
2022 __glibcxx_function_requires(_ConvertibleConcept<_InputValueType,
2024 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2025 _InputValueType, _OutputValueType>)
2026 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2027 _OutputValueType, _OutputValueType>)
2028 __glibcxx_requires_valid_range(__first, __last);
2029 __glibcxx_requires_valid_range(__result_first, __result_last);
2031 if (__result_first == __result_last)
2032 return __result_last;
2033 _RandomAccessIterator __result_real_last = __result_first;
2034 while(__first != __last && __result_real_last != __result_last)
2036 *__result_real_last = *__first;
2037 ++__result_real_last;
2040 std::make_heap(__result_first, __result_real_last, __comp);
2041 while (__first != __last)
2043 if (__comp(*__first, *__result_first))
2044 std::__adjust_heap(__result_first, _DistanceType(0),
2045 _DistanceType(__result_real_last
2047 _InputValueType(*__first),
2051 std::sort_heap(__result_first, __result_real_last, __comp);
2052 return __result_real_last;
2055 /// This is a helper function for the sort routine.
2056 template<typename _RandomAccessIterator>
2058 __unguarded_linear_insert(_RandomAccessIterator __last)
2060 typename iterator_traits<_RandomAccessIterator>::value_type
2061 __val = _GLIBCXX_MOVE(*__last);
2062 _RandomAccessIterator __next = __last;
2064 while (__val < *__next)
2066 *__last = _GLIBCXX_MOVE(*__next);
2070 *__last = _GLIBCXX_MOVE(__val);
2073 /// This is a helper function for the sort routine.
2074 template<typename _RandomAccessIterator, typename _Compare>
2076 __unguarded_linear_insert(_RandomAccessIterator __last,
2079 typename iterator_traits<_RandomAccessIterator>::value_type
2080 __val = _GLIBCXX_MOVE(*__last);
2081 _RandomAccessIterator __next = __last;
2083 while (__comp(__val, *__next))
2085 *__last = _GLIBCXX_MOVE(*__next);
2089 *__last = _GLIBCXX_MOVE(__val);
2092 /// This is a helper function for the sort routine.
2093 template<typename _RandomAccessIterator>
2095 __insertion_sort(_RandomAccessIterator __first,
2096 _RandomAccessIterator __last)
2098 if (__first == __last)
2101 for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
2103 if (*__i < *__first)
2105 typename iterator_traits<_RandomAccessIterator>::value_type
2106 __val = _GLIBCXX_MOVE(*__i);
2107 _GLIBCXX_MOVE_BACKWARD3(__first, __i, __i + 1);
2108 *__first = _GLIBCXX_MOVE(__val);
2111 std::__unguarded_linear_insert(__i);
2115 /// This is a helper function for the sort routine.
2116 template<typename _RandomAccessIterator, typename _Compare>
2118 __insertion_sort(_RandomAccessIterator __first,
2119 _RandomAccessIterator __last, _Compare __comp)
2121 if (__first == __last) return;
2123 for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
2125 if (__comp(*__i, *__first))
2127 typename iterator_traits<_RandomAccessIterator>::value_type
2128 __val = _GLIBCXX_MOVE(*__i);
2129 _GLIBCXX_MOVE_BACKWARD3(__first, __i, __i + 1);
2130 *__first = _GLIBCXX_MOVE(__val);
2133 std::__unguarded_linear_insert(__i, __comp);
2137 /// This is a helper function for the sort routine.
2138 template<typename _RandomAccessIterator>
2140 __unguarded_insertion_sort(_RandomAccessIterator __first,
2141 _RandomAccessIterator __last)
2143 typedef typename iterator_traits<_RandomAccessIterator>::value_type
2146 for (_RandomAccessIterator __i = __first; __i != __last; ++__i)
2147 std::__unguarded_linear_insert(__i);
2150 /// This is a helper function for the sort routine.
2151 template<typename _RandomAccessIterator, typename _Compare>
2153 __unguarded_insertion_sort(_RandomAccessIterator __first,
2154 _RandomAccessIterator __last, _Compare __comp)
2156 typedef typename iterator_traits<_RandomAccessIterator>::value_type
2159 for (_RandomAccessIterator __i = __first; __i != __last; ++__i)
2160 std::__unguarded_linear_insert(__i, __comp);
2165 * This controls some aspect of the sort routines.
2167 enum { _S_threshold = 16 };
2169 /// This is a helper function for the sort routine.
2170 template<typename _RandomAccessIterator>
2172 __final_insertion_sort(_RandomAccessIterator __first,
2173 _RandomAccessIterator __last)
2175 if (__last - __first > int(_S_threshold))
2177 std::__insertion_sort(__first, __first + int(_S_threshold));
2178 std::__unguarded_insertion_sort(__first + int(_S_threshold), __last);
2181 std::__insertion_sort(__first, __last);
2184 /// This is a helper function for the sort routine.
2185 template<typename _RandomAccessIterator, typename _Compare>
2187 __final_insertion_sort(_RandomAccessIterator __first,
2188 _RandomAccessIterator __last, _Compare __comp)
2190 if (__last - __first > int(_S_threshold))
2192 std::__insertion_sort(__first, __first + int(_S_threshold), __comp);
2193 std::__unguarded_insertion_sort(__first + int(_S_threshold), __last,
2197 std::__insertion_sort(__first, __last, __comp);
2200 /// This is a helper function...
2201 template<typename _RandomAccessIterator, typename _Tp>
2202 _RandomAccessIterator
2203 __unguarded_partition(_RandomAccessIterator __first,
2204 _RandomAccessIterator __last, const _Tp& __pivot)
2208 while (*__first < __pivot)
2211 while (__pivot < *__last)
2213 if (!(__first < __last))
2215 std::iter_swap(__first, __last);
2220 /// This is a helper function...
2221 template<typename _RandomAccessIterator, typename _Tp, typename _Compare>
2222 _RandomAccessIterator
2223 __unguarded_partition(_RandomAccessIterator __first,
2224 _RandomAccessIterator __last,
2225 const _Tp& __pivot, _Compare __comp)
2229 while (__comp(*__first, __pivot))
2232 while (__comp(__pivot, *__last))
2234 if (!(__first < __last))
2236 std::iter_swap(__first, __last);
2241 /// This is a helper function...
2242 template<typename _RandomAccessIterator>
2243 inline _RandomAccessIterator
2244 __unguarded_partition_pivot(_RandomAccessIterator __first,
2245 _RandomAccessIterator __last)
2247 _RandomAccessIterator __mid = __first + (__last - __first) / 2;
2248 std::__move_median_first(__first, __mid, (__last - 1));
2249 return std::__unguarded_partition(__first + 1, __last, *__first);
2253 /// This is a helper function...
2254 template<typename _RandomAccessIterator, typename _Compare>
2255 inline _RandomAccessIterator
2256 __unguarded_partition_pivot(_RandomAccessIterator __first,
2257 _RandomAccessIterator __last, _Compare __comp)
2259 _RandomAccessIterator __mid = __first + (__last - __first) / 2;
2260 std::__move_median_first(__first, __mid, (__last - 1), __comp);
2261 return std::__unguarded_partition(__first + 1, __last, *__first, __comp);
2264 /// This is a helper function for the sort routine.
2265 template<typename _RandomAccessIterator, typename _Size>
2267 __introsort_loop(_RandomAccessIterator __first,
2268 _RandomAccessIterator __last,
2269 _Size __depth_limit)
2271 while (__last - __first > int(_S_threshold))
2273 if (__depth_limit == 0)
2275 _GLIBCXX_STD_P::partial_sort(__first, __last, __last);
2279 _RandomAccessIterator __cut =
2280 std::__unguarded_partition_pivot(__first, __last);
2281 std::__introsort_loop(__cut, __last, __depth_limit);
2286 /// This is a helper function for the sort routine.
2287 template<typename _RandomAccessIterator, typename _Size, typename _Compare>
2289 __introsort_loop(_RandomAccessIterator __first,
2290 _RandomAccessIterator __last,
2291 _Size __depth_limit, _Compare __comp)
2293 while (__last - __first > int(_S_threshold))
2295 if (__depth_limit == 0)
2297 _GLIBCXX_STD_P::partial_sort(__first, __last, __last, __comp);
2301 _RandomAccessIterator __cut =
2302 std::__unguarded_partition_pivot(__first, __last, __comp);
2303 std::__introsort_loop(__cut, __last, __depth_limit, __comp);
2310 template<typename _RandomAccessIterator, typename _Size>
2312 __introselect(_RandomAccessIterator __first, _RandomAccessIterator __nth,
2313 _RandomAccessIterator __last, _Size __depth_limit)
2315 typedef typename iterator_traits<_RandomAccessIterator>::value_type
2318 while (__last - __first > 3)
2320 if (__depth_limit == 0)
2322 std::__heap_select(__first, __nth + 1, __last);
2324 // Place the nth largest element in its final position.
2325 std::iter_swap(__first, __nth);
2329 _RandomAccessIterator __cut =
2330 std::__unguarded_partition_pivot(__first, __last);
2336 std::__insertion_sort(__first, __last);
2339 template<typename _RandomAccessIterator, typename _Size, typename _Compare>
2341 __introselect(_RandomAccessIterator __first, _RandomAccessIterator __nth,
2342 _RandomAccessIterator __last, _Size __depth_limit,
2345 typedef typename iterator_traits<_RandomAccessIterator>::value_type
2348 while (__last - __first > 3)
2350 if (__depth_limit == 0)
2352 std::__heap_select(__first, __nth + 1, __last, __comp);
2353 // Place the nth largest element in its final position.
2354 std::iter_swap(__first, __nth);
2358 _RandomAccessIterator __cut =
2359 std::__unguarded_partition_pivot(__first, __last, __comp);
2365 std::__insertion_sort(__first, __last, __comp);
2370 // lower_bound moved to stl_algobase.h
2373 * @brief Finds the first position in which @a val could be inserted
2374 * without changing the ordering.
2375 * @ingroup binary_search_algorithms
2376 * @param first An iterator.
2377 * @param last Another iterator.
2378 * @param val The search term.
2379 * @param comp A functor to use for comparisons.
2380 * @return An iterator pointing to the first element <em>not less
2381 * than</em> @a val, or end() if every element is less
2383 * @ingroup binary_search_algorithms
2385 * The comparison function should have the same effects on ordering as
2386 * the function used for the initial sort.
2388 template<typename _ForwardIterator, typename _Tp, typename _Compare>
2390 lower_bound(_ForwardIterator __first, _ForwardIterator __last,
2391 const _Tp& __val, _Compare __comp)
2393 typedef typename iterator_traits<_ForwardIterator>::value_type
2395 typedef typename iterator_traits<_ForwardIterator>::difference_type
2398 // concept requirements
2399 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2400 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2402 __glibcxx_requires_partitioned_lower_pred(__first, __last,
2405 _DistanceType __len = std::distance(__first, __last);
2406 _DistanceType __half;
2407 _ForwardIterator __middle;
2411 __half = __len >> 1;
2413 std::advance(__middle, __half);
2414 if (__comp(*__middle, __val))
2418 __len = __len - __half - 1;
2427 * @brief Finds the last position in which @a val could be inserted
2428 * without changing the ordering.
2429 * @ingroup binary_search_algorithms
2430 * @param first An iterator.
2431 * @param last Another iterator.
2432 * @param val The search term.
2433 * @return An iterator pointing to the first element greater than @a val,
2434 * or end() if no elements are greater than @a val.
2435 * @ingroup binary_search_algorithms
2437 template<typename _ForwardIterator, typename _Tp>
2439 upper_bound(_ForwardIterator __first, _ForwardIterator __last,
2442 typedef typename iterator_traits<_ForwardIterator>::value_type
2444 typedef typename iterator_traits<_ForwardIterator>::difference_type
2447 // concept requirements
2448 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2449 __glibcxx_function_requires(_LessThanOpConcept<_Tp, _ValueType>)
2450 __glibcxx_requires_partitioned_upper(__first, __last, __val);
2452 _DistanceType __len = std::distance(__first, __last);
2453 _DistanceType __half;
2454 _ForwardIterator __middle;
2458 __half = __len >> 1;
2460 std::advance(__middle, __half);
2461 if (__val < *__middle)
2467 __len = __len - __half - 1;
2474 * @brief Finds the last position in which @a val could be inserted
2475 * without changing the ordering.
2476 * @ingroup binary_search_algorithms
2477 * @param first An iterator.
2478 * @param last Another iterator.
2479 * @param val The search term.
2480 * @param comp A functor to use for comparisons.
2481 * @return An iterator pointing to the first element greater than @a val,
2482 * or end() if no elements are greater than @a val.
2483 * @ingroup binary_search_algorithms
2485 * The comparison function should have the same effects on ordering as
2486 * the function used for the initial sort.
2488 template<typename _ForwardIterator, typename _Tp, typename _Compare>
2490 upper_bound(_ForwardIterator __first, _ForwardIterator __last,
2491 const _Tp& __val, _Compare __comp)
2493 typedef typename iterator_traits<_ForwardIterator>::value_type
2495 typedef typename iterator_traits<_ForwardIterator>::difference_type
2498 // concept requirements
2499 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2500 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2502 __glibcxx_requires_partitioned_upper_pred(__first, __last,
2505 _DistanceType __len = std::distance(__first, __last);
2506 _DistanceType __half;
2507 _ForwardIterator __middle;
2511 __half = __len >> 1;
2513 std::advance(__middle, __half);
2514 if (__comp(__val, *__middle))
2520 __len = __len - __half - 1;
2527 * @brief Finds the largest subrange in which @a val could be inserted
2528 * at any place in it without changing the ordering.
2529 * @ingroup binary_search_algorithms
2530 * @param first An iterator.
2531 * @param last Another iterator.
2532 * @param val The search term.
2533 * @return An pair of iterators defining the subrange.
2534 * @ingroup binary_search_algorithms
2536 * This is equivalent to
2538 * std::make_pair(lower_bound(first, last, val),
2539 * upper_bound(first, last, val))
2541 * but does not actually call those functions.
2543 template<typename _ForwardIterator, typename _Tp>
2544 pair<_ForwardIterator, _ForwardIterator>
2545 equal_range(_ForwardIterator __first, _ForwardIterator __last,
2548 typedef typename iterator_traits<_ForwardIterator>::value_type
2550 typedef typename iterator_traits<_ForwardIterator>::difference_type
2553 // concept requirements
2554 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2555 __glibcxx_function_requires(_LessThanOpConcept<_ValueType, _Tp>)
2556 __glibcxx_function_requires(_LessThanOpConcept<_Tp, _ValueType>)
2557 __glibcxx_requires_partitioned_lower(__first, __last, __val);
2558 __glibcxx_requires_partitioned_upper(__first, __last, __val);
2560 _DistanceType __len = std::distance(__first, __last);
2561 _DistanceType __half;
2562 _ForwardIterator __middle, __left, __right;
2566 __half = __len >> 1;
2568 std::advance(__middle, __half);
2569 if (*__middle < __val)
2573 __len = __len - __half - 1;
2575 else if (__val < *__middle)
2579 __left = std::lower_bound(__first, __middle, __val);
2580 std::advance(__first, __len);
2581 __right = std::upper_bound(++__middle, __first, __val);
2582 return pair<_ForwardIterator, _ForwardIterator>(__left, __right);
2585 return pair<_ForwardIterator, _ForwardIterator>(__first, __first);
2589 * @brief Finds the largest subrange in which @a val could be inserted
2590 * at any place in it without changing the ordering.
2591 * @param first An iterator.
2592 * @param last Another iterator.
2593 * @param val The search term.
2594 * @param comp A functor to use for comparisons.
2595 * @return An pair of iterators defining the subrange.
2596 * @ingroup binary_search_algorithms
2598 * This is equivalent to
2600 * std::make_pair(lower_bound(first, last, val, comp),
2601 * upper_bound(first, last, val, comp))
2603 * but does not actually call those functions.
2605 template<typename _ForwardIterator, typename _Tp, typename _Compare>
2606 pair<_ForwardIterator, _ForwardIterator>
2607 equal_range(_ForwardIterator __first, _ForwardIterator __last,
2611 typedef typename iterator_traits<_ForwardIterator>::value_type
2613 typedef typename iterator_traits<_ForwardIterator>::difference_type
2616 // concept requirements
2617 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2618 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2620 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2622 __glibcxx_requires_partitioned_lower_pred(__first, __last,
2624 __glibcxx_requires_partitioned_upper_pred(__first, __last,
2627 _DistanceType __len = std::distance(__first, __last);
2628 _DistanceType __half;
2629 _ForwardIterator __middle, __left, __right;
2633 __half = __len >> 1;
2635 std::advance(__middle, __half);
2636 if (__comp(*__middle, __val))
2640 __len = __len - __half - 1;
2642 else if (__comp(__val, *__middle))
2646 __left = std::lower_bound(__first, __middle, __val, __comp);
2647 std::advance(__first, __len);
2648 __right = std::upper_bound(++__middle, __first, __val, __comp);
2649 return pair<_ForwardIterator, _ForwardIterator>(__left, __right);
2652 return pair<_ForwardIterator, _ForwardIterator>(__first, __first);
2656 * @brief Determines whether an element exists in a range.
2657 * @ingroup binary_search_algorithms
2658 * @param first An iterator.
2659 * @param last Another iterator.
2660 * @param val The search term.
2661 * @return True if @a val (or its equivalent) is in [@a first,@a last ].
2663 * Note that this does not actually return an iterator to @a val. For
2664 * that, use std::find or a container's specialized find member functions.
2666 template<typename _ForwardIterator, typename _Tp>
2668 binary_search(_ForwardIterator __first, _ForwardIterator __last,
2671 typedef typename iterator_traits<_ForwardIterator>::value_type
2674 // concept requirements
2675 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2676 __glibcxx_function_requires(_LessThanOpConcept<_Tp, _ValueType>)
2677 __glibcxx_requires_partitioned_lower(__first, __last, __val);
2678 __glibcxx_requires_partitioned_upper(__first, __last, __val);
2680 _ForwardIterator __i = std::lower_bound(__first, __last, __val);
2681 return __i != __last && !(__val < *__i);
2685 * @brief Determines whether an element exists in a range.
2686 * @ingroup binary_search_algorithms
2687 * @param first An iterator.
2688 * @param last Another iterator.
2689 * @param val The search term.
2690 * @param comp A functor to use for comparisons.
2691 * @return True if @a val (or its equivalent) is in [@a first,@a last ].
2693 * Note that this does not actually return an iterator to @a val. For
2694 * that, use std::find or a container's specialized find member functions.
2696 * The comparison function should have the same effects on ordering as
2697 * the function used for the initial sort.
2699 template<typename _ForwardIterator, typename _Tp, typename _Compare>
2701 binary_search(_ForwardIterator __first, _ForwardIterator __last,
2702 const _Tp& __val, _Compare __comp)
2704 typedef typename iterator_traits<_ForwardIterator>::value_type
2707 // concept requirements
2708 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2709 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2711 __glibcxx_requires_partitioned_lower_pred(__first, __last,
2713 __glibcxx_requires_partitioned_upper_pred(__first, __last,
2716 _ForwardIterator __i = std::lower_bound(__first, __last, __val, __comp);
2717 return __i != __last && !bool(__comp(__val, *__i));
2722 /// This is a helper function for the merge routines.
2723 template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
2724 typename _BidirectionalIterator3>
2725 _BidirectionalIterator3
2726 __merge_backward(_BidirectionalIterator1 __first1,
2727 _BidirectionalIterator1 __last1,
2728 _BidirectionalIterator2 __first2,
2729 _BidirectionalIterator2 __last2,
2730 _BidirectionalIterator3 __result)
2732 if (__first1 == __last1)
2733 return std::copy_backward(__first2, __last2, __result);
2734 if (__first2 == __last2)
2735 return std::copy_backward(__first1, __last1, __result);
2740 if (*__last2 < *__last1)
2742 *--__result = *__last1;
2743 if (__first1 == __last1)
2744 return std::copy_backward(__first2, ++__last2, __result);
2749 *--__result = *__last2;
2750 if (__first2 == __last2)
2751 return std::copy_backward(__first1, ++__last1, __result);
2757 /// This is a helper function for the merge routines.
2758 template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
2759 typename _BidirectionalIterator3, typename _Compare>
2760 _BidirectionalIterator3
2761 __merge_backward(_BidirectionalIterator1 __first1,
2762 _BidirectionalIterator1 __last1,
2763 _BidirectionalIterator2 __first2,
2764 _BidirectionalIterator2 __last2,
2765 _BidirectionalIterator3 __result,
2768 if (__first1 == __last1)
2769 return std::copy_backward(__first2, __last2, __result);
2770 if (__first2 == __last2)
2771 return std::copy_backward(__first1, __last1, __result);
2776 if (__comp(*__last2, *__last1))
2778 *--__result = *__last1;
2779 if (__first1 == __last1)
2780 return std::copy_backward(__first2, ++__last2, __result);
2785 *--__result = *__last2;
2786 if (__first2 == __last2)
2787 return std::copy_backward(__first1, ++__last1, __result);
2793 /// This is a helper function for the merge routines.
2794 template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
2796 _BidirectionalIterator1
2797 __rotate_adaptive(_BidirectionalIterator1 __first,
2798 _BidirectionalIterator1 __middle,
2799 _BidirectionalIterator1 __last,
2800 _Distance __len1, _Distance __len2,
2801 _BidirectionalIterator2 __buffer,
2802 _Distance __buffer_size)
2804 _BidirectionalIterator2 __buffer_end;
2805 if (__len1 > __len2 && __len2 <= __buffer_size)
2807 __buffer_end = _GLIBCXX_MOVE3(__middle, __last, __buffer);
2808 _GLIBCXX_MOVE_BACKWARD3(__first, __middle, __last);
2809 return _GLIBCXX_MOVE3(__buffer, __buffer_end, __first);
2811 else if (__len1 <= __buffer_size)
2813 __buffer_end = _GLIBCXX_MOVE3(__first, __middle, __buffer);
2814 _GLIBCXX_MOVE3(__middle, __last, __first);
2815 return _GLIBCXX_MOVE_BACKWARD3(__buffer, __buffer_end, __last);
2819 std::rotate(__first, __middle, __last);
2820 std::advance(__first, std::distance(__middle, __last));
2825 /// This is a helper function for the merge routines.
2826 template<typename _BidirectionalIterator, typename _Distance,
2829 __merge_adaptive(_BidirectionalIterator __first,
2830 _BidirectionalIterator __middle,
2831 _BidirectionalIterator __last,
2832 _Distance __len1, _Distance __len2,
2833 _Pointer __buffer, _Distance __buffer_size)
2835 if (__len1 <= __len2 && __len1 <= __buffer_size)
2837 _Pointer __buffer_end = _GLIBCXX_MOVE3(__first, __middle, __buffer);
2838 _GLIBCXX_STD_P::merge(_GLIBCXX_MAKE_MOVE_ITERATOR(__buffer),
2839 _GLIBCXX_MAKE_MOVE_ITERATOR(__buffer_end),
2840 _GLIBCXX_MAKE_MOVE_ITERATOR(__middle),
2841 _GLIBCXX_MAKE_MOVE_ITERATOR(__last),
2844 else if (__len2 <= __buffer_size)
2846 _Pointer __buffer_end = _GLIBCXX_MOVE3(__middle, __last, __buffer);
2847 std::__merge_backward(_GLIBCXX_MAKE_MOVE_ITERATOR(__first),
2848 _GLIBCXX_MAKE_MOVE_ITERATOR(__middle),
2849 _GLIBCXX_MAKE_MOVE_ITERATOR(__buffer),
2850 _GLIBCXX_MAKE_MOVE_ITERATOR(__buffer_end),
2855 _BidirectionalIterator __first_cut = __first;
2856 _BidirectionalIterator __second_cut = __middle;
2857 _Distance __len11 = 0;
2858 _Distance __len22 = 0;
2859 if (__len1 > __len2)
2861 __len11 = __len1 / 2;
2862 std::advance(__first_cut, __len11);
2863 __second_cut = std::lower_bound(__middle, __last,
2865 __len22 = std::distance(__middle, __second_cut);
2869 __len22 = __len2 / 2;
2870 std::advance(__second_cut, __len22);
2871 __first_cut = std::upper_bound(__first, __middle,
2873 __len11 = std::distance(__first, __first_cut);
2875 _BidirectionalIterator __new_middle =
2876 std::__rotate_adaptive(__first_cut, __middle, __second_cut,
2877 __len1 - __len11, __len22, __buffer,
2879 std::__merge_adaptive(__first, __first_cut, __new_middle, __len11,
2880 __len22, __buffer, __buffer_size);
2881 std::__merge_adaptive(__new_middle, __second_cut, __last,
2883 __len2 - __len22, __buffer, __buffer_size);
2887 /// This is a helper function for the merge routines.
2888 template<typename _BidirectionalIterator, typename _Distance,
2889 typename _Pointer, typename _Compare>
2891 __merge_adaptive(_BidirectionalIterator __first,
2892 _BidirectionalIterator __middle,
2893 _BidirectionalIterator __last,
2894 _Distance __len1, _Distance __len2,
2895 _Pointer __buffer, _Distance __buffer_size,
2898 if (__len1 <= __len2 && __len1 <= __buffer_size)
2900 _Pointer __buffer_end = _GLIBCXX_MOVE3(__first, __middle, __buffer);
2901 _GLIBCXX_STD_P::merge(_GLIBCXX_MAKE_MOVE_ITERATOR(__buffer),
2902 _GLIBCXX_MAKE_MOVE_ITERATOR(__buffer_end),
2903 _GLIBCXX_MAKE_MOVE_ITERATOR(__middle),
2904 _GLIBCXX_MAKE_MOVE_ITERATOR(__last),
2907 else if (__len2 <= __buffer_size)
2909 _Pointer __buffer_end = _GLIBCXX_MOVE3(__middle, __last, __buffer);
2910 std::__merge_backward(_GLIBCXX_MAKE_MOVE_ITERATOR(__first),
2911 _GLIBCXX_MAKE_MOVE_ITERATOR(__middle),
2912 _GLIBCXX_MAKE_MOVE_ITERATOR(__buffer),
2913 _GLIBCXX_MAKE_MOVE_ITERATOR(__buffer_end),
2918 _BidirectionalIterator __first_cut = __first;
2919 _BidirectionalIterator __second_cut = __middle;
2920 _Distance __len11 = 0;
2921 _Distance __len22 = 0;
2922 if (__len1 > __len2)
2924 __len11 = __len1 / 2;
2925 std::advance(__first_cut, __len11);
2926 __second_cut = std::lower_bound(__middle, __last, *__first_cut,
2928 __len22 = std::distance(__middle, __second_cut);
2932 __len22 = __len2 / 2;
2933 std::advance(__second_cut, __len22);
2934 __first_cut = std::upper_bound(__first, __middle, *__second_cut,
2936 __len11 = std::distance(__first, __first_cut);
2938 _BidirectionalIterator __new_middle =
2939 std::__rotate_adaptive(__first_cut, __middle, __second_cut,
2940 __len1 - __len11, __len22, __buffer,
2942 std::__merge_adaptive(__first, __first_cut, __new_middle, __len11,
2943 __len22, __buffer, __buffer_size, __comp);
2944 std::__merge_adaptive(__new_middle, __second_cut, __last,
2946 __len2 - __len22, __buffer,
2947 __buffer_size, __comp);
2951 /// This is a helper function for the merge routines.
2952 template<typename _BidirectionalIterator, typename _Distance>
2954 __merge_without_buffer(_BidirectionalIterator __first,
2955 _BidirectionalIterator __middle,
2956 _BidirectionalIterator __last,
2957 _Distance __len1, _Distance __len2)
2959 if (__len1 == 0 || __len2 == 0)
2961 if (__len1 + __len2 == 2)
2963 if (*__middle < *__first)
2964 std::iter_swap(__first, __middle);
2967 _BidirectionalIterator __first_cut = __first;
2968 _BidirectionalIterator __second_cut = __middle;
2969 _Distance __len11 = 0;
2970 _Distance __len22 = 0;
2971 if (__len1 > __len2)
2973 __len11 = __len1 / 2;
2974 std::advance(__first_cut, __len11);
2975 __second_cut = std::lower_bound(__middle, __last, *__first_cut);
2976 __len22 = std::distance(__middle, __second_cut);
2980 __len22 = __len2 / 2;
2981 std::advance(__second_cut, __len22);
2982 __first_cut = std::upper_bound(__first, __middle, *__second_cut);
2983 __len11 = std::distance(__first, __first_cut);
2985 std::rotate(__first_cut, __middle, __second_cut);
2986 _BidirectionalIterator __new_middle = __first_cut;
2987 std::advance(__new_middle, std::distance(__middle, __second_cut));
2988 std::__merge_without_buffer(__first, __first_cut, __new_middle,
2990 std::__merge_without_buffer(__new_middle, __second_cut, __last,
2991 __len1 - __len11, __len2 - __len22);
2994 /// This is a helper function for the merge routines.
2995 template<typename _BidirectionalIterator, typename _Distance,
2998 __merge_without_buffer(_BidirectionalIterator __first,
2999 _BidirectionalIterator __middle,
3000 _BidirectionalIterator __last,
3001 _Distance __len1, _Distance __len2,
3004 if (__len1 == 0 || __len2 == 0)
3006 if (__len1 + __len2 == 2)
3008 if (__comp(*__middle, *__first))
3009 std::iter_swap(__first, __middle);
3012 _BidirectionalIterator __first_cut = __first;
3013 _BidirectionalIterator __second_cut = __middle;
3014 _Distance __len11 = 0;
3015 _Distance __len22 = 0;
3016 if (__len1 > __len2)
3018 __len11 = __len1 / 2;
3019 std::advance(__first_cut, __len11);
3020 __second_cut = std::lower_bound(__middle, __last, *__first_cut,
3022 __len22 = std::distance(__middle, __second_cut);
3026 __len22 = __len2 / 2;
3027 std::advance(__second_cut, __len22);
3028 __first_cut = std::upper_bound(__first, __middle, *__second_cut,
3030 __len11 = std::distance(__first, __first_cut);
3032 std::rotate(__first_cut, __middle, __second_cut);
3033 _BidirectionalIterator __new_middle = __first_cut;
3034 std::advance(__new_middle, std::distance(__middle, __second_cut));
3035 std::__merge_without_buffer(__first, __first_cut, __new_middle,
3036 __len11, __len22, __comp);
3037 std::__merge_without_buffer(__new_middle, __second_cut, __last,
3038 __len1 - __len11, __len2 - __len22, __comp);
3042 * @brief Merges two sorted ranges in place.
3043 * @ingroup sorting_algorithms
3044 * @param first An iterator.
3045 * @param middle Another iterator.
3046 * @param last Another iterator.
3049 * Merges two sorted and consecutive ranges, [first,middle) and
3050 * [middle,last), and puts the result in [first,last). The output will
3051 * be sorted. The sort is @e stable, that is, for equivalent
3052 * elements in the two ranges, elements from the first range will always
3053 * come before elements from the second.
3055 * If enough additional memory is available, this takes (last-first)-1
3056 * comparisons. Otherwise an NlogN algorithm is used, where N is
3057 * distance(first,last).
3059 template<typename _BidirectionalIterator>
3061 inplace_merge(_BidirectionalIterator __first,
3062 _BidirectionalIterator __middle,
3063 _BidirectionalIterator __last)
3065 typedef typename iterator_traits<_BidirectionalIterator>::value_type
3067 typedef typename iterator_traits<_BidirectionalIterator>::difference_type
3070 // concept requirements
3071 __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
3072 _BidirectionalIterator>)
3073 __glibcxx_function_requires(_LessThanComparableConcept<_ValueType>)
3074 __glibcxx_requires_sorted(__first, __middle);
3075 __glibcxx_requires_sorted(__middle, __last);
3077 if (__first == __middle || __middle == __last)
3080 _DistanceType __len1 = std::distance(__first, __middle);
3081 _DistanceType __len2 = std::distance(__middle, __last);
3083 _Temporary_buffer<_BidirectionalIterator, _ValueType> __buf(__first,
3085 if (__buf.begin() == 0)
3086 std::__merge_without_buffer(__first, __middle, __last, __len1, __len2);
3088 std::__merge_adaptive(__first, __middle, __last, __len1, __len2,
3089 __buf.begin(), _DistanceType(__buf.size()));
3093 * @brief Merges two sorted ranges in place.
3094 * @ingroup sorting_algorithms
3095 * @param first An iterator.
3096 * @param middle Another iterator.
3097 * @param last Another iterator.
3098 * @param comp A functor to use for comparisons.
3101 * Merges two sorted and consecutive ranges, [first,middle) and
3102 * [middle,last), and puts the result in [first,last). The output will
3103 * be sorted. The sort is @e stable, that is, for equivalent
3104 * elements in the two ranges, elements from the first range will always
3105 * come before elements from the second.
3107 * If enough additional memory is available, this takes (last-first)-1
3108 * comparisons. Otherwise an NlogN algorithm is used, where N is
3109 * distance(first,last).
3111 * The comparison function should have the same effects on ordering as
3112 * the function used for the initial sort.
3114 template<typename _BidirectionalIterator, typename _Compare>
3116 inplace_merge(_BidirectionalIterator __first,
3117 _BidirectionalIterator __middle,
3118 _BidirectionalIterator __last,
3121 typedef typename iterator_traits<_BidirectionalIterator>::value_type
3123 typedef typename iterator_traits<_BidirectionalIterator>::difference_type
3126 // concept requirements
3127 __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
3128 _BidirectionalIterator>)