Mark as release
[official-gcc.git] / libstdc++-v3 / include / bits / stl_algo.h
blobcf3cd71851a004628f672d611954f86085c84215
1 // Algorithm implementation -*- C++ -*-
3 // Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006
4 // Free Software Foundation, Inc.
5 //
6 // This file is part of the GNU ISO C++ Library. This library is free
7 // software; you can redistribute it and/or modify it under the
8 // terms of the GNU General Public License as published by the
9 // Free Software Foundation; either version 2, or (at your option)
10 // any later version.
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 // You should have received a copy of the GNU General Public License along
18 // with this library; see the file COPYING. If not, write to the Free
19 // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
20 // USA.
22 // As a special exception, you may use this file as part of a free software
23 // library without restriction. Specifically, if other files instantiate
24 // templates or use macros or inline functions from this file, or you compile
25 // this file and link it with other files to produce an executable, this
26 // file does not by itself cause the resulting executable to be covered by
27 // the GNU General Public License. This exception does not however
28 // invalidate any other reasons why the executable file might be covered by
29 // the GNU General Public License.
33 * Copyright (c) 1994
34 * Hewlett-Packard Company
36 * Permission to use, copy, modify, distribute and sell this software
37 * and its documentation for any purpose is hereby granted without fee,
38 * provided that the above copyright notice appear in all copies and
39 * that both that copyright notice and this permission notice appear
40 * in supporting documentation. Hewlett-Packard Company makes no
41 * representations about the suitability of this software for any
42 * purpose. It is provided "as is" without express or implied warranty.
45 * Copyright (c) 1996
46 * Silicon Graphics Computer Systems, Inc.
48 * Permission to use, copy, modify, distribute and sell this software
49 * and its documentation for any purpose is hereby granted without fee,
50 * provided that the above copyright notice appear in all copies and
51 * that both that copyright notice and this permission notice appear
52 * in supporting documentation. Silicon Graphics makes no
53 * representations about the suitability of this software for any
54 * purpose. It is provided "as is" without express or implied warranty.
57 /** @file stl_algo.h
58 * This is an internal header file, included by other library headers.
59 * You should not attempt to use it directly.
62 #ifndef _ALGO_H
63 #define _ALGO_H 1
65 #include <bits/stl_heap.h>
66 #include <bits/stl_tempbuf.h> // for _Temporary_buffer
67 #include <debug/debug.h>
69 // See concept_check.h for the __glibcxx_*_requires macros.
71 _GLIBCXX_BEGIN_NAMESPACE(std)
73 /**
74 * @brief Find the median of three values.
75 * @param a A value.
76 * @param b A value.
77 * @param c A value.
78 * @return One of @p a, @p b or @p c.
80 * If @c {l,m,n} is some convolution of @p {a,b,c} such that @c l<=m<=n
81 * then the value returned will be @c m.
82 * This is an SGI extension.
83 * @ingroup SGIextensions
85 template<typename _Tp>
86 inline const _Tp&
87 __median(const _Tp& __a, const _Tp& __b, const _Tp& __c)
89 // concept requirements
90 __glibcxx_function_requires(_LessThanComparableConcept<_Tp>)
91 if (__a < __b)
92 if (__b < __c)
93 return __b;
94 else if (__a < __c)
95 return __c;
96 else
97 return __a;
98 else if (__a < __c)
99 return __a;
100 else if (__b < __c)
101 return __c;
102 else
103 return __b;
107 * @brief Find the median of three values using a predicate for comparison.
108 * @param a A value.
109 * @param b A value.
110 * @param c A value.
111 * @param comp A binary predicate.
112 * @return One of @p a, @p b or @p c.
114 * If @c {l,m,n} is some convolution of @p {a,b,c} such that @p comp(l,m)
115 * and @p comp(m,n) are both true then the value returned will be @c m.
116 * This is an SGI extension.
117 * @ingroup SGIextensions
119 template<typename _Tp, typename _Compare>
120 inline const _Tp&
121 __median(const _Tp& __a, const _Tp& __b, const _Tp& __c, _Compare __comp)
123 // concept requirements
124 __glibcxx_function_requires(_BinaryFunctionConcept<_Compare,bool,_Tp,_Tp>)
125 if (__comp(__a, __b))
126 if (__comp(__b, __c))
127 return __b;
128 else if (__comp(__a, __c))
129 return __c;
130 else
131 return __a;
132 else if (__comp(__a, __c))
133 return __a;
134 else if (__comp(__b, __c))
135 return __c;
136 else
137 return __b;
141 * @brief Apply a function to every element of a sequence.
142 * @param first An input iterator.
143 * @param last An input iterator.
144 * @param f A unary function object.
145 * @return @p f.
147 * Applies the function object @p f to each element in the range
148 * @p [first,last). @p f must not modify the order of the sequence.
149 * If @p f has a return value it is ignored.
151 template<typename _InputIterator, typename _Function>
152 _Function
153 for_each(_InputIterator __first, _InputIterator __last, _Function __f)
155 // concept requirements
156 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
157 __glibcxx_requires_valid_range(__first, __last);
158 for ( ; __first != __last; ++__first)
159 __f(*__first);
160 return __f;
164 * @if maint
165 * This is an overload used by find() for the Input Iterator case.
166 * @endif
168 template<typename _InputIterator, typename _Tp>
169 inline _InputIterator
170 __find(_InputIterator __first, _InputIterator __last,
171 const _Tp& __val, input_iterator_tag)
173 while (__first != __last && !(*__first == __val))
174 ++__first;
175 return __first;
179 * @if maint
180 * This is an overload used by find_if() for the Input Iterator case.
181 * @endif
183 template<typename _InputIterator, typename _Predicate>
184 inline _InputIterator
185 __find_if(_InputIterator __first, _InputIterator __last,
186 _Predicate __pred, input_iterator_tag)
188 while (__first != __last && !__pred(*__first))
189 ++__first;
190 return __first;
194 * @if maint
195 * This is an overload used by find() for the RAI case.
196 * @endif
198 template<typename _RandomAccessIterator, typename _Tp>
199 _RandomAccessIterator
200 __find(_RandomAccessIterator __first, _RandomAccessIterator __last,
201 const _Tp& __val, random_access_iterator_tag)
203 typename iterator_traits<_RandomAccessIterator>::difference_type
204 __trip_count = (__last - __first) >> 2;
206 for ( ; __trip_count > 0 ; --__trip_count)
208 if (*__first == __val)
209 return __first;
210 ++__first;
212 if (*__first == __val)
213 return __first;
214 ++__first;
216 if (*__first == __val)
217 return __first;
218 ++__first;
220 if (*__first == __val)
221 return __first;
222 ++__first;
225 switch (__last - __first)
227 case 3:
228 if (*__first == __val)
229 return __first;
230 ++__first;
231 case 2:
232 if (*__first == __val)
233 return __first;
234 ++__first;
235 case 1:
236 if (*__first == __val)
237 return __first;
238 ++__first;
239 case 0:
240 default:
241 return __last;
246 * @if maint
247 * This is an overload used by find_if() for the RAI case.
248 * @endif
250 template<typename _RandomAccessIterator, typename _Predicate>
251 _RandomAccessIterator
252 __find_if(_RandomAccessIterator __first, _RandomAccessIterator __last,
253 _Predicate __pred, random_access_iterator_tag)
255 typename iterator_traits<_RandomAccessIterator>::difference_type
256 __trip_count = (__last - __first) >> 2;
258 for ( ; __trip_count > 0 ; --__trip_count)
260 if (__pred(*__first))
261 return __first;
262 ++__first;
264 if (__pred(*__first))
265 return __first;
266 ++__first;
268 if (__pred(*__first))
269 return __first;
270 ++__first;
272 if (__pred(*__first))
273 return __first;
274 ++__first;
277 switch (__last - __first)
279 case 3:
280 if (__pred(*__first))
281 return __first;
282 ++__first;
283 case 2:
284 if (__pred(*__first))
285 return __first;
286 ++__first;
287 case 1:
288 if (__pred(*__first))
289 return __first;
290 ++__first;
291 case 0:
292 default:
293 return __last;
298 * @if maint
299 * This is an overload of find() for streambuf iterators.
300 * @endif
302 template<typename _CharT>
303 typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value,
304 istreambuf_iterator<_CharT> >::__type
305 find(istreambuf_iterator<_CharT>, istreambuf_iterator<_CharT>,
306 const _CharT&);
309 * @brief Find the first occurrence of a value in a sequence.
310 * @param first An input iterator.
311 * @param last An input iterator.
312 * @param val The value to find.
313 * @return The first iterator @c i in the range @p [first,last)
314 * such that @c *i == @p val, or @p last if no such iterator exists.
316 template<typename _InputIterator, typename _Tp>
317 inline _InputIterator
318 find(_InputIterator __first, _InputIterator __last,
319 const _Tp& __val)
321 // concept requirements
322 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
323 __glibcxx_function_requires(_EqualOpConcept<
324 typename iterator_traits<_InputIterator>::value_type, _Tp>)
325 __glibcxx_requires_valid_range(__first, __last);
326 return std::__find(__first, __last, __val,
327 std::__iterator_category(__first));
331 * @brief Find the first element in a sequence for which a predicate is true.
332 * @param first An input iterator.
333 * @param last An input iterator.
334 * @param pred A predicate.
335 * @return The first iterator @c i in the range @p [first,last)
336 * such that @p pred(*i) is true, or @p last if no such iterator exists.
338 template<typename _InputIterator, typename _Predicate>
339 inline _InputIterator
340 find_if(_InputIterator __first, _InputIterator __last,
341 _Predicate __pred)
343 // concept requirements
344 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
345 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
346 typename iterator_traits<_InputIterator>::value_type>)
347 __glibcxx_requires_valid_range(__first, __last);
348 return std::__find_if(__first, __last, __pred,
349 std::__iterator_category(__first));
353 * @brief Find two adjacent values in a sequence that are equal.
354 * @param first A forward iterator.
355 * @param last A forward iterator.
356 * @return The first iterator @c i such that @c i and @c i+1 are both
357 * valid iterators in @p [first,last) and such that @c *i == @c *(i+1),
358 * or @p last if no such iterator exists.
360 template<typename _ForwardIterator>
361 _ForwardIterator
362 adjacent_find(_ForwardIterator __first, _ForwardIterator __last)
364 // concept requirements
365 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
366 __glibcxx_function_requires(_EqualityComparableConcept<
367 typename iterator_traits<_ForwardIterator>::value_type>)
368 __glibcxx_requires_valid_range(__first, __last);
369 if (__first == __last)
370 return __last;
371 _ForwardIterator __next = __first;
372 while(++__next != __last)
374 if (*__first == *__next)
375 return __first;
376 __first = __next;
378 return __last;
382 * @brief Find two adjacent values in a sequence using a predicate.
383 * @param first A forward iterator.
384 * @param last A forward iterator.
385 * @param binary_pred A binary predicate.
386 * @return The first iterator @c i such that @c i and @c i+1 are both
387 * valid iterators in @p [first,last) and such that
388 * @p binary_pred(*i,*(i+1)) is true, or @p last if no such iterator
389 * exists.
391 template<typename _ForwardIterator, typename _BinaryPredicate>
392 _ForwardIterator
393 adjacent_find(_ForwardIterator __first, _ForwardIterator __last,
394 _BinaryPredicate __binary_pred)
396 // concept requirements
397 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
398 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
399 typename iterator_traits<_ForwardIterator>::value_type,
400 typename iterator_traits<_ForwardIterator>::value_type>)
401 __glibcxx_requires_valid_range(__first, __last);
402 if (__first == __last)
403 return __last;
404 _ForwardIterator __next = __first;
405 while(++__next != __last)
407 if (__binary_pred(*__first, *__next))
408 return __first;
409 __first = __next;
411 return __last;
415 * @brief Count the number of copies of a value in a sequence.
416 * @param first An input iterator.
417 * @param last An input iterator.
418 * @param value The value to be counted.
419 * @return The number of iterators @c i in the range @p [first,last)
420 * for which @c *i == @p value
422 template<typename _InputIterator, typename _Tp>
423 typename iterator_traits<_InputIterator>::difference_type
424 count(_InputIterator __first, _InputIterator __last, const _Tp& __value)
426 // concept requirements
427 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
428 __glibcxx_function_requires(_EqualOpConcept<
429 typename iterator_traits<_InputIterator>::value_type, _Tp>)
430 __glibcxx_requires_valid_range(__first, __last);
431 typename iterator_traits<_InputIterator>::difference_type __n = 0;
432 for ( ; __first != __last; ++__first)
433 if (*__first == __value)
434 ++__n;
435 return __n;
439 * @brief Count the elements of a sequence for which a predicate is true.
440 * @param first An input iterator.
441 * @param last An input iterator.
442 * @param pred A predicate.
443 * @return The number of iterators @c i in the range @p [first,last)
444 * for which @p pred(*i) is true.
446 template<typename _InputIterator, typename _Predicate>
447 typename iterator_traits<_InputIterator>::difference_type
448 count_if(_InputIterator __first, _InputIterator __last, _Predicate __pred)
450 // concept requirements
451 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
452 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
453 typename iterator_traits<_InputIterator>::value_type>)
454 __glibcxx_requires_valid_range(__first, __last);
455 typename iterator_traits<_InputIterator>::difference_type __n = 0;
456 for ( ; __first != __last; ++__first)
457 if (__pred(*__first))
458 ++__n;
459 return __n;
463 * @brief Search a sequence for a matching sub-sequence.
464 * @param first1 A forward iterator.
465 * @param last1 A forward iterator.
466 * @param first2 A forward iterator.
467 * @param last2 A forward iterator.
468 * @return The first iterator @c i in the range
469 * @p [first1,last1-(last2-first2)) such that @c *(i+N) == @p *(first2+N)
470 * for each @c N in the range @p [0,last2-first2), or @p last1 if no
471 * such iterator exists.
473 * Searches the range @p [first1,last1) for a sub-sequence that compares
474 * equal value-by-value with the sequence given by @p [first2,last2) and
475 * returns an iterator to the first element of the sub-sequence, or
476 * @p last1 if the sub-sequence is not found.
478 * Because the sub-sequence must lie completely within the range
479 * @p [first1,last1) it must start at a position less than
480 * @p last1-(last2-first2) where @p last2-first2 is the length of the
481 * sub-sequence.
482 * This means that the returned iterator @c i will be in the range
483 * @p [first1,last1-(last2-first2))
485 template<typename _ForwardIterator1, typename _ForwardIterator2>
486 _ForwardIterator1
487 search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
488 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
490 // concept requirements
491 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
492 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
493 __glibcxx_function_requires(_EqualOpConcept<
494 typename iterator_traits<_ForwardIterator1>::value_type,
495 typename iterator_traits<_ForwardIterator2>::value_type>)
496 __glibcxx_requires_valid_range(__first1, __last1);
497 __glibcxx_requires_valid_range(__first2, __last2);
498 // Test for empty ranges
499 if (__first1 == __last1 || __first2 == __last2)
500 return __first1;
502 // Test for a pattern of length 1.
503 _ForwardIterator2 __tmp(__first2);
504 ++__tmp;
505 if (__tmp == __last2)
506 return std::find(__first1, __last1, *__first2);
508 // General case.
509 _ForwardIterator2 __p1, __p;
510 __p1 = __first2; ++__p1;
511 _ForwardIterator1 __current = __first1;
513 while (__first1 != __last1)
515 __first1 = std::find(__first1, __last1, *__first2);
516 if (__first1 == __last1)
517 return __last1;
519 __p = __p1;
520 __current = __first1;
521 if (++__current == __last1)
522 return __last1;
524 while (*__current == *__p)
526 if (++__p == __last2)
527 return __first1;
528 if (++__current == __last1)
529 return __last1;
531 ++__first1;
533 return __first1;
537 * @brief Search a sequence for a matching sub-sequence using a predicate.
538 * @param first1 A forward iterator.
539 * @param last1 A forward iterator.
540 * @param first2 A forward iterator.
541 * @param last2 A forward iterator.
542 * @param predicate A binary predicate.
543 * @return The first iterator @c i in the range
544 * @p [first1,last1-(last2-first2)) such that
545 * @p predicate(*(i+N),*(first2+N)) is true for each @c N in the range
546 * @p [0,last2-first2), or @p last1 if no such iterator exists.
548 * Searches the range @p [first1,last1) for a sub-sequence that compares
549 * equal value-by-value with the sequence given by @p [first2,last2),
550 * using @p predicate to determine equality, and returns an iterator
551 * to the first element of the sub-sequence, or @p last1 if no such
552 * iterator exists.
554 * @see search(_ForwardIter1, _ForwardIter1, _ForwardIter2, _ForwardIter2)
556 template<typename _ForwardIterator1, typename _ForwardIterator2,
557 typename _BinaryPredicate>
558 _ForwardIterator1
559 search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
560 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
561 _BinaryPredicate __predicate)
563 // concept requirements
564 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
565 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
566 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
567 typename iterator_traits<_ForwardIterator1>::value_type,
568 typename iterator_traits<_ForwardIterator2>::value_type>)
569 __glibcxx_requires_valid_range(__first1, __last1);
570 __glibcxx_requires_valid_range(__first2, __last2);
572 // Test for empty ranges
573 if (__first1 == __last1 || __first2 == __last2)
574 return __first1;
576 // Test for a pattern of length 1.
577 _ForwardIterator2 __tmp(__first2);
578 ++__tmp;
579 if (__tmp == __last2)
581 while (__first1 != __last1 && !__predicate(*__first1, *__first2))
582 ++__first1;
583 return __first1;
586 // General case.
587 _ForwardIterator2 __p1, __p;
588 __p1 = __first2; ++__p1;
589 _ForwardIterator1 __current = __first1;
591 while (__first1 != __last1)
593 while (__first1 != __last1)
595 if (__predicate(*__first1, *__first2))
596 break;
597 ++__first1;
599 while (__first1 != __last1 && !__predicate(*__first1, *__first2))
600 ++__first1;
601 if (__first1 == __last1)
602 return __last1;
604 __p = __p1;
605 __current = __first1;
606 if (++__current == __last1)
607 return __last1;
609 while (__predicate(*__current, *__p))
611 if (++__p == __last2)
612 return __first1;
613 if (++__current == __last1)
614 return __last1;
616 ++__first1;
618 return __first1;
622 * @if maint
623 * This is an uglified
624 * search_n(_ForwardIterator, _ForwardIterator, _Integer, const _Tp&)
625 * overloaded for forward iterators.
626 * @endif
628 template<typename _ForwardIterator, typename _Integer, typename _Tp>
629 _ForwardIterator
630 __search_n(_ForwardIterator __first, _ForwardIterator __last,
631 _Integer __count, const _Tp& __val,
632 std::forward_iterator_tag)
634 __first = std::find(__first, __last, __val);
635 while (__first != __last)
637 typename iterator_traits<_ForwardIterator>::difference_type
638 __n = __count;
639 _ForwardIterator __i = __first;
640 ++__i;
641 while (__i != __last && __n != 1 && *__i == __val)
643 ++__i;
644 --__n;
646 if (__n == 1)
647 return __first;
648 if (__i == __last)
649 return __last;
650 __first = std::find(++__i, __last, __val);
652 return __last;
656 * @if maint
657 * This is an uglified
658 * search_n(_ForwardIterator, _ForwardIterator, _Integer, const _Tp&)
659 * overloaded for random access iterators.
660 * @endif
662 template<typename _RandomAccessIter, typename _Integer, typename _Tp>
663 _RandomAccessIter
664 __search_n(_RandomAccessIter __first, _RandomAccessIter __last,
665 _Integer __count, const _Tp& __val,
666 std::random_access_iterator_tag)
669 typedef typename std::iterator_traits<_RandomAccessIter>::difference_type
670 _DistanceType;
672 _DistanceType __tailSize = __last - __first;
673 const _DistanceType __pattSize = __count;
675 if (__tailSize < __pattSize)
676 return __last;
678 const _DistanceType __skipOffset = __pattSize - 1;
679 _RandomAccessIter __lookAhead = __first + __skipOffset;
680 __tailSize -= __pattSize;
682 while (1) // the main loop...
684 // __lookAhead here is always pointing to the last element of next
685 // possible match.
686 while (!(*__lookAhead == __val)) // the skip loop...
688 if (__tailSize < __pattSize)
689 return __last; // Failure
690 __lookAhead += __pattSize;
691 __tailSize -= __pattSize;
693 _DistanceType __remainder = __skipOffset;
694 for (_RandomAccessIter __backTrack = __lookAhead - 1;
695 *__backTrack == __val; --__backTrack)
697 if (--__remainder == 0)
698 return (__lookAhead - __skipOffset); // Success
700 if (__remainder > __tailSize)
701 return __last; // Failure
702 __lookAhead += __remainder;
703 __tailSize -= __remainder;
708 * @brief Search a sequence for a number of consecutive values.
709 * @param first A forward iterator.
710 * @param last A forward iterator.
711 * @param count The number of consecutive values.
712 * @param val The value to find.
713 * @return The first iterator @c i in the range @p [first,last-count)
714 * such that @c *(i+N) == @p val for each @c N in the range @p [0,count),
715 * or @p last if no such iterator exists.
717 * Searches the range @p [first,last) for @p count consecutive elements
718 * equal to @p val.
720 template<typename _ForwardIterator, typename _Integer, typename _Tp>
721 _ForwardIterator
722 search_n(_ForwardIterator __first, _ForwardIterator __last,
723 _Integer __count, const _Tp& __val)
725 // concept requirements
726 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
727 __glibcxx_function_requires(_EqualOpConcept<
728 typename iterator_traits<_ForwardIterator>::value_type, _Tp>)
729 __glibcxx_requires_valid_range(__first, __last);
731 if (__count <= 0)
732 return __first;
733 if (__count == 1)
734 return std::find(__first, __last, __val);
735 return std::__search_n(__first, __last, __count, __val,
736 std::__iterator_category(__first));
740 * @if maint
741 * This is an uglified
742 * search_n(_ForwardIterator, _ForwardIterator, _Integer, const _Tp&,
743 * _BinaryPredicate)
744 * overloaded for forward iterators.
745 * @endif
747 template<typename _ForwardIterator, typename _Integer, typename _Tp,
748 typename _BinaryPredicate>
749 _ForwardIterator
750 __search_n(_ForwardIterator __first, _ForwardIterator __last,
751 _Integer __count, const _Tp& __val,
752 _BinaryPredicate __binary_pred, std::forward_iterator_tag)
754 while (__first != __last && !__binary_pred(*__first, __val))
755 ++__first;
757 while (__first != __last)
759 typename iterator_traits<_ForwardIterator>::difference_type
760 __n = __count;
761 _ForwardIterator __i = __first;
762 ++__i;
763 while (__i != __last && __n != 1 && __binary_pred(*__i, __val))
765 ++__i;
766 --__n;
768 if (__n == 1)
769 return __first;
770 if (__i == __last)
771 return __last;
772 __first = ++__i;
773 while (__first != __last && !__binary_pred(*__first, __val))
774 ++__first;
776 return __last;
780 * @if maint
781 * This is an uglified
782 * search_n(_ForwardIterator, _ForwardIterator, _Integer, const _Tp&,
783 * _BinaryPredicate)
784 * overloaded for random access iterators.
785 * @endif
787 template<typename _RandomAccessIter, typename _Integer, typename _Tp,
788 typename _BinaryPredicate>
789 _RandomAccessIter
790 __search_n(_RandomAccessIter __first, _RandomAccessIter __last,
791 _Integer __count, const _Tp& __val,
792 _BinaryPredicate __binary_pred, std::random_access_iterator_tag)
795 typedef typename std::iterator_traits<_RandomAccessIter>::difference_type
796 _DistanceType;
798 _DistanceType __tailSize = __last - __first;
799 const _DistanceType __pattSize = __count;
801 if (__tailSize < __pattSize)
802 return __last;
804 const _DistanceType __skipOffset = __pattSize - 1;
805 _RandomAccessIter __lookAhead = __first + __skipOffset;
806 __tailSize -= __pattSize;
808 while (1) // the main loop...
810 // __lookAhead here is always pointing to the last element of next
811 // possible match.
812 while (!__binary_pred(*__lookAhead, __val)) // the skip loop...
814 if (__tailSize < __pattSize)
815 return __last; // Failure
816 __lookAhead += __pattSize;
817 __tailSize -= __pattSize;
819 _DistanceType __remainder = __skipOffset;
820 for (_RandomAccessIter __backTrack = __lookAhead - 1;
821 __binary_pred(*__backTrack, __val); --__backTrack)
823 if (--__remainder == 0)
824 return (__lookAhead - __skipOffset); // Success
826 if (__remainder > __tailSize)
827 return __last; // Failure
828 __lookAhead += __remainder;
829 __tailSize -= __remainder;
834 * @brief Search a sequence for a number of consecutive values using a
835 * predicate.
836 * @param first A forward iterator.
837 * @param last A forward iterator.
838 * @param count The number of consecutive values.
839 * @param val The value to find.
840 * @param binary_pred A binary predicate.
841 * @return The first iterator @c i in the range @p [first,last-count)
842 * such that @p binary_pred(*(i+N),val) is true for each @c N in the
843 * range @p [0,count), or @p last if no such iterator exists.
845 * Searches the range @p [first,last) for @p count consecutive elements
846 * for which the predicate returns true.
848 template<typename _ForwardIterator, typename _Integer, typename _Tp,
849 typename _BinaryPredicate>
850 _ForwardIterator
851 search_n(_ForwardIterator __first, _ForwardIterator __last,
852 _Integer __count, const _Tp& __val,
853 _BinaryPredicate __binary_pred)
855 // concept requirements
856 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
857 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
858 typename iterator_traits<_ForwardIterator>::value_type, _Tp>)
859 __glibcxx_requires_valid_range(__first, __last);
861 if (__count <= 0)
862 return __first;
863 if (__count == 1)
865 while (__first != __last && !__binary_pred(*__first, __val))
866 ++__first;
867 return __first;
869 return std::__search_n(__first, __last, __count, __val, __binary_pred,
870 std::__iterator_category(__first));
874 * @brief Swap the elements of two sequences.
875 * @param first1 A forward iterator.
876 * @param last1 A forward iterator.
877 * @param first2 A forward iterator.
878 * @return An iterator equal to @p first2+(last1-first1).
880 * Swaps each element in the range @p [first1,last1) with the
881 * corresponding element in the range @p [first2,(last1-first1)).
882 * The ranges must not overlap.
884 template<typename _ForwardIterator1, typename _ForwardIterator2>
885 _ForwardIterator2
886 swap_ranges(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
887 _ForwardIterator2 __first2)
889 // concept requirements
890 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
891 _ForwardIterator1>)
892 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
893 _ForwardIterator2>)
894 __glibcxx_function_requires(_ConvertibleConcept<
895 typename iterator_traits<_ForwardIterator1>::value_type,
896 typename iterator_traits<_ForwardIterator2>::value_type>)
897 __glibcxx_function_requires(_ConvertibleConcept<
898 typename iterator_traits<_ForwardIterator2>::value_type,
899 typename iterator_traits<_ForwardIterator1>::value_type>)
900 __glibcxx_requires_valid_range(__first1, __last1);
902 for ( ; __first1 != __last1; ++__first1, ++__first2)
903 std::iter_swap(__first1, __first2);
904 return __first2;
908 * @brief Perform an operation on a sequence.
909 * @param first An input iterator.
910 * @param last An input iterator.
911 * @param result An output iterator.
912 * @param unary_op A unary operator.
913 * @return An output iterator equal to @p result+(last-first).
915 * Applies the operator to each element in the input range and assigns
916 * the results to successive elements of the output sequence.
917 * Evaluates @p *(result+N)=unary_op(*(first+N)) for each @c N in the
918 * range @p [0,last-first).
920 * @p unary_op must not alter its argument.
922 template<typename _InputIterator, typename _OutputIterator,
923 typename _UnaryOperation>
924 _OutputIterator
925 transform(_InputIterator __first, _InputIterator __last,
926 _OutputIterator __result, _UnaryOperation __unary_op)
928 // concept requirements
929 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
930 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
931 // "the type returned by a _UnaryOperation"
932 __typeof__(__unary_op(*__first))>)
933 __glibcxx_requires_valid_range(__first, __last);
935 for ( ; __first != __last; ++__first, ++__result)
936 *__result = __unary_op(*__first);
937 return __result;
941 * @brief Perform an operation on corresponding elements of two sequences.
942 * @param first1 An input iterator.
943 * @param last1 An input iterator.
944 * @param first2 An input iterator.
945 * @param result An output iterator.
946 * @param binary_op A binary operator.
947 * @return An output iterator equal to @p result+(last-first).
949 * Applies the operator to the corresponding elements in the two
950 * input ranges and assigns the results to successive elements of the
951 * output sequence.
952 * Evaluates @p *(result+N)=binary_op(*(first1+N),*(first2+N)) for each
953 * @c N in the range @p [0,last1-first1).
955 * @p binary_op must not alter either of its arguments.
957 template<typename _InputIterator1, typename _InputIterator2,
958 typename _OutputIterator, typename _BinaryOperation>
959 _OutputIterator
960 transform(_InputIterator1 __first1, _InputIterator1 __last1,
961 _InputIterator2 __first2, _OutputIterator __result,
962 _BinaryOperation __binary_op)
964 // concept requirements
965 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
966 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
967 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
968 // "the type returned by a _BinaryOperation"
969 __typeof__(__binary_op(*__first1,*__first2))>)
970 __glibcxx_requires_valid_range(__first1, __last1);
972 for ( ; __first1 != __last1; ++__first1, ++__first2, ++__result)
973 *__result = __binary_op(*__first1, *__first2);
974 return __result;
978 * @brief Replace each occurrence of one value in a sequence with another
979 * value.
980 * @param first A forward iterator.
981 * @param last A forward iterator.
982 * @param old_value The value to be replaced.
983 * @param new_value The replacement value.
984 * @return replace() returns no value.
986 * For each iterator @c i in the range @p [first,last) if @c *i ==
987 * @p old_value then the assignment @c *i = @p new_value is performed.
989 template<typename _ForwardIterator, typename _Tp>
990 void
991 replace(_ForwardIterator __first, _ForwardIterator __last,
992 const _Tp& __old_value, const _Tp& __new_value)
994 // concept requirements
995 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
996 _ForwardIterator>)
997 __glibcxx_function_requires(_EqualOpConcept<
998 typename iterator_traits<_ForwardIterator>::value_type, _Tp>)
999 __glibcxx_function_requires(_ConvertibleConcept<_Tp,
1000 typename iterator_traits<_ForwardIterator>::value_type>)
1001 __glibcxx_requires_valid_range(__first, __last);
1003 for ( ; __first != __last; ++__first)
1004 if (*__first == __old_value)
1005 *__first = __new_value;
1009 * @brief Replace each value in a sequence for which a predicate returns
1010 * true with another value.
1011 * @param first A forward iterator.
1012 * @param last A forward iterator.
1013 * @param pred A predicate.
1014 * @param new_value The replacement value.
1015 * @return replace_if() returns no value.
1017 * For each iterator @c i in the range @p [first,last) if @p pred(*i)
1018 * is true then the assignment @c *i = @p new_value is performed.
1020 template<typename _ForwardIterator, typename _Predicate, typename _Tp>
1021 void
1022 replace_if(_ForwardIterator __first, _ForwardIterator __last,
1023 _Predicate __pred, const _Tp& __new_value)
1025 // concept requirements
1026 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
1027 _ForwardIterator>)
1028 __glibcxx_function_requires(_ConvertibleConcept<_Tp,
1029 typename iterator_traits<_ForwardIterator>::value_type>)
1030 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
1031 typename iterator_traits<_ForwardIterator>::value_type>)
1032 __glibcxx_requires_valid_range(__first, __last);
1034 for ( ; __first != __last; ++__first)
1035 if (__pred(*__first))
1036 *__first = __new_value;
1040 * @brief Copy a sequence, replacing each element of one value with another
1041 * value.
1042 * @param first An input iterator.
1043 * @param last An input iterator.
1044 * @param result An output iterator.
1045 * @param old_value The value to be replaced.
1046 * @param new_value The replacement value.
1047 * @return The end of the output sequence, @p result+(last-first).
1049 * Copies each element in the input range @p [first,last) to the
1050 * output range @p [result,result+(last-first)) replacing elements
1051 * equal to @p old_value with @p new_value.
1053 template<typename _InputIterator, typename _OutputIterator, typename _Tp>
1054 _OutputIterator
1055 replace_copy(_InputIterator __first, _InputIterator __last,
1056 _OutputIterator __result,
1057 const _Tp& __old_value, const _Tp& __new_value)
1059 // concept requirements
1060 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
1061 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
1062 typename iterator_traits<_InputIterator>::value_type>)
1063 __glibcxx_function_requires(_EqualOpConcept<
1064 typename iterator_traits<_InputIterator>::value_type, _Tp>)
1065 __glibcxx_requires_valid_range(__first, __last);
1067 for ( ; __first != __last; ++__first, ++__result)
1068 if (*__first == __old_value)
1069 *__result = __new_value;
1070 else
1071 *__result = *__first;
1072 return __result;
1076 * @brief Copy a sequence, replacing each value for which a predicate
1077 * returns true with another value.
1078 * @param first An input iterator.
1079 * @param last An input iterator.
1080 * @param result An output iterator.
1081 * @param pred A predicate.
1082 * @param new_value The replacement value.
1083 * @return The end of the output sequence, @p result+(last-first).
1085 * Copies each element in the range @p [first,last) to the range
1086 * @p [result,result+(last-first)) replacing elements for which
1087 * @p pred returns true with @p new_value.
1089 template<typename _InputIterator, typename _OutputIterator,
1090 typename _Predicate, typename _Tp>
1091 _OutputIterator
1092 replace_copy_if(_InputIterator __first, _InputIterator __last,
1093 _OutputIterator __result,
1094 _Predicate __pred, const _Tp& __new_value)
1096 // concept requirements
1097 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
1098 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
1099 typename iterator_traits<_InputIterator>::value_type>)
1100 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
1101 typename iterator_traits<_InputIterator>::value_type>)
1102 __glibcxx_requires_valid_range(__first, __last);
1104 for ( ; __first != __last; ++__first, ++__result)
1105 if (__pred(*__first))
1106 *__result = __new_value;
1107 else
1108 *__result = *__first;
1109 return __result;
1113 * @brief Assign the result of a function object to each value in a
1114 * sequence.
1115 * @param first A forward iterator.
1116 * @param last A forward iterator.
1117 * @param gen A function object taking no arguments.
1118 * @return generate() returns no value.
1120 * Performs the assignment @c *i = @p gen() for each @c i in the range
1121 * @p [first,last).
1123 template<typename _ForwardIterator, typename _Generator>
1124 void
1125 generate(_ForwardIterator __first, _ForwardIterator __last,
1126 _Generator __gen)
1128 // concept requirements
1129 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
1130 __glibcxx_function_requires(_GeneratorConcept<_Generator,
1131 typename iterator_traits<_ForwardIterator>::value_type>)
1132 __glibcxx_requires_valid_range(__first, __last);
1134 for ( ; __first != __last; ++__first)
1135 *__first = __gen();
1139 * @brief Assign the result of a function object to each value in a
1140 * sequence.
1141 * @param first A forward iterator.
1142 * @param n The length of the sequence.
1143 * @param gen A function object taking no arguments.
1144 * @return The end of the sequence, @p first+n
1146 * Performs the assignment @c *i = @p gen() for each @c i in the range
1147 * @p [first,first+n).
1149 template<typename _OutputIterator, typename _Size, typename _Generator>
1150 _OutputIterator
1151 generate_n(_OutputIterator __first, _Size __n, _Generator __gen)
1153 // concept requirements
1154 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
1155 // "the type returned by a _Generator"
1156 __typeof__(__gen())>)
1158 for ( ; __n > 0; --__n, ++__first)
1159 *__first = __gen();
1160 return __first;
1164 * @brief Copy a sequence, removing elements of a given value.
1165 * @param first An input iterator.
1166 * @param last An input iterator.
1167 * @param result An output iterator.
1168 * @param value The value to be removed.
1169 * @return An iterator designating the end of the resulting sequence.
1171 * Copies each element in the range @p [first,last) not equal to @p value
1172 * to the range beginning at @p result.
1173 * remove_copy() is stable, so the relative order of elements that are
1174 * copied is unchanged.
1176 template<typename _InputIterator, typename _OutputIterator, typename _Tp>
1177 _OutputIterator
1178 remove_copy(_InputIterator __first, _InputIterator __last,
1179 _OutputIterator __result, const _Tp& __value)
1181 // concept requirements
1182 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
1183 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
1184 typename iterator_traits<_InputIterator>::value_type>)
1185 __glibcxx_function_requires(_EqualOpConcept<
1186 typename iterator_traits<_InputIterator>::value_type, _Tp>)
1187 __glibcxx_requires_valid_range(__first, __last);
1189 for ( ; __first != __last; ++__first)
1190 if (!(*__first == __value))
1192 *__result = *__first;
1193 ++__result;
1195 return __result;
1199 * @brief Copy a sequence, removing elements for which a predicate is true.
1200 * @param first An input iterator.
1201 * @param last An input iterator.
1202 * @param result An output iterator.
1203 * @param pred A predicate.
1204 * @return An iterator designating the end of the resulting sequence.
1206 * Copies each element in the range @p [first,last) for which
1207 * @p pred returns true to the range beginning at @p result.
1209 * remove_copy_if() is stable, so the relative order of elements that are
1210 * copied is unchanged.
1212 template<typename _InputIterator, typename _OutputIterator,
1213 typename _Predicate>
1214 _OutputIterator
1215 remove_copy_if(_InputIterator __first, _InputIterator __last,
1216 _OutputIterator __result, _Predicate __pred)
1218 // concept requirements
1219 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
1220 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
1221 typename iterator_traits<_InputIterator>::value_type>)
1222 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
1223 typename iterator_traits<_InputIterator>::value_type>)
1224 __glibcxx_requires_valid_range(__first, __last);
1226 for ( ; __first != __last; ++__first)
1227 if (!__pred(*__first))
1229 *__result = *__first;
1230 ++__result;
1232 return __result;
1236 * @brief Remove elements from a sequence.
1237 * @param first An input iterator.
1238 * @param last An input iterator.
1239 * @param value The value to be removed.
1240 * @return An iterator designating the end of the resulting sequence.
1242 * All elements equal to @p value are removed from the range
1243 * @p [first,last).
1245 * remove() is stable, so the relative order of elements that are
1246 * not removed is unchanged.
1248 * Elements between the end of the resulting sequence and @p last
1249 * are still present, but their value is unspecified.
1251 template<typename _ForwardIterator, typename _Tp>
1252 _ForwardIterator
1253 remove(_ForwardIterator __first, _ForwardIterator __last,
1254 const _Tp& __value)
1256 // concept requirements
1257 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
1258 _ForwardIterator>)
1259 __glibcxx_function_requires(_EqualOpConcept<
1260 typename iterator_traits<_ForwardIterator>::value_type, _Tp>)
1261 __glibcxx_requires_valid_range(__first, __last);
1263 __first = std::find(__first, __last, __value);
1264 _ForwardIterator __i = __first;
1265 return __first == __last ? __first
1266 : std::remove_copy(++__i, __last,
1267 __first, __value);
1271 * @brief Remove elements from a sequence using a predicate.
1272 * @param first A forward iterator.
1273 * @param last A forward iterator.
1274 * @param pred A predicate.
1275 * @return An iterator designating the end of the resulting sequence.
1277 * All elements for which @p pred returns true are removed from the range
1278 * @p [first,last).
1280 * remove_if() is stable, so the relative order of elements that are
1281 * not removed is unchanged.
1283 * Elements between the end of the resulting sequence and @p last
1284 * are still present, but their value is unspecified.
1286 template<typename _ForwardIterator, typename _Predicate>
1287 _ForwardIterator
1288 remove_if(_ForwardIterator __first, _ForwardIterator __last,
1289 _Predicate __pred)
1291 // concept requirements
1292 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
1293 _ForwardIterator>)
1294 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
1295 typename iterator_traits<_ForwardIterator>::value_type>)
1296 __glibcxx_requires_valid_range(__first, __last);
1298 __first = std::find_if(__first, __last, __pred);
1299 _ForwardIterator __i = __first;
1300 return __first == __last ? __first
1301 : std::remove_copy_if(++__i, __last,
1302 __first, __pred);
1306 * @if maint
1307 * This is an uglified unique_copy(_InputIterator, _InputIterator,
1308 * _OutputIterator)
1309 * overloaded for forward iterators and output iterator as result.
1310 * @endif
1312 template<typename _ForwardIterator, typename _OutputIterator>
1313 _OutputIterator
1314 __unique_copy(_ForwardIterator __first, _ForwardIterator __last,
1315 _OutputIterator __result,
1316 forward_iterator_tag, output_iterator_tag)
1318 // concept requirements -- taken care of in dispatching function
1319 _ForwardIterator __next = __first;
1320 *__result = *__first;
1321 while (++__next != __last)
1322 if (!(*__first == *__next))
1324 __first = __next;
1325 *++__result = *__first;
1327 return ++__result;
1331 * @if maint
1332 * This is an uglified unique_copy(_InputIterator, _InputIterator,
1333 * _OutputIterator)
1334 * overloaded for input iterators and output iterator as result.
1335 * @endif
1337 template<typename _InputIterator, typename _OutputIterator>
1338 _OutputIterator
1339 __unique_copy(_InputIterator __first, _InputIterator __last,
1340 _OutputIterator __result,
1341 input_iterator_tag, output_iterator_tag)
1343 // concept requirements -- taken care of in dispatching function
1344 typename iterator_traits<_InputIterator>::value_type __value = *__first;
1345 *__result = __value;
1346 while (++__first != __last)
1347 if (!(__value == *__first))
1349 __value = *__first;
1350 *++__result = __value;
1352 return ++__result;
1356 * @if maint
1357 * This is an uglified unique_copy(_InputIterator, _InputIterator,
1358 * _OutputIterator)
1359 * overloaded for input iterators and forward iterator as result.
1360 * @endif
1362 template<typename _InputIterator, typename _ForwardIterator>
1363 _ForwardIterator
1364 __unique_copy(_InputIterator __first, _InputIterator __last,
1365 _ForwardIterator __result,
1366 input_iterator_tag, forward_iterator_tag)
1368 // concept requirements -- taken care of in dispatching function
1369 *__result = *__first;
1370 while (++__first != __last)
1371 if (!(*__result == *__first))
1372 *++__result = *__first;
1373 return ++__result;
1377 * @if maint
1378 * This is an uglified
1379 * unique_copy(_InputIterator, _InputIterator, _OutputIterator,
1380 * _BinaryPredicate)
1381 * overloaded for forward iterators and output iterator as result.
1382 * @endif
1384 template<typename _ForwardIterator, typename _OutputIterator,
1385 typename _BinaryPredicate>
1386 _OutputIterator
1387 __unique_copy(_ForwardIterator __first, _ForwardIterator __last,
1388 _OutputIterator __result, _BinaryPredicate __binary_pred,
1389 forward_iterator_tag, output_iterator_tag)
1391 // concept requirements -- iterators already checked
1392 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
1393 typename iterator_traits<_ForwardIterator>::value_type,
1394 typename iterator_traits<_ForwardIterator>::value_type>)
1396 _ForwardIterator __next = __first;
1397 *__result = *__first;
1398 while (++__next != __last)
1399 if (!__binary_pred(*__first, *__next))
1401 __first = __next;
1402 *++__result = *__first;
1404 return ++__result;
1408 * @if maint
1409 * This is an uglified
1410 * unique_copy(_InputIterator, _InputIterator, _OutputIterator,
1411 * _BinaryPredicate)
1412 * overloaded for input iterators and output iterator as result.
1413 * @endif
1415 template<typename _InputIterator, typename _OutputIterator,
1416 typename _BinaryPredicate>
1417 _OutputIterator
1418 __unique_copy(_InputIterator __first, _InputIterator __last,
1419 _OutputIterator __result, _BinaryPredicate __binary_pred,
1420 input_iterator_tag, output_iterator_tag)
1422 // concept requirements -- iterators already checked
1423 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
1424 typename iterator_traits<_InputIterator>::value_type,
1425 typename iterator_traits<_InputIterator>::value_type>)
1427 typename iterator_traits<_InputIterator>::value_type __value = *__first;
1428 *__result = __value;
1429 while (++__first != __last)
1430 if (!__binary_pred(__value, *__first))
1432 __value = *__first;
1433 *++__result = __value;
1435 return ++__result;
1439 * @if maint
1440 * This is an uglified
1441 * unique_copy(_InputIterator, _InputIterator, _OutputIterator,
1442 * _BinaryPredicate)
1443 * overloaded for input iterators and forward iterator as result.
1444 * @endif
1446 template<typename _InputIterator, typename _ForwardIterator,
1447 typename _BinaryPredicate>
1448 _ForwardIterator
1449 __unique_copy(_InputIterator __first, _InputIterator __last,
1450 _ForwardIterator __result, _BinaryPredicate __binary_pred,
1451 input_iterator_tag, forward_iterator_tag)
1453 // concept requirements -- iterators already checked
1454 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
1455 typename iterator_traits<_ForwardIterator>::value_type,
1456 typename iterator_traits<_InputIterator>::value_type>)
1458 *__result = *__first;
1459 while (++__first != __last)
1460 if (!__binary_pred(*__result, *__first))
1461 *++__result = *__first;
1462 return ++__result;
1466 * @brief Copy a sequence, removing consecutive duplicate values.
1467 * @param first An input iterator.
1468 * @param last An input iterator.
1469 * @param result An output iterator.
1470 * @return An iterator designating the end of the resulting sequence.
1472 * Copies each element in the range @p [first,last) to the range
1473 * beginning at @p result, except that only the first element is copied
1474 * from groups of consecutive elements that compare equal.
1475 * unique_copy() is stable, so the relative order of elements that are
1476 * copied is unchanged.
1478 * @if maint
1479 * _GLIBCXX_RESOLVE_LIB_DEFECTS
1480 * DR 241. Does unique_copy() require CopyConstructible and Assignable?
1482 * _GLIBCXX_RESOLVE_LIB_DEFECTS
1483 * DR 538. 241 again: Does unique_copy() require CopyConstructible and
1484 * Assignable?
1485 * @endif
1487 template<typename _InputIterator, typename _OutputIterator>
1488 inline _OutputIterator
1489 unique_copy(_InputIterator __first, _InputIterator __last,
1490 _OutputIterator __result)
1492 // concept requirements
1493 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
1494 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
1495 typename iterator_traits<_InputIterator>::value_type>)
1496 __glibcxx_function_requires(_EqualityComparableConcept<
1497 typename iterator_traits<_InputIterator>::value_type>)
1498 __glibcxx_requires_valid_range(__first, __last);
1500 if (__first == __last)
1501 return __result;
1502 return std::__unique_copy(__first, __last, __result,
1503 std::__iterator_category(__first),
1504 std::__iterator_category(__result));
1508 * @brief Copy a sequence, removing consecutive values using a predicate.
1509 * @param first An input iterator.
1510 * @param last An input iterator.
1511 * @param result An output iterator.
1512 * @param binary_pred A binary predicate.
1513 * @return An iterator designating the end of the resulting sequence.
1515 * Copies each element in the range @p [first,last) to the range
1516 * beginning at @p result, except that only the first element is copied
1517 * from groups of consecutive elements for which @p binary_pred returns
1518 * true.
1519 * unique_copy() is stable, so the relative order of elements that are
1520 * copied is unchanged.
1522 * @if maint
1523 * _GLIBCXX_RESOLVE_LIB_DEFECTS
1524 * DR 241. Does unique_copy() require CopyConstructible and Assignable?
1525 * @endif
1527 template<typename _InputIterator, typename _OutputIterator,
1528 typename _BinaryPredicate>
1529 inline _OutputIterator
1530 unique_copy(_InputIterator __first, _InputIterator __last,
1531 _OutputIterator __result,
1532 _BinaryPredicate __binary_pred)
1534 // concept requirements -- predicates checked later
1535 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
1536 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
1537 typename iterator_traits<_InputIterator>::value_type>)
1538 __glibcxx_requires_valid_range(__first, __last);
1540 if (__first == __last)
1541 return __result;
1542 return std::__unique_copy(__first, __last, __result, __binary_pred,
1543 std::__iterator_category(__first),
1544 std::__iterator_category(__result));
1548 * @brief Remove consecutive duplicate values from a sequence.
1549 * @param first A forward iterator.
1550 * @param last A forward iterator.
1551 * @return An iterator designating the end of the resulting sequence.
1553 * Removes all but the first element from each group of consecutive
1554 * values that compare equal.
1555 * unique() is stable, so the relative order of elements that are
1556 * not removed is unchanged.
1557 * Elements between the end of the resulting sequence and @p last
1558 * are still present, but their value is unspecified.
1560 template<typename _ForwardIterator>
1561 _ForwardIterator
1562 unique(_ForwardIterator __first, _ForwardIterator __last)
1564 // concept requirements
1565 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
1566 _ForwardIterator>)
1567 __glibcxx_function_requires(_EqualityComparableConcept<
1568 typename iterator_traits<_ForwardIterator>::value_type>)
1569 __glibcxx_requires_valid_range(__first, __last);
1571 // Skip the beginning, if already unique.
1572 __first = std::adjacent_find(__first, __last);
1573 if (__first == __last)
1574 return __last;
1576 // Do the real copy work.
1577 _ForwardIterator __dest = __first;
1578 ++__first;
1579 while (++__first != __last)
1580 if (!(*__dest == *__first))
1581 *++__dest = *__first;
1582 return ++__dest;
1586 * @brief Remove consecutive values from a sequence using a predicate.
1587 * @param first A forward iterator.
1588 * @param last A forward iterator.
1589 * @param binary_pred A binary predicate.
1590 * @return An iterator designating the end of the resulting sequence.
1592 * Removes all but the first element from each group of consecutive
1593 * values for which @p binary_pred returns true.
1594 * unique() is stable, so the relative order of elements that are
1595 * not removed is unchanged.
1596 * Elements between the end of the resulting sequence and @p last
1597 * are still present, but their value is unspecified.
1599 template<typename _ForwardIterator, typename _BinaryPredicate>
1600 _ForwardIterator
1601 unique(_ForwardIterator __first, _ForwardIterator __last,
1602 _BinaryPredicate __binary_pred)
1604 // concept requirements
1605 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
1606 _ForwardIterator>)
1607 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
1608 typename iterator_traits<_ForwardIterator>::value_type,
1609 typename iterator_traits<_ForwardIterator>::value_type>)
1610 __glibcxx_requires_valid_range(__first, __last);
1612 // Skip the beginning, if already unique.
1613 __first = std::adjacent_find(__first, __last, __binary_pred);
1614 if (__first == __last)
1615 return __last;
1617 // Do the real copy work.
1618 _ForwardIterator __dest = __first;
1619 ++__first;
1620 while (++__first != __last)
1621 if (!__binary_pred(*__dest, *__first))
1622 *++__dest = *__first;
1623 return ++__dest;
1627 * @if maint
1628 * This is an uglified reverse(_BidirectionalIterator,
1629 * _BidirectionalIterator)
1630 * overloaded for bidirectional iterators.
1631 * @endif
1633 template<typename _BidirectionalIterator>
1634 void
1635 __reverse(_BidirectionalIterator __first, _BidirectionalIterator __last,
1636 bidirectional_iterator_tag)
1638 while (true)
1639 if (__first == __last || __first == --__last)
1640 return;
1641 else
1643 std::iter_swap(__first, __last);
1644 ++__first;
1649 * @if maint
1650 * This is an uglified reverse(_BidirectionalIterator,
1651 * _BidirectionalIterator)
1652 * overloaded for random access iterators.
1653 * @endif
1655 template<typename _RandomAccessIterator>
1656 void
1657 __reverse(_RandomAccessIterator __first, _RandomAccessIterator __last,
1658 random_access_iterator_tag)
1660 if (__first == __last)
1661 return;
1662 --__last;
1663 while (__first < __last)
1665 std::iter_swap(__first, __last);
1666 ++__first;
1667 --__last;
1672 * @brief Reverse a sequence.
1673 * @param first A bidirectional iterator.
1674 * @param last A bidirectional iterator.
1675 * @return reverse() returns no value.
1677 * Reverses the order of the elements in the range @p [first,last),
1678 * so that the first element becomes the last etc.
1679 * For every @c i such that @p 0<=i<=(last-first)/2), @p reverse()
1680 * swaps @p *(first+i) and @p *(last-(i+1))
1682 template<typename _BidirectionalIterator>
1683 inline void
1684 reverse(_BidirectionalIterator __first, _BidirectionalIterator __last)
1686 // concept requirements
1687 __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
1688 _BidirectionalIterator>)
1689 __glibcxx_requires_valid_range(__first, __last);
1690 std::__reverse(__first, __last, std::__iterator_category(__first));
1694 * @brief Copy a sequence, reversing its elements.
1695 * @param first A bidirectional iterator.
1696 * @param last A bidirectional iterator.
1697 * @param result An output iterator.
1698 * @return An iterator designating the end of the resulting sequence.
1700 * Copies the elements in the range @p [first,last) to the range
1701 * @p [result,result+(last-first)) such that the order of the
1702 * elements is reversed.
1703 * For every @c i such that @p 0<=i<=(last-first), @p reverse_copy()
1704 * performs the assignment @p *(result+(last-first)-i) = *(first+i).
1705 * The ranges @p [first,last) and @p [result,result+(last-first))
1706 * must not overlap.
1708 template<typename _BidirectionalIterator, typename _OutputIterator>
1709 _OutputIterator
1710 reverse_copy(_BidirectionalIterator __first, _BidirectionalIterator __last,
1711 _OutputIterator __result)
1713 // concept requirements
1714 __glibcxx_function_requires(_BidirectionalIteratorConcept<
1715 _BidirectionalIterator>)
1716 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
1717 typename iterator_traits<_BidirectionalIterator>::value_type>)
1718 __glibcxx_requires_valid_range(__first, __last);
1720 while (__first != __last)
1722 --__last;
1723 *__result = *__last;
1724 ++__result;
1726 return __result;
1731 * @if maint
1732 * This is a helper function for the rotate algorithm specialized on RAIs.
1733 * It returns the greatest common divisor of two integer values.
1734 * @endif
1736 template<typename _EuclideanRingElement>
1737 _EuclideanRingElement
1738 __gcd(_EuclideanRingElement __m, _EuclideanRingElement __n)
1740 while (__n != 0)
1742 _EuclideanRingElement __t = __m % __n;
1743 __m = __n;
1744 __n = __t;
1746 return __m;
1750 * @if maint
1751 * This is a helper function for the rotate algorithm.
1752 * @endif
1754 template<typename _ForwardIterator>
1755 void
1756 __rotate(_ForwardIterator __first,
1757 _ForwardIterator __middle,
1758 _ForwardIterator __last,
1759 forward_iterator_tag)
1761 if (__first == __middle || __last == __middle)
1762 return;
1764 _ForwardIterator __first2 = __middle;
1767 swap(*__first, *__first2);
1768 ++__first;
1769 ++__first2;
1770 if (__first == __middle)
1771 __middle = __first2;
1773 while (__first2 != __last);
1775 __first2 = __middle;
1777 while (__first2 != __last)
1779 swap(*__first, *__first2);
1780 ++__first;
1781 ++__first2;
1782 if (__first == __middle)
1783 __middle = __first2;
1784 else if (__first2 == __last)
1785 __first2 = __middle;
1790 * @if maint
1791 * This is a helper function for the rotate algorithm.
1792 * @endif
1794 template<typename _BidirectionalIterator>
1795 void
1796 __rotate(_BidirectionalIterator __first,
1797 _BidirectionalIterator __middle,
1798 _BidirectionalIterator __last,
1799 bidirectional_iterator_tag)
1801 // concept requirements
1802 __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
1803 _BidirectionalIterator>)
1805 if (__first == __middle || __last == __middle)
1806 return;
1808 std::__reverse(__first, __middle, bidirectional_iterator_tag());
1809 std::__reverse(__middle, __last, bidirectional_iterator_tag());
1811 while (__first != __middle && __middle != __last)
1813 swap(*__first, *--__last);
1814 ++__first;
1817 if (__first == __middle)
1818 std::__reverse(__middle, __last, bidirectional_iterator_tag());
1819 else
1820 std::__reverse(__first, __middle, bidirectional_iterator_tag());
1824 * @if maint
1825 * This is a helper function for the rotate algorithm.
1826 * @endif
1828 template<typename _RandomAccessIterator>
1829 void
1830 __rotate(_RandomAccessIterator __first,
1831 _RandomAccessIterator __middle,
1832 _RandomAccessIterator __last,
1833 random_access_iterator_tag)
1835 // concept requirements
1836 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
1837 _RandomAccessIterator>)
1839 if (__first == __middle || __last == __middle)
1840 return;
1842 typedef typename iterator_traits<_RandomAccessIterator>::difference_type
1843 _Distance;
1844 typedef typename iterator_traits<_RandomAccessIterator>::value_type
1845 _ValueType;
1847 const _Distance __n = __last - __first;
1848 const _Distance __k = __middle - __first;
1849 const _Distance __l = __n - __k;
1851 if (__k == __l)
1853 std::swap_ranges(__first, __middle, __middle);
1854 return;
1857 const _Distance __d = __gcd(__n, __k);
1859 for (_Distance __i = 0; __i < __d; __i++)
1861 _ValueType __tmp = *__first;
1862 _RandomAccessIterator __p = __first;
1864 if (__k < __l)
1866 for (_Distance __j = 0; __j < __l / __d; __j++)
1868 if (__p > __first + __l)
1870 *__p = *(__p - __l);
1871 __p -= __l;
1874 *__p = *(__p + __k);
1875 __p += __k;
1878 else
1880 for (_Distance __j = 0; __j < __k / __d - 1; __j ++)
1882 if (__p < __last - __k)
1884 *__p = *(__p + __k);
1885 __p += __k;
1887 *__p = * (__p - __l);
1888 __p -= __l;
1892 *__p = __tmp;
1893 ++__first;
1898 * @brief Rotate the elements of a sequence.
1899 * @param first A forward iterator.
1900 * @param middle A forward iterator.
1901 * @param last A forward iterator.
1902 * @return Nothing.
1904 * Rotates the elements of the range @p [first,last) by @p (middle-first)
1905 * positions so that the element at @p middle is moved to @p first, the
1906 * element at @p middle+1 is moved to @first+1 and so on for each element
1907 * in the range @p [first,last).
1909 * This effectively swaps the ranges @p [first,middle) and
1910 * @p [middle,last).
1912 * Performs @p *(first+(n+(last-middle))%(last-first))=*(first+n) for
1913 * each @p n in the range @p [0,last-first).
1915 template<typename _ForwardIterator>
1916 inline void
1917 rotate(_ForwardIterator __first, _ForwardIterator __middle,
1918 _ForwardIterator __last)
1920 // concept requirements
1921 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
1922 _ForwardIterator>)
1923 __glibcxx_requires_valid_range(__first, __middle);
1924 __glibcxx_requires_valid_range(__middle, __last);
1926 typedef typename iterator_traits<_ForwardIterator>::iterator_category
1927 _IterType;
1928 std::__rotate(__first, __middle, __last, _IterType());
1932 * @brief Copy a sequence, rotating its elements.
1933 * @param first A forward iterator.
1934 * @param middle A forward iterator.
1935 * @param last A forward iterator.
1936 * @param result An output iterator.
1937 * @return An iterator designating the end of the resulting sequence.
1939 * Copies the elements of the range @p [first,last) to the range
1940 * beginning at @result, rotating the copied elements by @p (middle-first)
1941 * positions so that the element at @p middle is moved to @p result, the
1942 * element at @p middle+1 is moved to @result+1 and so on for each element
1943 * in the range @p [first,last).
1945 * Performs @p *(result+(n+(last-middle))%(last-first))=*(first+n) for
1946 * each @p n in the range @p [0,last-first).
1948 template<typename _ForwardIterator, typename _OutputIterator>
1949 _OutputIterator
1950 rotate_copy(_ForwardIterator __first, _ForwardIterator __middle,
1951 _ForwardIterator __last, _OutputIterator __result)
1953 // concept requirements
1954 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
1955 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
1956 typename iterator_traits<_ForwardIterator>::value_type>)
1957 __glibcxx_requires_valid_range(__first, __middle);
1958 __glibcxx_requires_valid_range(__middle, __last);
1960 return std::copy(__first, __middle,
1961 std::copy(__middle, __last, __result));
1965 * @brief Randomly shuffle the elements of a sequence.
1966 * @param first A forward iterator.
1967 * @param last A forward iterator.
1968 * @return Nothing.
1970 * Reorder the elements in the range @p [first,last) using a random
1971 * distribution, so that every possible ordering of the sequence is
1972 * equally likely.
1974 template<typename _RandomAccessIterator>
1975 inline void
1976 random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last)
1978 // concept requirements
1979 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
1980 _RandomAccessIterator>)
1981 __glibcxx_requires_valid_range(__first, __last);
1983 if (__first != __last)
1984 for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
1985 std::iter_swap(__i, __first + (std::rand() % ((__i - __first) + 1)));
1989 * @brief Shuffle the elements of a sequence using a random number
1990 * generator.
1991 * @param first A forward iterator.
1992 * @param last A forward iterator.
1993 * @param rand The RNG functor or function.
1994 * @return Nothing.
1996 * Reorders the elements in the range @p [first,last) using @p rand to
1997 * provide a random distribution. Calling @p rand(N) for a positive
1998 * integer @p N should return a randomly chosen integer from the
1999 * range [0,N).
2001 template<typename _RandomAccessIterator, typename _RandomNumberGenerator>
2002 void
2003 random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
2004 _RandomNumberGenerator& __rand)
2006 // concept requirements
2007 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
2008 _RandomAccessIterator>)
2009 __glibcxx_requires_valid_range(__first, __last);
2011 if (__first == __last)
2012 return;
2013 for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
2014 std::iter_swap(__i, __first + __rand((__i - __first) + 1));
2019 * @if maint
2020 * This is a helper function...
2021 * @endif
2023 template<typename _ForwardIterator, typename _Predicate>
2024 _ForwardIterator
2025 __partition(_ForwardIterator __first, _ForwardIterator __last,
2026 _Predicate __pred,
2027 forward_iterator_tag)
2029 if (__first == __last)
2030 return __first;
2032 while (__pred(*__first))
2033 if (++__first == __last)
2034 return __first;
2036 _ForwardIterator __next = __first;
2038 while (++__next != __last)
2039 if (__pred(*__next))
2041 swap(*__first, *__next);
2042 ++__first;
2045 return __first;
2049 * @if maint
2050 * This is a helper function...
2051 * @endif
2053 template<typename _BidirectionalIterator, typename _Predicate>
2054 _BidirectionalIterator
2055 __partition(_BidirectionalIterator __first, _BidirectionalIterator __last,
2056 _Predicate __pred,
2057 bidirectional_iterator_tag)
2059 while (true)
2061 while (true)
2062 if (__first == __last)
2063 return __first;
2064 else if (__pred(*__first))
2065 ++__first;
2066 else
2067 break;
2068 --__last;
2069 while (true)
2070 if (__first == __last)
2071 return __first;
2072 else if (!__pred(*__last))
2073 --__last;
2074 else
2075 break;
2076 std::iter_swap(__first, __last);
2077 ++__first;
2082 * @brief Move elements for which a predicate is true to the beginning
2083 * of a sequence.
2084 * @param first A forward iterator.
2085 * @param last A forward iterator.
2086 * @param pred A predicate functor.
2087 * @return An iterator @p middle such that @p pred(i) is true for each
2088 * iterator @p i in the range @p [first,middle) and false for each @p i
2089 * in the range @p [middle,last).
2091 * @p pred must not modify its operand. @p partition() does not preserve
2092 * the relative ordering of elements in each group, use
2093 * @p stable_partition() if this is needed.
2095 template<typename _ForwardIterator, typename _Predicate>
2096 inline _ForwardIterator
2097 partition(_ForwardIterator __first, _ForwardIterator __last,
2098 _Predicate __pred)
2100 // concept requirements
2101 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
2102 _ForwardIterator>)
2103 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
2104 typename iterator_traits<_ForwardIterator>::value_type>)
2105 __glibcxx_requires_valid_range(__first, __last);
2107 return std::__partition(__first, __last, __pred,
2108 std::__iterator_category(__first));
2113 * @if maint
2114 * This is a helper function...
2115 * @endif
2117 template<typename _ForwardIterator, typename _Predicate, typename _Distance>
2118 _ForwardIterator
2119 __inplace_stable_partition(_ForwardIterator __first,
2120 _ForwardIterator __last,
2121 _Predicate __pred, _Distance __len)
2123 if (__len == 1)
2124 return __pred(*__first) ? __last : __first;
2125 _ForwardIterator __middle = __first;
2126 std::advance(__middle, __len / 2);
2127 _ForwardIterator __begin = std::__inplace_stable_partition(__first,
2128 __middle,
2129 __pred,
2130 __len / 2);
2131 _ForwardIterator __end = std::__inplace_stable_partition(__middle, __last,
2132 __pred,
2133 __len
2134 - __len / 2);
2135 std::rotate(__begin, __middle, __end);
2136 std::advance(__begin, std::distance(__middle, __end));
2137 return __begin;
2141 * @if maint
2142 * This is a helper function...
2143 * @endif
2145 template<typename _ForwardIterator, typename _Pointer, typename _Predicate,
2146 typename _Distance>
2147 _ForwardIterator
2148 __stable_partition_adaptive(_ForwardIterator __first,
2149 _ForwardIterator __last,
2150 _Predicate __pred, _Distance __len,
2151 _Pointer __buffer,
2152 _Distance __buffer_size)
2154 if (__len <= __buffer_size)
2156 _ForwardIterator __result1 = __first;
2157 _Pointer __result2 = __buffer;
2158 for ( ; __first != __last ; ++__first)
2159 if (__pred(*__first))
2161 *__result1 = *__first;
2162 ++__result1;
2164 else
2166 *__result2 = *__first;
2167 ++__result2;
2169 std::copy(__buffer, __result2, __result1);
2170 return __result1;
2172 else
2174 _ForwardIterator __middle = __first;
2175 std::advance(__middle, __len / 2);
2176 _ForwardIterator __begin =
2177 std::__stable_partition_adaptive(__first, __middle, __pred,
2178 __len / 2, __buffer,
2179 __buffer_size);
2180 _ForwardIterator __end =
2181 std::__stable_partition_adaptive(__middle, __last, __pred,
2182 __len - __len / 2,
2183 __buffer, __buffer_size);
2184 std::rotate(__begin, __middle, __end);
2185 std::advance(__begin, std::distance(__middle, __end));
2186 return __begin;
2191 * @brief Move elements for which a predicate is true to the beginning
2192 * of a sequence, preserving relative ordering.
2193 * @param first A forward iterator.
2194 * @param last A forward iterator.
2195 * @param pred A predicate functor.
2196 * @return An iterator @p middle such that @p pred(i) is true for each
2197 * iterator @p i in the range @p [first,middle) and false for each @p i
2198 * in the range @p [middle,last).
2200 * Performs the same function as @p partition() with the additional
2201 * guarantee that the relative ordering of elements in each group is
2202 * preserved, so any two elements @p x and @p y in the range
2203 * @p [first,last) such that @p pred(x)==pred(y) will have the same
2204 * relative ordering after calling @p stable_partition().
2206 template<typename _ForwardIterator, typename _Predicate>
2207 _ForwardIterator
2208 stable_partition(_ForwardIterator __first, _ForwardIterator __last,
2209 _Predicate __pred)
2211 // concept requirements
2212 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
2213 _ForwardIterator>)
2214 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
2215 typename iterator_traits<_ForwardIterator>::value_type>)
2216 __glibcxx_requires_valid_range(__first, __last);
2218 if (__first == __last)
2219 return __first;
2220 else
2222 typedef typename iterator_traits<_ForwardIterator>::value_type
2223 _ValueType;
2224 typedef typename iterator_traits<_ForwardIterator>::difference_type
2225 _DistanceType;
2227 _Temporary_buffer<_ForwardIterator, _ValueType> __buf(__first,
2228 __last);
2229 if (__buf.size() > 0)
2230 return
2231 std::__stable_partition_adaptive(__first, __last, __pred,
2232 _DistanceType(__buf.requested_size()),
2233 __buf.begin(), __buf.size());
2234 else
2235 return
2236 std::__inplace_stable_partition(__first, __last, __pred,
2237 _DistanceType(__buf.requested_size()));
2242 * @if maint
2243 * This is a helper function...
2244 * @endif
2246 template<typename _RandomAccessIterator, typename _Tp>
2247 _RandomAccessIterator
2248 __unguarded_partition(_RandomAccessIterator __first,
2249 _RandomAccessIterator __last, _Tp __pivot)
2251 while (true)
2253 while (*__first < __pivot)
2254 ++__first;
2255 --__last;
2256 while (__pivot < *__last)
2257 --__last;
2258 if (!(__first < __last))
2259 return __first;
2260 std::iter_swap(__first, __last);
2261 ++__first;
2266 * @if maint
2267 * This is a helper function...
2268 * @endif
2270 template<typename _RandomAccessIterator, typename _Tp, typename _Compare>
2271 _RandomAccessIterator
2272 __unguarded_partition(_RandomAccessIterator __first,
2273 _RandomAccessIterator __last,
2274 _Tp __pivot, _Compare __comp)
2276 while (true)
2278 while (__comp(*__first, __pivot))
2279 ++__first;
2280 --__last;
2281 while (__comp(__pivot, *__last))
2282 --__last;
2283 if (!(__first < __last))
2284 return __first;
2285 std::iter_swap(__first, __last);
2286 ++__first;
2291 * @if maint
2292 * @doctodo
2293 * This controls some aspect of the sort routines.
2294 * @endif
2296 enum { _S_threshold = 16 };
2299 * @if maint
2300 * This is a helper function for the sort routine.
2301 * @endif
2303 template<typename _RandomAccessIterator, typename _Tp>
2304 void
2305 __unguarded_linear_insert(_RandomAccessIterator __last, _Tp __val)
2307 _RandomAccessIterator __next = __last;
2308 --__next;
2309 while (__val < *__next)
2311 *__last = *__next;
2312 __last = __next;
2313 --__next;
2315 *__last = __val;
2319 * @if maint
2320 * This is a helper function for the sort routine.
2321 * @endif
2323 template<typename _RandomAccessIterator, typename _Tp, typename _Compare>
2324 void
2325 __unguarded_linear_insert(_RandomAccessIterator __last, _Tp __val,
2326 _Compare __comp)
2328 _RandomAccessIterator __next = __last;
2329 --__next;
2330 while (__comp(__val, *__next))
2332 *__last = *__next;
2333 __last = __next;
2334 --__next;
2336 *__last = __val;
2340 * @if maint
2341 * This is a helper function for the sort routine.
2342 * @endif
2344 template<typename _RandomAccessIterator>
2345 void
2346 __insertion_sort(_RandomAccessIterator __first,
2347 _RandomAccessIterator __last)
2349 if (__first == __last)
2350 return;
2352 for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
2354 typename iterator_traits<_RandomAccessIterator>::value_type
2355 __val = *__i;
2356 if (__val < *__first)
2358 std::copy_backward(__first, __i, __i + 1);
2359 *__first = __val;
2361 else
2362 std::__unguarded_linear_insert(__i, __val);
2367 * @if maint
2368 * This is a helper function for the sort routine.
2369 * @endif
2371 template<typename _RandomAccessIterator, typename _Compare>
2372 void
2373 __insertion_sort(_RandomAccessIterator __first,
2374 _RandomAccessIterator __last, _Compare __comp)
2376 if (__first == __last) return;
2378 for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
2380 typename iterator_traits<_RandomAccessIterator>::value_type
2381 __val = *__i;
2382 if (__comp(__val, *__first))
2384 std::copy_backward(__first, __i, __i + 1);
2385 *__first = __val;
2387 else
2388 std::__unguarded_linear_insert(__i, __val, __comp);
2393 * @if maint
2394 * This is a helper function for the sort routine.
2395 * @endif
2397 template<typename _RandomAccessIterator>
2398 inline void
2399 __unguarded_insertion_sort(_RandomAccessIterator __first,
2400 _RandomAccessIterator __last)
2402 typedef typename iterator_traits<_RandomAccessIterator>::value_type
2403 _ValueType;
2405 for (_RandomAccessIterator __i = __first; __i != __last; ++__i)
2406 std::__unguarded_linear_insert(__i, _ValueType(*__i));
2410 * @if maint
2411 * This is a helper function for the sort routine.
2412 * @endif
2414 template<typename _RandomAccessIterator, typename _Compare>
2415 inline void
2416 __unguarded_insertion_sort(_RandomAccessIterator __first,
2417 _RandomAccessIterator __last, _Compare __comp)
2419 typedef typename iterator_traits<_RandomAccessIterator>::value_type
2420 _ValueType;
2422 for (_RandomAccessIterator __i = __first; __i != __last; ++__i)
2423 std::__unguarded_linear_insert(__i, _ValueType(*__i), __comp);
2427 * @if maint
2428 * This is a helper function for the sort routine.
2429 * @endif
2431 template<typename _RandomAccessIterator>
2432 void
2433 __final_insertion_sort(_RandomAccessIterator __first,
2434 _RandomAccessIterator __last)
2436 if (__last - __first > int(_S_threshold))
2438 std::__insertion_sort(__first, __first + int(_S_threshold));
2439 std::__unguarded_insertion_sort(__first + int(_S_threshold), __last);
2441 else
2442 std::__insertion_sort(__first, __last);
2446 * @if maint
2447 * This is a helper function for the sort routine.
2448 * @endif
2450 template<typename _RandomAccessIterator, typename _Compare>
2451 void
2452 __final_insertion_sort(_RandomAccessIterator __first,
2453 _RandomAccessIterator __last, _Compare __comp)
2455 if (__last - __first > int(_S_threshold))
2457 std::__insertion_sort(__first, __first + int(_S_threshold), __comp);
2458 std::__unguarded_insertion_sort(__first + int(_S_threshold), __last,
2459 __comp);
2461 else
2462 std::__insertion_sort(__first, __last, __comp);
2466 * @if maint
2467 * This is a helper function for the sort routines.
2468 * @endif
2470 template<typename _RandomAccessIterator>
2471 void
2472 __heap_select(_RandomAccessIterator __first,
2473 _RandomAccessIterator __middle,
2474 _RandomAccessIterator __last)
2476 typedef typename iterator_traits<_RandomAccessIterator>::value_type
2477 _ValueType;
2479 std::make_heap(__first, __middle);
2480 for (_RandomAccessIterator __i = __middle; __i < __last; ++__i)
2481 if (*__i < *__first)
2482 std::__pop_heap(__first, __middle, __i, _ValueType(*__i));
2486 * @if maint
2487 * This is a helper function for the sort routines.
2488 * @endif
2490 template<typename _RandomAccessIterator, typename _Compare>
2491 void
2492 __heap_select(_RandomAccessIterator __first,
2493 _RandomAccessIterator __middle,
2494 _RandomAccessIterator __last, _Compare __comp)
2496 typedef typename iterator_traits<_RandomAccessIterator>::value_type
2497 _ValueType;
2499 std::make_heap(__first, __middle, __comp);
2500 for (_RandomAccessIterator __i = __middle; __i < __last; ++__i)
2501 if (__comp(*__i, *__first))
2502 std::__pop_heap(__first, __middle, __i, _ValueType(*__i), __comp);
2506 * @if maint
2507 * This is a helper function for the sort routines.
2508 * @endif
2510 template<typename _Size>
2511 inline _Size
2512 __lg(_Size __n)
2514 _Size __k;
2515 for (__k = 0; __n != 1; __n >>= 1)
2516 ++__k;
2517 return __k;
2521 * @brief Sort the smallest elements of a sequence.
2522 * @param first An iterator.
2523 * @param middle Another iterator.
2524 * @param last Another iterator.
2525 * @return Nothing.
2527 * Sorts the smallest @p (middle-first) elements in the range
2528 * @p [first,last) and moves them to the range @p [first,middle). The
2529 * order of the remaining elements in the range @p [middle,last) is
2530 * undefined.
2531 * After the sort if @p i and @j are iterators in the range
2532 * @p [first,middle) such that @i precedes @j and @k is an iterator in
2533 * the range @p [middle,last) then @p *j<*i and @p *k<*i are both false.
2535 template<typename _RandomAccessIterator>
2536 inline void
2537 partial_sort(_RandomAccessIterator __first,
2538 _RandomAccessIterator __middle,
2539 _RandomAccessIterator __last)
2541 typedef typename iterator_traits<_RandomAccessIterator>::value_type
2542 _ValueType;
2544 // concept requirements
2545 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
2546 _RandomAccessIterator>)
2547 __glibcxx_function_requires(_LessThanComparableConcept<_ValueType>)
2548 __glibcxx_requires_valid_range(__first, __middle);
2549 __glibcxx_requires_valid_range(__middle, __last);
2551 std::__heap_select(__first, __middle, __last);
2552 std::sort_heap(__first, __middle);
2556 * @brief Sort the smallest elements of a sequence using a predicate
2557 * for comparison.
2558 * @param first An iterator.
2559 * @param middle Another iterator.
2560 * @param last Another iterator.
2561 * @param comp A comparison functor.
2562 * @return Nothing.
2564 * Sorts the smallest @p (middle-first) elements in the range
2565 * @p [first,last) and moves them to the range @p [first,middle). The
2566 * order of the remaining elements in the range @p [middle,last) is
2567 * undefined.
2568 * After the sort if @p i and @j are iterators in the range
2569 * @p [first,middle) such that @i precedes @j and @k is an iterator in
2570 * the range @p [middle,last) then @p *comp(j,*i) and @p comp(*k,*i)
2571 * are both false.
2573 template<typename _RandomAccessIterator, typename _Compare>
2574 inline void
2575 partial_sort(_RandomAccessIterator __first,
2576 _RandomAccessIterator __middle,
2577 _RandomAccessIterator __last,
2578 _Compare __comp)
2580 typedef typename iterator_traits<_RandomAccessIterator>::value_type
2581 _ValueType;
2583 // concept requirements
2584 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
2585 _RandomAccessIterator>)
2586 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2587 _ValueType, _ValueType>)
2588 __glibcxx_requires_valid_range(__first, __middle);
2589 __glibcxx_requires_valid_range(__middle, __last);
2591 std::__heap_select(__first, __middle, __last, __comp);
2592 std::sort_heap(__first, __middle, __comp);
2596 * @brief Copy the smallest elements of a sequence.
2597 * @param first An iterator.
2598 * @param last Another iterator.
2599 * @param result_first A random-access iterator.
2600 * @param result_last Another random-access iterator.
2601 * @return An iterator indicating the end of the resulting sequence.
2603 * Copies and sorts the smallest N values from the range @p [first,last)
2604 * to the range beginning at @p result_first, where the number of
2605 * elements to be copied, @p N, is the smaller of @p (last-first) and
2606 * @p (result_last-result_first).
2607 * After the sort if @p i and @j are iterators in the range
2608 * @p [result_first,result_first+N) such that @i precedes @j then
2609 * @p *j<*i is false.
2610 * The value returned is @p result_first+N.
2612 template<typename _InputIterator, typename _RandomAccessIterator>
2613 _RandomAccessIterator
2614 partial_sort_copy(_InputIterator __first, _InputIterator __last,
2615 _RandomAccessIterator __result_first,
2616 _RandomAccessIterator __result_last)
2618 typedef typename iterator_traits<_InputIterator>::value_type
2619 _InputValueType;
2620 typedef typename iterator_traits<_RandomAccessIterator>::value_type
2621 _OutputValueType;
2622 typedef typename iterator_traits<_RandomAccessIterator>::difference_type
2623 _DistanceType;
2625 // concept requirements
2626 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
2627 __glibcxx_function_requires(_ConvertibleConcept<_InputValueType,
2628 _OutputValueType>)
2629 __glibcxx_function_requires(_LessThanOpConcept<_InputValueType,
2630 _OutputValueType>)
2631 __glibcxx_function_requires(_LessThanComparableConcept<_OutputValueType>)
2632 __glibcxx_requires_valid_range(__first, __last);
2633 __glibcxx_requires_valid_range(__result_first, __result_last);
2635 if (__result_first == __result_last)
2636 return __result_last;
2637 _RandomAccessIterator __result_real_last = __result_first;
2638 while(__first != __last && __result_real_last != __result_last)
2640 *__result_real_last = *__first;
2641 ++__result_real_last;
2642 ++__first;
2644 std::make_heap(__result_first, __result_real_last);
2645 while (__first != __last)
2647 if (*__first < *__result_first)
2648 std::__adjust_heap(__result_first, _DistanceType(0),
2649 _DistanceType(__result_real_last
2650 - __result_first),
2651 _InputValueType(*__first));
2652 ++__first;
2654 std::sort_heap(__result_first, __result_real_last);
2655 return __result_real_last;
2659 * @brief Copy the smallest elements of a sequence using a predicate for
2660 * comparison.
2661 * @param first An input iterator.
2662 * @param last Another input iterator.
2663 * @param result_first A random-access iterator.
2664 * @param result_last Another random-access iterator.
2665 * @param comp A comparison functor.
2666 * @return An iterator indicating the end of the resulting sequence.
2668 * Copies and sorts the smallest N values from the range @p [first,last)
2669 * to the range beginning at @p result_first, where the number of
2670 * elements to be copied, @p N, is the smaller of @p (last-first) and
2671 * @p (result_last-result_first).
2672 * After the sort if @p i and @j are iterators in the range
2673 * @p [result_first,result_first+N) such that @i precedes @j then
2674 * @p comp(*j,*i) is false.
2675 * The value returned is @p result_first+N.
2677 template<typename _InputIterator, typename _RandomAccessIterator, typename _Compare>
2678 _RandomAccessIterator
2679 partial_sort_copy(_InputIterator __first, _InputIterator __last,
2680 _RandomAccessIterator __result_first,
2681 _RandomAccessIterator __result_last,
2682 _Compare __comp)
2684 typedef typename iterator_traits<_InputIterator>::value_type
2685 _InputValueType;
2686 typedef typename iterator_traits<_RandomAccessIterator>::value_type
2687 _OutputValueType;
2688 typedef typename iterator_traits<_RandomAccessIterator>::difference_type
2689 _DistanceType;
2691 // concept requirements
2692 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
2693 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
2694 _RandomAccessIterator>)
2695 __glibcxx_function_requires(_ConvertibleConcept<_InputValueType,
2696 _OutputValueType>)
2697 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2698 _InputValueType, _OutputValueType>)
2699 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2700 _OutputValueType, _OutputValueType>)
2701 __glibcxx_requires_valid_range(__first, __last);
2702 __glibcxx_requires_valid_range(__result_first, __result_last);
2704 if (__result_first == __result_last)
2705 return __result_last;
2706 _RandomAccessIterator __result_real_last = __result_first;
2707 while(__first != __last && __result_real_last != __result_last)
2709 *__result_real_last = *__first;
2710 ++__result_real_last;
2711 ++__first;
2713 std::make_heap(__result_first, __result_real_last, __comp);
2714 while (__first != __last)
2716 if (__comp(*__first, *__result_first))
2717 std::__adjust_heap(__result_first, _DistanceType(0),
2718 _DistanceType(__result_real_last
2719 - __result_first),
2720 _InputValueType(*__first),
2721 __comp);
2722 ++__first;
2724 std::sort_heap(__result_first, __result_real_last, __comp);
2725 return __result_real_last;
2729 * @if maint
2730 * This is a helper function for the sort routine.
2731 * @endif
2733 template<typename _RandomAccessIterator, typename _Size>
2734 void
2735 __introsort_loop(_RandomAccessIterator __first,
2736 _RandomAccessIterator __last,
2737 _Size __depth_limit)
2739 typedef typename iterator_traits<_RandomAccessIterator>::value_type
2740 _ValueType;
2742 while (__last - __first > int(_S_threshold))
2744 if (__depth_limit == 0)
2746 std::partial_sort(__first, __last, __last);
2747 return;
2749 --__depth_limit;
2750 _RandomAccessIterator __cut =
2751 std::__unguarded_partition(__first, __last,
2752 _ValueType(std::__median(*__first,
2753 *(__first
2754 + (__last
2755 - __first)
2756 / 2),
2757 *(__last
2758 - 1))));
2759 std::__introsort_loop(__cut, __last, __depth_limit);
2760 __last = __cut;
2765 * @if maint
2766 * This is a helper function for the sort routine.
2767 * @endif
2769 template<typename _RandomAccessIterator, typename _Size, typename _Compare>
2770 void
2771 __introsort_loop(_RandomAccessIterator __first,
2772 _RandomAccessIterator __last,
2773 _Size __depth_limit, _Compare __comp)
2775 typedef typename iterator_traits<_RandomAccessIterator>::value_type
2776 _ValueType;
2778 while (__last - __first > int(_S_threshold))
2780 if (__depth_limit == 0)
2782 std::partial_sort(__first, __last, __last, __comp);
2783 return;
2785 --__depth_limit;
2786 _RandomAccessIterator __cut =
2787 std::__unguarded_partition(__first, __last,
2788 _ValueType(std::__median(*__first,
2789 *(__first
2790 + (__last
2791 - __first)
2792 / 2),
2793 *(__last - 1),
2794 __comp)),
2795 __comp);
2796 std::__introsort_loop(__cut, __last, __depth_limit, __comp);
2797 __last = __cut;
2802 * @brief Sort the elements of a sequence.
2803 * @param first An iterator.
2804 * @param last Another iterator.
2805 * @return Nothing.
2807 * Sorts the elements in the range @p [first,last) in ascending order,
2808 * such that @p *(i+1)<*i is false for each iterator @p i in the range
2809 * @p [first,last-1).
2811 * The relative ordering of equivalent elements is not preserved, use
2812 * @p stable_sort() if this is needed.
2814 template<typename _RandomAccessIterator>
2815 inline void
2816 sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
2818 typedef typename iterator_traits<_RandomAccessIterator>::value_type
2819 _ValueType;
2821 // concept requirements
2822 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
2823 _RandomAccessIterator>)
2824 __glibcxx_function_requires(_LessThanComparableConcept<_ValueType>)
2825 __glibcxx_requires_valid_range(__first, __last);
2827 if (__first != __last)
2829 std::__introsort_loop(__first, __last,
2830 std::__lg(__last - __first) * 2);
2831 std::__final_insertion_sort(__first, __last);
2836 * @brief Sort the elements of a sequence using a predicate for comparison.
2837 * @param first An iterator.
2838 * @param last Another iterator.
2839 * @param comp A comparison functor.
2840 * @return Nothing.
2842 * Sorts the elements in the range @p [first,last) in ascending order,
2843 * such that @p comp(*(i+1),*i) is false for every iterator @p i in the
2844 * range @p [first,last-1).
2846 * The relative ordering of equivalent elements is not preserved, use
2847 * @p stable_sort() if this is needed.
2849 template<typename _RandomAccessIterator, typename _Compare>
2850 inline void
2851 sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
2852 _Compare __comp)
2854 typedef typename iterator_traits<_RandomAccessIterator>::value_type
2855 _ValueType;
2857 // concept requirements
2858 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
2859 _RandomAccessIterator>)
2860 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare, _ValueType,
2861 _ValueType>)
2862 __glibcxx_requires_valid_range(__first, __last);
2864 if (__first != __last)
2866 std::__introsort_loop(__first, __last,
2867 std::__lg(__last - __first) * 2, __comp);
2868 std::__final_insertion_sort(__first, __last, __comp);
2873 * @brief Finds the first position in which @a val could be inserted
2874 * without changing the ordering.
2875 * @param first An iterator.
2876 * @param last Another iterator.
2877 * @param val The search term.
2878 * @return An iterator pointing to the first element "not less than" @a val,
2879 * or end() if every element is less than @a val.
2880 * @ingroup binarysearch
2882 template<typename _ForwardIterator, typename _Tp>
2883 _ForwardIterator
2884 lower_bound(_ForwardIterator __first, _ForwardIterator __last,
2885 const _Tp& __val)
2887 typedef typename iterator_traits<_ForwardIterator>::value_type
2888 _ValueType;
2889 typedef typename iterator_traits<_ForwardIterator>::difference_type
2890 _DistanceType;
2892 // concept requirements
2893 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2894 __glibcxx_function_requires(_LessThanOpConcept<_ValueType, _Tp>)
2895 __glibcxx_requires_partitioned(__first, __last, __val);
2897 _DistanceType __len = std::distance(__first, __last);
2898 _DistanceType __half;
2899 _ForwardIterator __middle;
2901 while (__len > 0)
2903 __half = __len >> 1;
2904 __middle = __first;
2905 std::advance(__middle, __half);
2906 if (*__middle < __val)
2908 __first = __middle;
2909 ++__first;
2910 __len = __len - __half - 1;
2912 else
2913 __len = __half;
2915 return __first;
2919 * @brief Finds the first position in which @a val could be inserted
2920 * without changing the ordering.
2921 * @param first An iterator.
2922 * @param last Another iterator.
2923 * @param val The search term.
2924 * @param comp A functor to use for comparisons.
2925 * @return An iterator pointing to the first element "not less than" @a val,
2926 * or end() if every element is less than @a val.
2927 * @ingroup binarysearch
2929 * The comparison function should have the same effects on ordering as
2930 * the function used for the initial sort.
2932 template<typename _ForwardIterator, typename _Tp, typename _Compare>
2933 _ForwardIterator
2934 lower_bound(_ForwardIterator __first, _ForwardIterator __last,
2935 const _Tp& __val, _Compare __comp)
2937 typedef typename iterator_traits<_ForwardIterator>::value_type
2938 _ValueType;
2939 typedef typename iterator_traits<_ForwardIterator>::difference_type
2940 _DistanceType;
2942 // concept requirements
2943 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2944 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2945 _ValueType, _Tp>)
2946 __glibcxx_requires_partitioned_pred(__first, __last, __val, __comp);
2948 _DistanceType __len = std::distance(__first, __last);
2949 _DistanceType __half;
2950 _ForwardIterator __middle;
2952 while (__len > 0)
2954 __half = __len >> 1;
2955 __middle = __first;
2956 std::advance(__middle, __half);
2957 if (__comp(*__middle, __val))
2959 __first = __middle;
2960 ++__first;
2961 __len = __len - __half - 1;
2963 else
2964 __len = __half;
2966 return __first;
2970 * @brief Finds the last position in which @a val could be inserted
2971 * without changing the ordering.
2972 * @param first An iterator.
2973 * @param last Another iterator.
2974 * @param val The search term.
2975 * @return An iterator pointing to the first element greater than @a val,
2976 * or end() if no elements are greater than @a val.
2977 * @ingroup binarysearch
2979 template<typename _ForwardIterator, typename _Tp>
2980 _ForwardIterator
2981 upper_bound(_ForwardIterator __first, _ForwardIterator __last,
2982 const _Tp& __val)
2984 typedef typename iterator_traits<_ForwardIterator>::value_type
2985 _ValueType;
2986 typedef typename iterator_traits<_ForwardIterator>::difference_type
2987 _DistanceType;
2989 // concept requirements
2990 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2991 __glibcxx_function_requires(_LessThanOpConcept<_Tp, _ValueType>)
2992 __glibcxx_requires_partitioned(__first, __last, __val);
2994 _DistanceType __len = std::distance(__first, __last);
2995 _DistanceType __half;
2996 _ForwardIterator __middle;
2998 while (__len > 0)
3000 __half = __len >> 1;
3001 __middle = __first;
3002 std::advance(__middle, __half);
3003 if (__val < *__middle)
3004 __len = __half;
3005 else
3007 __first = __middle;
3008 ++__first;
3009 __len = __len - __half - 1;
3012 return __first;
3016 * @brief Finds the last position in which @a val could be inserted
3017 * without changing the ordering.
3018 * @param first An iterator.
3019 * @param last Another iterator.
3020 * @param val The search term.
3021 * @param comp A functor to use for comparisons.
3022 * @return An iterator pointing to the first element greater than @a val,
3023 * or end() if no elements are greater than @a val.
3024 * @ingroup binarysearch
3026 * The comparison function should have the same effects on ordering as
3027 * the function used for the initial sort.
3029 template<typename _ForwardIterator, typename _Tp, typename _Compare>
3030 _ForwardIterator
3031 upper_bound(_ForwardIterator __first, _ForwardIterator __last,
3032 const _Tp& __val, _Compare __comp)
3034 typedef typename iterator_traits<_ForwardIterator>::value_type
3035 _ValueType;
3036 typedef typename iterator_traits<_ForwardIterator>::difference_type
3037 _DistanceType;
3039 // concept requirements
3040 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
3041 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
3042 _Tp, _ValueType>)
3043 __glibcxx_requires_partitioned_pred(__first, __last, __val, __comp);
3045 _DistanceType __len = std::distance(__first, __last);
3046 _DistanceType __half;
3047 _ForwardIterator __middle;
3049 while (__len > 0)
3051 __half = __len >> 1;
3052 __middle = __first;
3053 std::advance(__middle, __half);
3054 if (__comp(__val, *__middle))
3055 __len = __half;
3056 else
3058 __first = __middle;
3059 ++__first;
3060 __len = __len - __half - 1;
3063 return __first;
3067 * @if maint
3068 * This is a helper function for the merge routines.
3069 * @endif
3071 template<typename _BidirectionalIterator, typename _Distance>
3072 void
3073 __merge_without_buffer(_BidirectionalIterator __first,
3074 _BidirectionalIterator __middle,
3075 _BidirectionalIterator __last,
3076 _Distance __len1, _Distance __len2)
3078 if (__len1 == 0 || __len2 == 0)
3079 return;
3080 if (__len1 + __len2 == 2)
3082 if (*__middle < *__first)
3083 std::iter_swap(__first, __middle);
3084 return;
3086 _BidirectionalIterator __first_cut = __first;
3087 _BidirectionalIterator __second_cut = __middle;
3088 _Distance __len11 = 0;
3089 _Distance __len22 = 0;
3090 if (__len1 > __len2)
3092 __len11 = __len1 / 2;
3093 std::advance(__first_cut, __len11);
3094 __second_cut = std::lower_bound(__middle, __last, *__first_cut);
3095 __len22 = std::distance(__middle, __second_cut);
3097 else
3099 __len22 = __len2 / 2;
3100 std::advance(__second_cut, __len22);
3101 __first_cut = std::upper_bound(__first, __middle, *__second_cut);
3102 __len11 = std::distance(__first, __first_cut);
3104 std::rotate(__first_cut, __middle, __second_cut);
3105 _BidirectionalIterator __new_middle = __first_cut;
3106 std::advance(__new_middle, std::distance(__middle, __second_cut));
3107 std::__merge_without_buffer(__first, __first_cut, __new_middle,
3108 __len11, __len22);
3109 std::__merge_without_buffer(__new_middle, __second_cut, __last,
3110 __len1 - __len11, __len2 - __len22);
3114 * @if maint
3115 * This is a helper function for the merge routines.
3116 * @endif
3118 template<typename _BidirectionalIterator, typename _Distance,
3119 typename _Compare>
3120 void
3121 __merge_without_buffer(_BidirectionalIterator __first,
3122 _BidirectionalIterator __middle,
3123 _BidirectionalIterator __last,
3124 _Distance __len1, _Distance __len2,
3125 _Compare __comp)
3127 if (__len1 == 0 || __len2 == 0)
3128 return;
3129 if (__len1 + __len2 == 2)
3131 if (__comp(*__middle, *__first))
3132 std::iter_swap(__first, __middle);
3133 return;
3135 _BidirectionalIterator __first_cut = __first;
3136 _BidirectionalIterator __second_cut = __middle;
3137 _Distance __len11 = 0;
3138 _Distance __len22 = 0;
3139 if (__len1 > __len2)
3141 __len11 = __len1 / 2;
3142 std::advance(__first_cut, __len11);
3143 __second_cut = std::lower_bound(__middle, __last, *__first_cut,
3144 __comp);
3145 __len22 = std::distance(__middle, __second_cut);
3147 else
3149 __len22 = __len2 / 2;
3150 std::advance(__second_cut, __len22);
3151 __first_cut = std::upper_bound(__first, __middle, *__second_cut,
3152 __comp);
3153 __len11 = std::distance(__first, __first_cut);
3155 std::rotate(__first_cut, __middle, __second_cut);
3156 _BidirectionalIterator __new_middle = __first_cut;
3157 std::advance(__new_middle, std::distance(__middle, __second_cut));
3158 std::__merge_without_buffer(__first, __first_cut, __new_middle,
3159 __len11, __len22, __comp);
3160 std::__merge_without_buffer(__new_middle, __second_cut, __last,
3161 __len1 - __len11, __len2 - __len22, __comp);
3165 * @if maint
3166 * This is a helper function for the stable sorting routines.
3167 * @endif
3169 template<typename _RandomAccessIterator>
3170 void
3171 __inplace_stable_sort(_RandomAccessIterator __first,
3172 _RandomAccessIterator __last)
3174 if (__last - __first < 15)
3176 std::__insertion_sort(__first, __last);
3177 return;
3179 _RandomAccessIterator __middle = __first + (__last - __first) / 2;
3180 std::__inplace_stable_sort(__first, __middle);
3181 std::__inplace_stable_sort(__middle, __last);
3182 std::__merge_without_buffer(__first, __middle, __last,
3183 __middle - __first,
3184 __last - __middle);
3188 * @if maint
3189 * This is a helper function for the stable sorting routines.
3190 * @endif
3192 template<typename _RandomAccessIterator, typename _Compare>
3193 void
3194 __inplace_stable_sort(_RandomAccessIterator __first,
3195 _RandomAccessIterator __last, _Compare __comp)
3197 if (__last - __first < 15)
3199 std::__insertion_sort(__first, __last, __comp);
3200 return;
3202 _RandomAccessIterator __middle = __first + (__last - __first) / 2;
3203 std::__inplace_stable_sort(__first, __middle, __comp);
3204 std::__inplace_stable_sort(__middle, __last, __comp);
3205 std::__merge_without_buffer(__first, __middle, __last,
3206 __middle - __first,
3207 __last - __middle,
3208 __comp);
3212 * @brief Merges two sorted ranges.
3213 * @param first1 An iterator.
3214 * @param first2 Another iterator.
3215 * @param last1 Another iterator.
3216 * @param last2 Another iterator.
3217 * @param result An iterator pointing to the end of the merged range.
3218 * @return An iterator pointing to the first element "not less than" @a val.
3220 * Merges the ranges [first1,last1) and [first2,last2) into the sorted range
3221 * [result, result + (last1-first1) + (last2-first2)). Both input ranges
3222 * must be sorted, and the output range must not overlap with either of
3223 * the input ranges. The sort is @e stable, that is, for equivalent
3224 * elements in the two ranges, elements from the first range will always
3225 * come before elements from the second.
3227 template<typename _InputIterator1, typename _InputIterator2,
3228 typename _OutputIterator>
3229 _OutputIterator
3230 merge(_InputIterator1 __first1, _InputIterator1 __last1,
3231 _InputIterator2 __first2, _InputIterator2 __last2,
3232 _OutputIterator __result)
3234 typedef typename iterator_traits<_InputIterator1>::value_type
3235 _ValueType1;
3236 typedef typename iterator_traits<_InputIterator2>::value_type
3237 _ValueType2;
3239 // concept requirements
3240 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
3241 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
3242 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
3243 _ValueType1>)
3244 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
3245 _ValueType2>)
3246 __glibcxx_function_requires(_LessThanOpConcept<_ValueType2, _ValueType1>)
3247 __glibcxx_requires_sorted(__first1, __last1);
3248 __glibcxx_requires_sorted(__first2, __last2);
3250 while (__first1 != __last1 && __first2 != __last2)
3252 if (*__first2 < *__first1)
3254 *__result = *__first2;
3255 ++__first2;
3257 else
3259 *__result = *__first1;
3260 ++__first1;
3262 ++__result;
3264 return std::copy(__first2, __last2, std::copy(__first1, __last1,
3265 __result));
3269 * @brief Merges two sorted ranges.
3270 * @param first1 An iterator.
3271 * @param first2 Another iterator.
3272 * @param last1 Another iterator.
3273 * @param last2 Another iterator.
3274 * @param result An iterator pointing to the end of the merged range.
3275 * @param comp A functor to use for comparisons.
3276 * @return An iterator pointing to the first element "not less than" @a val.
3278 * Merges the ranges [first1,last1) and [first2,last2) into the sorted range
3279 * [result, result + (last1-first1) + (last2-first2)). Both input ranges
3280 * must be sorted, and the output range must not overlap with either of
3281 * the input ranges. The sort is @e stable, that is, for equivalent
3282 * elements in the two ranges, elements from the first range will always
3283 * come before elements from the second.
3285 * The comparison function should have the same effects on ordering as
3286 * the function used for the initial sort.
3288 template<typename _InputIterator1, typename _InputIterator2,
3289 typename _OutputIterator, typename _Compare>
3290 _OutputIterator
3291 merge(_InputIterator1 __first1, _InputIterator1 __last1,
3292 _InputIterator2 __first2, _InputIterator2 __last2,
3293 _OutputIterator __result, _Compare __comp)
3295 typedef typename iterator_traits<_InputIterator1>::value_type
3296 _ValueType1;
3297 typedef typename iterator_traits<_InputIterator2>::value_type
3298 _ValueType2;
3300 // concept requirements
3301 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
3302 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
3303 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
3304 _ValueType1>)
3305 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
3306 _ValueType2>)
3307 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
3308 _ValueType2, _ValueType1>)
3309 __glibcxx_requires_sorted_pred(__first1, __last1, __comp);
3310 __glibcxx_requires_sorted_pred(__first2, __last2, __comp);
3312 while (__first1 != __last1 && __first2 != __last2)
3314 if (__comp(*__first2, *__first1))
3316 *__result = *__first2;
3317 ++__first2;
3319 else
3321 *__result = *__first1;
3322 ++__first1;
3324 ++__result;
3326 return std::copy(__first2, __last2, std::copy(__first1, __last1,
3327 __result));
3330 template<typename _RandomAccessIterator1, typename _RandomAccessIterator2,
3331 typename _Distance>
3332 void
3333 __merge_sort_loop(_RandomAccessIterator1 __first,
3334 _RandomAccessIterator1 __last,
3335 _RandomAccessIterator2 __result,
3336 _Distance __step_size)
3338 const _Distance __two_step = 2 * __step_size;
3340 while (__last - __first >= __two_step)
3342 __result = std::merge(__first, __first + __step_size,
3343 __first + __step_size, __first + __two_step,
3344 __result);
3345 __first += __two_step;
3348 __step_size = std::min(_Distance(__last - __first), __step_size);
3349 std::merge(__first, __first + __step_size, __first + __step_size, __last,
3350 __result);
3353 template<typename _RandomAccessIterator1, typename _RandomAccessIterator2,
3354 typename _Distance, typename _Compare>
3355 void
3356 __merge_sort_loop(_RandomAccessIterator1 __first,
3357 _RandomAccessIterator1 __last,
3358 _RandomAccessIterator2 __result, _Distance __step_size,
3359 _Compare __comp)
3361 const _Distance __two_step = 2 * __step_size;
3363 while (__last - __first >= __two_step)
3365 __result = std::merge(__first, __first + __step_size,
3366 __first + __step_size, __first + __two_step,
3367 __result,
3368 __comp);
3369 __first += __two_step;
3371 __step_size = std::min(_Distance(__last - __first), __step_size);
3373 std::merge(__first, __first + __step_size,
3374 __first + __step_size, __last,
3375 __result,
3376 __comp);
3379 enum { _S_chunk_size = 7 };
3381 template<typename _RandomAccessIterator, typename _Distance>
3382 void
3383 __chunk_insertion_sort(_RandomAccessIterator __first,
3384 _RandomAccessIterator __last,
3385 _Distance __chunk_size)
3387 while (__last - __first >= __chunk_size)
3389 std::__insertion_sort(__first, __first + __chunk_size);
3390 __first += __chunk_size;
3392 std::__insertion_sort(__first, __last);
3395 template<typename _RandomAccessIterator, typename _Distance, typename _Compare>
3396 void
3397 __chunk_insertion_sort(_RandomAccessIterator __first,
3398 _RandomAccessIterator __last,
3399 _Distance __chunk_size, _Compare __comp)
3401 while (__last - __first >= __chunk_size)
3403 std::__insertion_sort(__first, __first + __chunk_size, __comp);
3404 __first += __chunk_size;
3406 std::__insertion_sort(__first, __last, __comp);
3409 template<typename _RandomAccessIterator, typename _Pointer>
3410 void
3411 __merge_sort_with_buffer(_RandomAccessIterator __first,
3412 _RandomAccessIterator __last,
3413 _Pointer __buffer)
3415 typedef typename iterator_traits<_RandomAccessIterator>::difference_type
3416 _Distance;
3418 const _Distance __len = __last - __first;
3419 const _Pointer __buffer_last = __buffer + __len;
3421 _Distance __step_size = _S_chunk_size;
3422 std::__chunk_insertion_sort(__first, __last, __step_size);
3424 while (__step_size < __len)
3426 std::__merge_sort_loop(__first, __last, __buffer, __step_size);
3427 __step_size *= 2;
3428 std::__merge_sort_loop(__buffer, __buffer_last, __first, __step_size);
3429 __step_size *= 2;
3433 template<typename _RandomAccessIterator, typename _Pointer, typename _Compare>
3434 void
3435 __merge_sort_with_buffer(_RandomAccessIterator __first,
3436 _RandomAccessIterator __last,
3437 _Pointer __buffer, _Compare __comp)
3439 typedef typename iterator_traits<_RandomAccessIterator>::difference_type
3440 _Distance;
3442 const _Distance __len = __last - __first;
3443 const _Pointer __buffer_last = __buffer + __len;
3445 _Distance __step_size = _S_chunk_size;
3446 std::__chunk_insertion_sort(__first, __last, __step_size, __comp);
3448 while (__step_size < __len)
3450 std::__merge_sort_loop(__first, __last, __buffer,
3451 __step_size, __comp);
3452 __step_size *= 2;
3453 std::__merge_sort_loop(__buffer, __buffer_last, __first,
3454 __step_size, __comp);
3455 __step_size *= 2;
3460 * @if maint
3461 * This is a helper function for the merge routines.
3462 * @endif
3464 template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
3465 typename _BidirectionalIterator3>
3466 _BidirectionalIterator3
3467 __merge_backward(_BidirectionalIterator1 __first1,
3468 _BidirectionalIterator1 __last1,
3469 _BidirectionalIterator2 __first2,
3470 _BidirectionalIterator2 __last2,
3471 _BidirectionalIterator3 __result)
3473 if (__first1 == __last1)
3474 return std::copy_backward(__first2, __last2, __result);
3475 if (__first2 == __last2)
3476 return std::copy_backward(__first1, __last1, __result);
3477 --__last1;
3478 --__last2;
3479 while (true)
3481 if (*__last2 < *__last1)
3483 *--__result = *__last1;
3484 if (__first1 == __last1)
3485 return std::copy_backward(__first2, ++__last2, __result);
3486 --__last1;
3488 else
3490 *--__result = *__last2;
3491 if (__first2 == __last2)
3492 return std::copy_backward(__first1, ++__last1, __result);
3493 --__last2;
3499 * @if maint
3500 * This is a helper function for the merge routines.
3501 * @endif
3503 template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
3504 typename _BidirectionalIterator3, typename _Compare>
3505 _BidirectionalIterator3
3506 __merge_backward(_BidirectionalIterator1 __first1,
3507 _BidirectionalIterator1 __last1,
3508 _BidirectionalIterator2 __first2,
3509 _BidirectionalIterator2 __last2,
3510 _BidirectionalIterator3 __result,
3511 _Compare __comp)
3513 if (__first1 == __last1)
3514 return std::copy_backward(__first2, __last2, __result);
3515 if (__first2 == __last2)
3516 return std::copy_backward(__first1, __last1, __result);
3517 --__last1;
3518 --__last2;
3519 while (true)
3521 if (__comp(*__last2, *__last1))
3523 *--__result = *__last1;
3524 if (__first1 == __last1)
3525 return std::copy_backward(__first2, ++__last2, __result);
3526 --__last1;
3528 else
3530 *--__result = *__last2;
3531 if (__first2 == __last2)
3532 return std::copy_backward(__first1, ++__last1, __result);
3533 --__last2;
3539 * @if maint
3540 * This is a helper function for the merge routines.
3541 * @endif
3543 template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
3544 typename _Distance>
3545 _BidirectionalIterator1
3546 __rotate_adaptive(_BidirectionalIterator1 __first,
3547 _BidirectionalIterator1 __middle,
3548 _BidirectionalIterator1 __last,
3549 _Distance __len1, _Distance __len2,
3550 _BidirectionalIterator2 __buffer,
3551 _Distance __buffer_size)
3553 _BidirectionalIterator2 __buffer_end;
3554 if (__len1 > __len2 && __len2 <= __buffer_size)
3556 __buffer_end = std::copy(__middle, __last, __buffer);
3557 std::copy_backward(__first, __middle, __last);
3558 return std::copy(__buffer, __buffer_end, __first);
3560 else if (__len1 <= __buffer_size)
3562 __buffer_end = std::copy(__first, __middle, __buffer);
3563 std::copy(__middle, __last, __first);
3564 return std::copy_backward(__buffer, __buffer_end, __last);
3566 else
3568 std::rotate(__first, __middle, __last);
3569 std::advance(__first, std::distance(__middle, __last));
3570 return __first;
3575 * @if maint
3576 * This is a helper function for the merge routines.
3577 * @endif
3579 template<typename _BidirectionalIterator, typename _Distance,
3580 typename _Pointer>
3581 void
3582 __merge_adaptive(_BidirectionalIterator __first,
3583 _BidirectionalIterator __middle,
3584 _BidirectionalIterator __last,
3585 _Distance __len1, _Distance __len2,
3586 _Pointer __buffer, _Distance __buffer_size)
3588 if (__len1 <= __len2 && __len1 <= __buffer_size)
3590 _Pointer __buffer_end = std::copy(__first, __middle, __buffer);
3591 std::merge(__buffer, __buffer_end, __middle, __last, __first);
3593 else if (__len2 <= __buffer_size)
3595 _Pointer __buffer_end = std::copy(__middle, __last, __buffer);
3596 std::__merge_backward(__first, __middle, __buffer,
3597 __buffer_end, __last);
3599 else
3601 _BidirectionalIterator __first_cut = __first;
3602 _BidirectionalIterator __second_cut = __middle;
3603 _Distance __len11 = 0;
3604 _Distance __len22 = 0;
3605 if (__len1 > __len2)
3607 __len11 = __len1 / 2;
3608 std::advance(__first_cut, __len11);
3609 __second_cut = std::lower_bound(__middle, __last,
3610 *__first_cut);
3611 __len22 = std::distance(__middle, __second_cut);
3613 else
3615 __len22 = __len2 / 2;
3616 std::advance(__second_cut, __len22);
3617 __first_cut = std::upper_bound(__first, __middle,
3618 *__second_cut);
3619 __len11 = std::distance(__first, __first_cut);
3621 _BidirectionalIterator __new_middle =
3622 std::__rotate_adaptive(__first_cut, __middle, __second_cut,
3623 __len1 - __len11, __len22, __buffer,
3624 __buffer_size);
3625 std::__merge_adaptive(__first, __first_cut, __new_middle, __len11,
3626 __len22, __buffer, __buffer_size);
3627 std::__merge_adaptive(__new_middle, __second_cut, __last,
3628 __len1 - __len11,
3629 __len2 - __len22, __buffer, __buffer_size);
3634 * @if maint
3635 * This is a helper function for the merge routines.
3636 * @endif
3638 template<typename _BidirectionalIterator, typename _Distance, typename _Pointer,
3639 typename _Compare>
3640 void
3641 __merge_adaptive(_BidirectionalIterator __first,
3642 _BidirectionalIterator __middle,
3643 _BidirectionalIterator __last,
3644 _Distance __len1, _Distance __len2,
3645 _Pointer __buffer, _Distance __buffer_size,
3646 _Compare __comp)
3648 if (__len1 <= __len2 && __len1 <= __buffer_size)
3650 _Pointer __buffer_end = std::copy(__first, __middle, __buffer);
3651 std::merge(__buffer, __buffer_end, __middle, __last, __first, __comp);
3653 else if (__len2 <= __buffer_size)
3655 _Pointer __buffer_end = std::copy(__middle, __last, __buffer);
3656 std::__merge_backward(__first, __middle, __buffer, __buffer_end,
3657 __last, __comp);
3659 else
3661 _BidirectionalIterator __first_cut = __first;
3662 _BidirectionalIterator __second_cut = __middle;
3663 _Distance __len11 = 0;
3664 _Distance __len22 = 0;
3665 if (__len1 > __len2)
3667 __len11 = __len1 / 2;
3668 std::advance(__first_cut, __len11);
3669 __second_cut = std::lower_bound(__middle, __last, *__first_cut,
3670 __comp);
3671 __len22 = std::distance(__middle, __second_cut);
3673 else
3675 __len22 = __len2 / 2;
3676 std::advance(__second_cut, __len22);
3677 __first_cut = std::upper_bound(__first, __middle, *__second_cut,
3678 __comp);
3679 __len11 = std::distance(__first, __first_cut);
3681 _BidirectionalIterator __new_middle =
3682 std::__rotate_adaptive(__first_cut, __middle, __second_cut,
3683 __len1 - __len11, __len22, __buffer,
3684 __buffer_size);
3685 std::__merge_adaptive(__first, __first_cut, __new_middle, __len11,
3686 __len22, __buffer, __buffer_size, __comp);
3687 std::__merge_adaptive(__new_middle, __second_cut, __last,
3688 __len1 - __len11,
3689 __len2 - __len22, __buffer,
3690 __buffer_size, __comp);
3695 * @brief Merges two sorted ranges in place.
3696 * @param first An iterator.
3697 * @param middle Another iterator.
3698 * @param last Another iterator.
3699 * @return Nothing.
3701 * Merges two sorted and consecutive ranges, [first,middle) and
3702 * [middle,last), and puts the result in [first,last). The output will
3703 * be sorted. The sort is @e stable, that is, for equivalent
3704 * elements in the two ranges, elements from the first range will always
3705 * come before elements from the second.
3707 * If enough additional memory is available, this takes (last-first)-1
3708 * comparisons. Otherwise an NlogN algorithm is used, where N is
3709 * distance(first,last).
3711 template<typename _BidirectionalIterator>
3712 void
3713 inplace_merge(_BidirectionalIterator __first,
3714 _BidirectionalIterator __middle,
3715 _BidirectionalIterator __last)
3717 typedef typename iterator_traits<_BidirectionalIterator>::value_type
3718 _ValueType;
3719 typedef typename iterator_traits<_BidirectionalIterator>::difference_type
3720 _DistanceType;
3722 // concept requirements
3723 __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
3724 _BidirectionalIterator>)
3725 __glibcxx_function_requires(_LessThanComparableConcept<_ValueType>)
3726 __glibcxx_requires_sorted(__first, __middle);
3727 __glibcxx_requires_sorted(__middle, __last);
3729 if (__first == __middle || __middle == __last)
3730 return;
3732 _DistanceType __len1 = std::distance(__first, __middle);
3733 _DistanceType __len2 = std::distance(__middle, __last);
3735 _Temporary_buffer<_BidirectionalIterator, _ValueType> __buf(__first,
3736 __last);
3737 if (__buf.begin() == 0)
3738 std::__merge_without_buffer(__first, __middle, __last, __len1, __len2);
3739 else
3740 std::__merge_adaptive(__first, __middle, __last, __len1, __len2,
3741 __buf.begin(), _DistanceType(__buf.size()));
3745 * @brief Merges two sorted ranges in place.
3746 * @param first An iterator.
3747 * @param middle Another iterator.
3748 * @param last Another iterator.
3749 * @param comp A functor to use for comparisons.
3750 * @return Nothing.
3752 * Merges two sorted and consecutive ranges, [first,middle) and
3753 * [middle,last), and puts the result in [first,last). The output will
3754 * be sorted. The sort is @e stable, that is, for equivalent
3755 * elements in the two ranges, elements from the first range will always
3756 * come before elements from the second.
3758 * If enough additional memory is available, this takes (last-first)-1
3759 * comparisons. Otherwise an NlogN algorithm is used, where N is
3760 * distance(first,last).
3762 * The comparison function should have the same effects on ordering as
3763 * the function used for the initial sort.
3765 template<typename _BidirectionalIterator, typename _Compare>
3766 void
3767 inplace_merge(_BidirectionalIterator __first,
3768 _BidirectionalIterator __middle,
3769 _BidirectionalIterator __last,
3770 _Compare __comp)
3772 typedef typename iterator_traits<_BidirectionalIterator>::value_type
3773 _ValueType;
3774 typedef typename iterator_traits<_BidirectionalIterator>::difference_type
3775 _DistanceType;
3777 // concept requirements
3778 __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
3779 _BidirectionalIterator>)
3780 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
3781 _ValueType, _ValueType>)
3782 __glibcxx_requires_sorted_pred(__first, __middle, __comp);
3783 __glibcxx_requires_sorted_pred(__middle, __last, __comp);
3785 if (__first == __middle || __middle == __last)
3786 return;
3788 const _DistanceType __len1 = std::distance(__first, __middle);
3789 const _DistanceType __len2 = std::distance(__middle, __last);
3791 _Temporary_buffer<_BidirectionalIterator, _ValueType> __buf(__first,
3792 __last);
3793 if (__buf.begin() == 0)
3794 std::__merge_without_buffer(__first, __middle, __last, __len1,
3795 __len2, __comp);
3796 else
3797 std::__merge_adaptive(__first, __middle, __last, __len1, __len2,
3798 __buf.begin(), _DistanceType(__buf.size()),
3799 __comp);
3802 template<typename _RandomAccessIterator, typename _Pointer,
3803 typename _Distance>
3804 void
3805 __stable_sort_adaptive(_RandomAccessIterator __first,
3806 _RandomAccessIterator __last,
3807 _Pointer __buffer, _Distance __buffer_size)
3809 const _Distance __len = (__last - __first + 1) / 2;
3810 const _RandomAccessIterator __middle = __first + __len;
3811 if (__len > __buffer_size)
3813 std::__stable_sort_adaptive(__first, __middle,
3814 __buffer, __buffer_size);
3815 std::__stable_sort_adaptive(__middle, __last,
3816 __buffer, __buffer_size);
3818 else
3820 std::__merge_sort_with_buffer(__first, __middle, __buffer);
3821 std::__merge_sort_with_buffer(__middle, __last, __buffer);
3823 std::__merge_adaptive(__first, __middle, __last,
3824 _Distance(__middle - __first),
3825 _Distance(__last - __middle),
3826 __buffer, __buffer_size);
3829 template<typename _RandomAccessIterator, typename _Pointer,
3830 typename _Distance, typename _Compare>
3831 void
3832 __stable_sort_adaptive(_RandomAccessIterator __first,
3833 _RandomAccessIterator __last,
3834 _Pointer __buffer, _Distance __buffer_size,
3835 _Compare __comp)
3837 const _Distance __len = (__last - __first + 1) / 2;
3838 const _RandomAccessIterator __middle = __first + __len;
3839 if (__len > __buffer_size)
3841 std::__stable_sort_adaptive(__first, __middle, __buffer,
3842 __buffer_size, __comp);
3843 std::__stable_sort_adaptive(__middle, __last, __buffer,
3844 __buffer_size, __comp);
3846 else
3848 std::__merge_sort_with_buffer(__first, __middle, __buffer, __comp);
3849 std::__merge_sort_with_buffer(__middle, __last, __buffer, __comp);
3851 std::__merge_adaptive(__first, __middle, __last,
3852 _Distance(__middle - __first),
3853 _Distance(__last - __middle),
3854 __buffer, __buffer_size,
3855 __comp);
3859 * @brief Sort the elements of a sequence, preserving the relative order
3860 * of equivalent elements.
3861 * @param first An iterator.
3862 * @param last Another iterator.
3863 * @return Nothing.
3865 * Sorts the elements in the range @p [first,last) in ascending order,
3866 * such that @p *(i+1)<*i is false for each iterator @p i in the range
3867 * @p [first,last-1).
3869 * The relative ordering of equivalent elements is preserved, so any two
3870 * elements @p x and @p y in the range @p [first,last) such that
3871 * @p x<y is false and @p y<x is false will have the same relative
3872 * ordering after calling @p stable_sort().
3874 template<typename _RandomAccessIterator>
3875 inline void
3876 stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
3878 typedef typename iterator_traits<_RandomAccessIterator>::value_type
3879 _ValueType;
3880 typedef typename iterator_traits<_RandomAccessIterator>::difference_type
3881 _DistanceType;
3883 // concept requirements
3884 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
3885 _RandomAccessIterator>)
3886 __glibcxx_function_requires(_LessThanComparableConcept<_ValueType>)
3887 __glibcxx_requires_valid_range(__first, __last);
3889 _Temporary_buffer<_RandomAccessIterator, _ValueType> __buf(__first,
3890 __last);
3891 if (__buf.begin() == 0)
3892 std::__inplace_stable_sort(__first, __last);
3893 else
3894 std::__stable_sort_adaptive(__first, __last, __buf.begin(),
3895 _DistanceType(__buf.size()));
3899 * @brief Sort the elements of a sequence using a predicate for comparison,
3900 * preserving the relative order of equivalent elements.
3901 * @param first An iterator.
3902 * @param last Another iterator.
3903 * @param comp A comparison functor.
3904 * @return Nothing.
3906 * Sorts the elements in the range @p [first,last) in ascending order,
3907 * such that @p comp(*(i+1),*i) is false for each iterator @p i in the
3908 * range @p [first,last-1).
3910 * The relative ordering of equivalent elements is preserved, so any two
3911 * elements @p x and @p y in the range @p [first,last) such that
3912 * @p comp(x,y) is false and @p comp(y,x) is false will have the same
3913 * relative ordering after calling @p stable_sort().
3915 template<typename _RandomAccessIterator, typename _Compare>
3916 inline void
3917 stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
3918 _Compare __comp)
3920 typedef typename iterator_traits<_RandomAccessIterator>::value_type
3921 _ValueType;
3922 typedef typename iterator_traits<_RandomAccessIterator>::difference_type
3923 _DistanceType;
3925 // concept requirements
3926 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
3927 _RandomAccessIterator>)
3928 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
3929 _ValueType,
3930 _ValueType>)
3931 __glibcxx_requires_valid_range(__first, __last);
3933 _Temporary_buffer<_RandomAccessIterator, _ValueType> __buf(__first,
3934 __last);
3935 if (__buf.begin() == 0)
3936 std::__inplace_stable_sort(__first, __last, __comp);
3937 else
3938 std::__stable_sort_adaptive(__first, __last, __buf.begin(),
3939 _DistanceType(__buf.size()), __comp);
3943 template<typename _RandomAccessIterator, typename _Size>
3944 void
3945 __introselect(_RandomAccessIterator __first, _RandomAccessIterator __nth,
3946 _RandomAccessIterator __last, _Size __depth_limit)
3948 typedef typename iterator_traits<_RandomAccessIterator>::value_type
3949 _ValueType;
3951 while (__last - __first > 3)
3953 if (__depth_limit == 0)
3955 std::__heap_select(__first, __nth + 1, __last);
3956 // Place the nth largest element in its final position.
3957 std::iter_swap(__first, __nth);
3958 return;
3960 --__depth_limit;
3961 _RandomAccessIterator __cut =
3962 std::__unguarded_partition(__first, __last,
3963 _ValueType(std::__median(*__first,
3964 *(__first
3965 + (__last
3966 - __first)
3967 / 2),
3968 *(__last
3969 - 1))));
3970 if (__cut <= __nth)
3971 __first = __cut;
3972 else
3973 __last = __cut;
3975 std::__insertion_sort(__first, __last);
3978 template<typename _RandomAccessIterator, typename _Size, typename _Compare>
3979 void
3980 __introselect(_RandomAccessIterator __first, _RandomAccessIterator __nth,
3981 _RandomAccessIterator __last, _Size __depth_limit,
3982 _Compare __comp)
3984 typedef typename iterator_traits<_RandomAccessIterator>::value_type
3985 _ValueType;
3987 while (__last - __first > 3)
3989 if (__depth_limit == 0)
3991 std::__heap_select(__first, __nth + 1, __last, __comp);
3992 // Place the nth largest element in its final position.
3993 std::iter_swap(__first, __nth);
3994 return;
3996 --__depth_limit;
3997 _RandomAccessIterator __cut =
3998 std::__unguarded_partition(__first, __last,
3999 _ValueType(std::__median(*__first,
4000 *(__first
4001 + (__last
4002 - __first)
4003 / 2),
4004 *(__last - 1),
4005 __comp)),
4006 __comp);
4007 if (__cut <= __nth)
4008 __first = __cut;
4009 else
4010 __last = __cut;
4012 std::__insertion_sort(__first, __last, __comp);
4016 * @brief Sort a sequence just enough to find a particular position.
4017 * @param first An iterator.
4018 * @param nth Another iterator.
4019 * @param last Another iterator.
4020 * @return Nothing.
4022 * Rearranges the elements in the range @p [first,last) so that @p *nth
4023 * is the same element that would have been in that position had the
4024 * whole sequence been sorted.
4025 * whole sequence been sorted. The elements either side of @p *nth are
4026 * not completely sorted, but for any iterator @i in the range
4027 * @p [first,nth) and any iterator @j in the range @p [nth,last) it
4028 * holds that @p *j<*i is false.
4030 template<typename _RandomAccessIterator>
4031 inline void
4032 nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth,
4033 _RandomAccessIterator __last)
4035 typedef typename iterator_traits<_RandomAccessIterator>::value_type
4036 _ValueType;
4038 // concept requirements
4039 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4040 _RandomAccessIterator>)
4041 __glibcxx_function_requires(_LessThanComparableConcept<_ValueType>)
4042 __glibcxx_requires_valid_range(__first, __nth);
4043 __glibcxx_requires_valid_range(__nth, __last);
4045 if (__first == __last || __nth == __last)
4046 return;
4048 std::__introselect(__first, __nth, __last,
4049 std::__lg(__last - __first) * 2);
4053 * @brief Sort a sequence just enough to find a particular position
4054 * using a predicate for comparison.
4055 * @param first An iterator.
4056 * @param nth Another iterator.
4057 * @param last Another iterator.
4058 * @param comp A comparison functor.
4059 * @return Nothing.
4061 * Rearranges the elements in the range @p [first,last) so that @p *nth
4062 * is the same element that would have been in that position had the
4063 * whole sequence been sorted. The elements either side of @p *nth are
4064 * not completely sorted, but for any iterator @i in the range
4065 * @p [first,nth) and any iterator @j in the range @p [nth,last) it
4066 * holds that @p comp(*j,*i) is false.
4068 template<typename _RandomAccessIterator, typename _Compare>
4069 inline void
4070 nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth,
4071 _RandomAccessIterator __last, _Compare __comp)
4073 typedef typename iterator_traits<_RandomAccessIterator>::value_type
4074 _ValueType;
4076 // concept requirements
4077 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4078 _RandomAccessIterator>)
4079 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
4080 _ValueType, _ValueType>)
4081 __glibcxx_requires_valid_range(__first, __nth);
4082 __glibcxx_requires_valid_range(__nth, __last);
4084 if (__first == __last || __nth == __last)
4085 return;
4087 std::__introselect(__first, __nth, __last,
4088 std::__lg(__last - __first) * 2, __comp);
4092 * @brief Finds the largest subrange in which @a val could be inserted
4093 * at any place in it without changing the ordering.
4094 * @param first An iterator.
4095 * @param last Another iterator.
4096 * @param val The search term.
4097 * @return An pair of iterators defining the subrange.
4098 * @ingroup binarysearch
4100 * This is equivalent to
4101 * @code
4102 * std::make_pair(lower_bound(first, last, val),
4103 * upper_bound(first, last, val))
4104 * @endcode
4105 * but does not actually call those functions.
4107 template<typename _ForwardIterator, typename _Tp>
4108 pair<_ForwardIterator, _ForwardIterator>
4109 equal_range(_ForwardIterator __first, _ForwardIterator __last,
4110 const _Tp& __val)
4112 typedef typename iterator_traits<_ForwardIterator>::value_type
4113 _ValueType;
4114 typedef typename iterator_traits<_ForwardIterator>::difference_type
4115 _DistanceType;
4117 // concept requirements
4118 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
4119 __glibcxx_function_requires(_LessThanOpConcept<_ValueType, _Tp>)
4120 __glibcxx_function_requires(_LessThanOpConcept<_Tp, _ValueType>)
4121 __glibcxx_requires_partitioned(__first, __last, __val);
4123 _DistanceType __len = std::distance(__first, __last);
4124 _DistanceType __half;
4125 _ForwardIterator __middle, __left, __right;
4127 while (__len > 0)
4129 __half = __len >> 1;
4130 __middle = __first;
4131 std::advance(__middle, __half);
4132 if (*__middle < __val)
4134 __first = __middle;
4135 ++__first;
4136 __len = __len - __half - 1;
4138 else if (__val < *__middle)
4139 __len = __half;
4140 else
4142 __left = std::lower_bound(__first, __middle, __val);
4143 std::advance(__first, __len);
4144 __right = std::upper_bound(++__middle, __first, __val);
4145 return pair<_ForwardIterator, _ForwardIterator>(__left, __right);
4148 return pair<_ForwardIterator, _ForwardIterator>(__first, __first);
4152 * @brief Finds the largest subrange in which @a val could be inserted
4153 * at any place in it without changing the ordering.
4154 * @param first An iterator.
4155 * @param last Another iterator.
4156 * @param val The search term.
4157 * @param comp A functor to use for comparisons.
4158 * @return An pair of iterators defining the subrange.
4159 * @ingroup binarysearch
4161 * This is equivalent to
4162 * @code
4163 * std::make_pair(lower_bound(first, last, val, comp),
4164 * upper_bound(first, last, val, comp))
4165 * @endcode
4166 * but does not actually call those functions.
4168 template<typename _ForwardIterator, typename _Tp, typename _Compare>
4169 pair<_ForwardIterator, _ForwardIterator>
4170 equal_range(_ForwardIterator __first, _ForwardIterator __last,
4171 const _Tp& __val,
4172 _Compare __comp)
4174 typedef typename iterator_traits<_ForwardIterator>::value_type
4175 _ValueType;
4176 typedef typename iterator_traits<_ForwardIterator>::difference_type
4177 _DistanceType;
4179 // concept requirements
4180 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
4181 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
4182 _ValueType, _Tp>)
4183 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
4184 _Tp, _ValueType>)
4185 __glibcxx_requires_partitioned_pred(__first, __last, __val, __comp);
4187 _DistanceType __len = std::distance(__first, __last);
4188 _DistanceType __half;
4189 _ForwardIterator __middle, __left, __right;
4191 while (__len > 0)
4193 __half = __len >> 1;
4194 __middle = __first;
4195 std::advance(__middle, __half);
4196 if (__comp(*__middle, __val))
4198 __first = __middle;
4199 ++__first;
4200 __len = __len - __half - 1;
4202 else if (__comp(__val, *__middle))
4203 __len = __half;
4204 else
4206 __left = std::lower_bound(__first, __middle, __val, __comp);
4207 std::advance(__first, __len);
4208 __right = std::upper_bound(++__middle, __first, __val, __comp);
4209 return pair<_ForwardIterator, _ForwardIterator>(__left, __right);
4212 return pair<_ForwardIterator, _ForwardIterator>(__first, __first);
4216 * @brief Determines whether an element exists in a range.
4217 * @param first An iterator.
4218 * @param last Another iterator.
4219 * @param val The search term.
4220 * @return True if @a val (or its equivelent) is in [@a first,@a last ].
4221 * @ingroup binarysearch
4223 * Note that this does not actually return an iterator to @a val. For
4224 * that, use std::find or a container's specialized find member functions.
4226 template<typename _ForwardIterator, typename _Tp>
4227 bool
4228 binary_search(_ForwardIterator __first, _ForwardIterator __last,
4229 const _Tp& __val)
4231 typedef typename iterator_traits<_ForwardIterator>::value_type
4232 _ValueType;
4234 // concept requirements
4235 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
4236 __glibcxx_function_requires(_LessThanOpConcept<_Tp, _ValueType>)
4237 __glibcxx_requires_partitioned(__first, __last, __val);
4239 _ForwardIterator __i = std::lower_bound(__first, __last, __val);
4240 return __i != __last && !(__val < *__i);
4244 * @brief Determines whether an element exists in a range.
4245 * @param first An iterator.
4246 * @param last Another iterator.
4247 * @param val The search term.
4248 * @param comp A functor to use for comparisons.
4249 * @return True if @a val (or its equivelent) is in [@a first,@a last ].
4250 * @ingroup binarysearch
4252 * Note that this does not actually return an iterator to @a val. For
4253 * that, use std::find or a container's specialized find member functions.
4255 * The comparison function should have the same effects on ordering as
4256 * the function used for the initial sort.
4258 template<typename _ForwardIterator, typename _Tp, typename _Compare>
4259 bool
4260 binary_search(_ForwardIterator __first, _ForwardIterator __last,
4261 const _Tp& __val, _Compare __comp)
4263 typedef typename iterator_traits<_ForwardIterator>::value_type
4264 _ValueType;
4266 // concept requirements
4267 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
4268 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
4269 _Tp, _ValueType>)
4270 __glibcxx_requires_partitioned_pred(__first, __last, __val, __comp);
4272 _ForwardIterator __i = std::lower_bound(__first, __last, __val, __comp);
4273 return __i != __last && !__comp(__val, *__i);
4276 // Set algorithms: includes, set_union, set_intersection, set_difference,
4277 // set_symmetric_difference. All of these algorithms have the precondition
4278 // that their input ranges are sorted and the postcondition that their output
4279 // ranges are sorted.
4282 * @brief Determines whether all elements of a sequence exists in a range.
4283 * @param first1 Start of search range.
4284 * @param last1 End of search range.
4285 * @param first2 Start of sequence
4286 * @param last2 End of sequence.
4287 * @return True if each element in [first2,last2) is contained in order
4288 * within [first1,last1). False otherwise.
4289 * @ingroup setoperations
4291 * This operation expects both [first1,last1) and [first2,last2) to be
4292 * sorted. Searches for the presence of each element in [first2,last2)
4293 * within [first1,last1). The iterators over each range only move forward,
4294 * so this is a linear algorithm. If an element in [first2,last2) is not
4295 * found before the search iterator reaches @a last2, false is returned.
4297 template<typename _InputIterator1, typename _InputIterator2>
4298 bool
4299 includes(_InputIterator1 __first1, _InputIterator1 __last1,
4300 _InputIterator2 __first2, _InputIterator2 __last2)
4302 typedef typename iterator_traits<_InputIterator1>::value_type
4303 _ValueType1;
4304 typedef typename iterator_traits<_InputIterator2>::value_type
4305 _ValueType2;
4307 // concept requirements
4308 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
4309 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
4310 __glibcxx_function_requires(_LessThanOpConcept<_ValueType1, _ValueType2>)
4311 __glibcxx_function_requires(_LessThanOpConcept<_ValueType2, _ValueType1>)
4312 __glibcxx_requires_sorted(__first1, __last1);
4313 __glibcxx_requires_sorted(__first2, __last2);
4315 while (__first1 != __last1 && __first2 != __last2)
4316 if (*__first2 < *__first1)
4317 return false;
4318 else if(*__first1 < *__first2)
4319 ++__first1;
4320 else
4321 ++__first1, ++__first2;
4323 return __first2 == __last2;
4327 * @brief Determines whether all elements of a sequence exists in a range
4328 * using comparison.
4329 * @param first1 Start of search range.
4330 * @param last1 End of search range.
4331 * @param first2 Start of sequence
4332 * @param last2 End of sequence.
4333 * @param comp Comparison function to use.
4334 * @return True if each element in [first2,last2) is contained in order
4335 * within [first1,last1) according to comp. False otherwise.
4336 * @ingroup setoperations
4338 * This operation expects both [first1,last1) and [first2,last2) to be
4339 * sorted. Searches for the presence of each element in [first2,last2)
4340 * within [first1,last1), using comp to decide. The iterators over each
4341 * range only move forward, so this is a linear algorithm. If an element
4342 * in [first2,last2) is not found before the search iterator reaches @a
4343 * last2, false is returned.
4345 template<typename _InputIterator1, typename _InputIterator2,
4346 typename _Compare>
4347 bool
4348 includes(_InputIterator1 __first1, _InputIterator1 __last1,
4349 _InputIterator2 __first2, _InputIterator2 __last2, _Compare __comp)
4351 typedef typename iterator_traits<_InputIterator1>::value_type
4352 _ValueType1;
4353 typedef typename iterator_traits<_InputIterator2>::value_type
4354 _ValueType2;
4356 // concept requirements
4357 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
4358 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
4359 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
4360 _ValueType1, _ValueType2>)
4361 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
4362 _ValueType2, _ValueType1>)
4363 __glibcxx_requires_sorted_pred(__first1, __last1, __comp);
4364 __glibcxx_requires_sorted_pred(__first2, __last2, __comp);
4366 while (__first1 != __last1 && __first2 != __last2)
4367 if (__comp(*__first2, *__first1))
4368 return false;
4369 else if(__comp(*__first1, *__first2))
4370 ++__first1;
4371 else
4372 ++__first1, ++__first2;
4374 return __first2 == __last2;
4378 * @brief Return the union of two sorted ranges.
4379 * @param first1 Start of first range.
4380 * @param last1 End of first range.
4381 * @param first2 Start of second range.
4382 * @param last2 End of second range.
4383 * @return End of the output range.
4384 * @ingroup setoperations
4386 * This operation iterates over both ranges, copying elements present in
4387 * each range in order to the output range. Iterators increment for each
4388 * range. When the current element of one range is less than the other,
4389 * that element is copied and the iterator advanced. If an element is
4390 * contained in both ranges, the element from the first range is copied and
4391 * both ranges advance. The output range may not overlap either input
4392 * range.
4394 template<typename _InputIterator1, typename _InputIterator2,
4395 typename _OutputIterator>
4396 _OutputIterator
4397 set_union(_InputIterator1 __first1, _InputIterator1 __last1,
4398 _InputIterator2 __first2, _InputIterator2 __last2,
4399 _OutputIterator __result)
4401 typedef typename iterator_traits<_InputIterator1>::value_type
4402 _ValueType1;
4403 typedef typename iterator_traits<_InputIterator2>::value_type
4404 _ValueType2;
4406 // concept requirements
4407 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
4408 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
4409 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4410 _ValueType1>)
4411 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4412 _ValueType2>)
4413 __glibcxx_function_requires(_LessThanOpConcept<_ValueType1, _ValueType2>)
4414 __glibcxx_function_requires(_LessThanOpConcept<_ValueType2, _ValueType1>)
4415 __glibcxx_requires_sorted(__first1, __last1);
4416 __glibcxx_requires_sorted(__first2, __last2);
4418 while (__first1 != __last1 && __first2 != __last2)
4420 if (*__first1 < *__first2)
4422 *__result = *__first1;
4423 ++__first1;
4425 else if (*__first2 < *__first1)
4427 *__result = *__first2;
4428 ++__first2;
4430 else
4432 *__result = *__first1;
4433 ++__first1;
4434 ++__first2;
4436 ++__result;
4438 return std::copy(__first2, __last2, std::copy(__first1, __last1,
4439 __result));
4443 * @brief Return the union of two sorted ranges using a comparison functor.
4444 * @param first1 Start of first range.
4445 * @param last1 End of first range.
4446 * @param first2 Start of second range.
4447 * @param last2 End of second range.
4448 * @param comp The comparison functor.
4449 * @return End of the output range.
4450 * @ingroup setoperations
4452 * This operation iterates over both ranges, copying elements present in
4453 * each range in order to the output range. Iterators increment for each
4454 * range. When the current element of one range is less than the other
4455 * according to @a comp, that element is copied and the iterator advanced.
4456 * If an equivalent element according to @a comp is contained in both
4457 * ranges, the element from the first range is copied and both ranges
4458 * advance. The output range may not overlap either input range.
4460 template<typename _InputIterator1, typename _InputIterator2,
4461 typename _OutputIterator, typename _Compare>
4462 _OutputIterator
4463 set_union(_InputIterator1 __first1, _InputIterator1 __last1,
4464 _InputIterator2 __first2, _InputIterator2 __last2,
4465 _OutputIterator __result, _Compare __comp)
4467 typedef typename iterator_traits<_InputIterator1>::value_type
4468 _ValueType1;
4469 typedef typename iterator_traits<_InputIterator2>::value_type
4470 _ValueType2;
4472 // concept requirements
4473 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
4474 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
4475 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4476 _ValueType1>)
4477 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4478 _ValueType2>)
4479 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
4480 _ValueType1, _ValueType2>)
4481 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
4482 _ValueType2, _ValueType1>)
4483 __glibcxx_requires_sorted_pred(__first1, __last1, __comp);
4484 __glibcxx_requires_sorted_pred(__first2, __last2, __comp);
4486 while (__first1 != __last1 && __first2 != __last2)
4488 if (__comp(*__first1, *__first2))
4490 *__result = *__first1;
4491 ++__first1;
4493 else if (__comp(*__first2, *__first1))
4495 *__result = *__first2;
4496 ++__first2;
4498 else
4500 *__result = *__first1;
4501 ++__first1;
4502 ++__first2;
4504 ++__result;
4506 return std::copy(__first2, __last2, std::copy(__first1, __last1,
4507 __result));
4511 * @brief Return the intersection of two sorted ranges.
4512 * @param first1 Start of first range.
4513 * @param last1 End of first range.
4514 * @param first2 Start of second range.
4515 * @param last2 End of second range.
4516 * @return End of the output range.
4517 * @ingroup setoperations
4519 * This operation iterates over both ranges, copying elements present in
4520 * both ranges in order to the output range. Iterators increment for each
4521 * range. When the current element of one range is less than the other,
4522 * that iterator advances. If an element is contained in both ranges, the
4523 * element from the first range is copied and both ranges advance. The
4524 * output range may not overlap either input range.
4526 template<typename _InputIterator1, typename _InputIterator2,
4527 typename _OutputIterator>
4528 _OutputIterator
4529 set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
4530 _InputIterator2 __first2, _InputIterator2 __last2,
4531 _OutputIterator __result)
4533 typedef typename iterator_traits<_InputIterator1>::value_type
4534 _ValueType1;
4535 typedef typename iterator_traits<_InputIterator2>::value_type
4536 _ValueType2;
4538 // concept requirements
4539 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
4540 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
4541 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4542 _ValueType1>)
4543 __glibcxx_function_requires(_LessThanOpConcept<_ValueType1, _ValueType2>)
4544 __glibcxx_function_requires(_LessThanOpConcept<_ValueType2, _ValueType1>)
4545 __glibcxx_requires_sorted(__first1, __last1);
4546 __glibcxx_requires_sorted(__first2, __last2);
4548 while (__first1 != __last1 && __first2 != __last2)
4549 if (*__first1 < *__first2)
4550 ++__first1;
4551 else if (*__first2 < *__first1)
4552 ++__first2;
4553 else
4555 *__result = *__first1;
4556 ++__first1;
4557 ++__first2;
4558 ++__result;
4560 return __result;
4564 * @brief Return the intersection of two sorted ranges using comparison
4565 * functor.
4566 * @param first1 Start of first range.
4567 * @param last1 End of first range.
4568 * @param first2 Start of second range.
4569 * @param last2 End of second range.
4570 * @param comp The comparison functor.
4571 * @return End of the output range.
4572 * @ingroup setoperations
4574 * This operation iterates over both ranges, copying elements present in
4575 * both ranges in order to the output range. Iterators increment for each
4576 * range. When the current element of one range is less than the other
4577 * according to @a comp, that iterator advances. If an element is
4578 * contained in both ranges according to @a comp, the element from the
4579 * first range is copied and both ranges advance. The output range may not
4580 * overlap either input range.
4582 template<typename _InputIterator1, typename _InputIterator2,
4583 typename _OutputIterator, typename _Compare>
4584 _OutputIterator
4585 set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
4586 _InputIterator2 __first2, _InputIterator2 __last2,
4587 _OutputIterator __result, _Compare __comp)
4589 typedef typename iterator_traits<_InputIterator1>::value_type
4590 _ValueType1;
4591 typedef typename iterator_traits<_InputIterator2>::value_type
4592 _ValueType2;
4594 // concept requirements
4595 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
4596 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
4597 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4598 _ValueType1>)
4599 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
4600 _ValueType1, _ValueType2>)
4601 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
4602 _ValueType2, _ValueType1>)
4603 __glibcxx_requires_sorted_pred(__first1, __last1, __comp);
4604 __glibcxx_requires_sorted_pred(__first2, __last2, __comp);
4606 while (__first1 != __last1 && __first2 != __last2)
4607 if (__comp(*__first1, *__first2))
4608 ++__first1;
4609 else if (__comp(*__first2, *__first1))
4610 ++__first2;
4611 else
4613 *__result = *__first1;
4614 ++__first1;
4615 ++__first2;
4616 ++__result;
4618 return __result;
4622 * @brief Return the difference of two sorted ranges.
4623 * @param first1 Start of first range.
4624 * @param last1 End of first range.
4625 * @param first2 Start of second range.
4626 * @param last2 End of second range.
4627 * @return End of the output range.
4628 * @ingroup setoperations
4630 * This operation iterates over both ranges, copying elements present in
4631 * the first range but not the second in order to the output range.
4632 * Iterators increment for each range. When the current element of the
4633 * first range is less than the second, that element is copied and the
4634 * iterator advances. If the current element of the second range is less,
4635 * the iterator advances, but no element is copied. If an element is
4636 * contained in both ranges, no elements are copied and both ranges
4637 * advance. The output range may not overlap either input range.
4639 template<typename _InputIterator1, typename _InputIterator2,
4640 typename _OutputIterator>
4641 _OutputIterator
4642 set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
4643 _InputIterator2 __first2, _InputIterator2 __last2,
4644 _OutputIterator __result)
4646 typedef typename iterator_traits<_InputIterator1>::value_type
4647 _ValueType1;
4648 typedef typename iterator_traits<_InputIterator2>::value_type
4649 _ValueType2;
4651 // concept requirements
4652 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
4653 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
4654 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4655 _ValueType1>)
4656 __glibcxx_function_requires(_LessThanOpConcept<_ValueType1, _ValueType2>)
4657 __glibcxx_function_requires(_LessThanOpConcept<_ValueType2, _ValueType1>)
4658 __glibcxx_requires_sorted(__first1, __last1);
4659 __glibcxx_requires_sorted(__first2, __last2);
4661 while (__first1 != __last1 && __first2 != __last2)
4662 if (*__first1 < *__first2)
4664 *__result = *__first1;
4665 ++__first1;
4666 ++__result;
4668 else if (*__first2 < *__first1)
4669 ++__first2;
4670 else
4672 ++__first1;
4673 ++__first2;
4675 return std::copy(__first1, __last1, __result);
4679 * @brief Return the difference of two sorted ranges using comparison
4680 * functor.
4681 * @param first1 Start of first range.
4682 * @param last1 End of first range.
4683 * @param first2 Start of second range.
4684 * @param last2 End of second range.
4685 * @param comp The comparison functor.
4686 * @return End of the output range.
4687 * @ingroup setoperations
4689 * This operation iterates over both ranges, copying elements present in
4690 * the first range but not the second in order to the output range.
4691 * Iterators increment for each range. When the current element of the
4692 * first range is less than the second according to @a comp, that element
4693 * is copied and the iterator advances. If the current element of the
4694 * second range is less, no element is copied and the iterator advances.
4695 * If an element is contained in both ranges according to @a comp, no
4696 * elements are copied and both ranges advance. The output range may not
4697 * overlap either input range.
4699 template<typename _InputIterator1, typename _InputIterator2,
4700 typename _OutputIterator, typename _Compare>
4701 _OutputIterator
4702 set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
4703 _InputIterator2 __first2, _InputIterator2 __last2,
4704 _OutputIterator __result, _Compare __comp)
4706 typedef typename iterator_traits<_InputIterator1>::value_type
4707 _ValueType1;
4708 typedef typename iterator_traits<_InputIterator2>::value_type
4709 _ValueType2;
4711 // concept requirements
4712 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
4713 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
4714 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4715 _ValueType1>)
4716 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
4717 _ValueType1, _ValueType2>)
4718 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
4719 _ValueType2, _ValueType1>)
4720 __glibcxx_requires_sorted_pred(__first1, __last1, __comp);
4721 __glibcxx_requires_sorted_pred(__first2, __last2, __comp);
4723 while (__first1 != __last1 && __first2 != __last2)
4724 if (__comp(*__first1, *__first2))
4726 *__result = *__first1;
4727 ++__first1;
4728 ++__result;
4730 else if (__comp(*__first2, *__first1))
4731 ++__first2;
4732 else
4734 ++__first1;
4735 ++__first2;
4737 return std::copy(__first1, __last1, __result);
4741 * @brief Return the symmetric difference of two sorted ranges.
4742 * @param first1 Start of first range.
4743 * @param last1 End of first range.
4744 * @param first2 Start of second range.
4745 * @param last2 End of second range.
4746 * @return End of the output range.
4747 * @ingroup setoperations
4749 * This operation iterates over both ranges, copying elements present in
4750 * one range but not the other in order to the output range. Iterators
4751 * increment for each range. When the current element of one range is less
4752 * than the other, that element is copied and the iterator advances. If an
4753 * element is contained in both ranges, no elements are copied and both
4754 * ranges advance. The output range may not overlap either input range.
4756 template<typename _InputIterator1, typename _InputIterator2,
4757 typename _OutputIterator>
4758 _OutputIterator
4759 set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
4760 _InputIterator2 __first2, _InputIterator2 __last2,
4761 _OutputIterator __result)
4763 typedef typename iterator_traits<_InputIterator1>::value_type
4764 _ValueType1;
4765 typedef typename iterator_traits<_InputIterator2>::value_type
4766 _ValueType2;
4768 // concept requirements
4769 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
4770 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
4771 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4772 _ValueType1>)
4773 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4774 _ValueType2>)
4775 __glibcxx_function_requires(_LessThanOpConcept<_ValueType1, _ValueType2>)
4776 __glibcxx_function_requires(_LessThanOpConcept<_ValueType2, _ValueType1>)
4777 __glibcxx_requires_sorted(__first1, __last1);
4778 __glibcxx_requires_sorted(__first2, __last2);
4780 while (__first1 != __last1 && __first2 != __last2)
4781 if (*__first1 < *__first2)
4783 *__result = *__first1;
4784 ++__first1;
4785 ++__result;
4787 else if (*__first2 < *__first1)
4789 *__result = *__first2;
4790 ++__first2;
4791 ++__result;
4793 else
4795 ++__first1;
4796 ++__first2;
4798 return std::copy(__first2, __last2, std::copy(__first1,
4799 __last1, __result));
4803 * @brief Return the symmetric difference of two sorted ranges using
4804 * comparison functor.
4805 * @param first1 Start of first range.
4806 * @param last1 End of first range.
4807 * @param first2 Start of second range.
4808 * @param last2 End of second range.
4809 * @param comp The comparison functor.
4810 * @return End of the output range.
4811 * @ingroup setoperations
4813 * This operation iterates over both ranges, copying elements present in
4814 * one range but not the other in order to the output range. Iterators
4815 * increment for each range. When the current element of one range is less
4816 * than the other according to @a comp, that element is copied and the
4817 * iterator advances. If an element is contained in both ranges according
4818 * to @a comp, no elements are copied and both ranges advance. The output
4819 * range may not overlap either input range.
4821 template<typename _InputIterator1, typename _InputIterator2,
4822 typename _OutputIterator, typename _Compare>
4823 _OutputIterator
4824 set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
4825 _InputIterator2 __first2, _InputIterator2 __last2,
4826 _OutputIterator __result,
4827 _Compare __comp)
4829 typedef typename iterator_traits<_InputIterator1>::value_type
4830 _ValueType1;
4831 typedef typename iterator_traits<_InputIterator2>::value_type
4832 _ValueType2;
4834 // concept requirements
4835 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
4836 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
4837 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4838 _ValueType1>)
4839 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4840 _ValueType2>)
4841 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
4842 _ValueType1, _ValueType2>)
4843 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
4844 _ValueType2, _ValueType1>)
4845 __glibcxx_requires_sorted_pred(__first1, __last1, __comp);
4846 __glibcxx_requires_sorted_pred(__first2, __last2, __comp);
4848 while (__first1 != __last1 && __first2 != __last2)
4849 if (__comp(*__first1, *__first2))
4851 *__result = *__first1;
4852 ++__first1;
4853 ++__result;
4855 else if (__comp(*__first2, *__first1))
4857 *__result = *__first2;
4858 ++__first2;
4859 ++__result;
4861 else
4863 ++__first1;
4864 ++__first2;
4866 return std::copy(__first2, __last2, std::copy(__first1,
4867 __last1, __result));
4870 // min_element and max_element, with and without an explicitly supplied
4871 // comparison function.
4874 * @brief Return the maximum element in a range.
4875 * @param first Start of range.
4876 * @param last End of range.
4877 * @return Iterator referencing the first instance of the largest value.
4879 template<typename _ForwardIterator>
4880 _ForwardIterator
4881 max_element(_ForwardIterator __first, _ForwardIterator __last)
4883 // concept requirements
4884 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
4885 __glibcxx_function_requires(_LessThanComparableConcept<
4886 typename iterator_traits<_ForwardIterator>::value_type>)
4887 __glibcxx_requires_valid_range(__first, __last);
4889 if (__first == __last)
4890 return __first;
4891 _ForwardIterator __result = __first;
4892 while (++__first != __last)
4893 if (*__result < *__first)
4894 __result = __first;
4895 return __result;
4899 * @brief Return the maximum element in a range using comparison functor.
4900 * @param first Start of range.
4901 * @param last End of range.
4902 * @param comp Comparison functor.
4903 * @return Iterator referencing the first instance of the largest value
4904 * according to comp.
4906 template<typename _ForwardIterator, typename _Compare>
4907 _ForwardIterator
4908 max_element(_ForwardIterator __first, _ForwardIterator __last,
4909 _Compare __comp)
4911 // concept requirements
4912 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
4913 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
4914 typename iterator_traits<_ForwardIterator>::value_type,
4915 typename iterator_traits<_ForwardIterator>::value_type>)
4916 __glibcxx_requires_valid_range(__first, __last);
4918 if (__first == __last) return __first;
4919 _ForwardIterator __result = __first;
4920 while (++__first != __last)
4921 if (__comp(*__result, *__first)) __result = __first;
4922 return __result;
4926 * @brief Return the minimum element in a range.
4927 * @param first Start of range.
4928 * @param last End of range.
4929 * @return Iterator referencing the first instance of the smallest value.
4931 template<typename _ForwardIterator>
4932 _ForwardIterator
4933 min_element(_ForwardIterator __first, _ForwardIterator __last)
4935 // concept requirements
4936 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
4937 __glibcxx_function_requires(_LessThanComparableConcept<
4938 typename iterator_traits<_ForwardIterator>::value_type>)
4939 __glibcxx_requires_valid_range(__first, __last);
4941 if (__first == __last)
4942 return __first;
4943 _ForwardIterator __result = __first;
4944 while (++__first != __last)
4945 if (*__first < *__result)
4946 __result = __first;
4947 return __result;
4951 * @brief Return the minimum element in a range using comparison functor.
4952 * @param first Start of range.
4953 * @param last End of range.
4954 * @param comp Comparison functor.
4955 * @return Iterator referencing the first instance of the smallest value
4956 * according to comp.
4958 template<typename _ForwardIterator, typename _Compare>
4959 _ForwardIterator
4960 min_element(_ForwardIterator __first, _ForwardIterator __last,
4961 _Compare __comp)
4963 // concept requirements
4964 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
4965 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
4966 typename iterator_traits<_ForwardIterator>::value_type,
4967 typename iterator_traits<_ForwardIterator>::value_type>)
4968 __glibcxx_requires_valid_range(__first, __last);
4970 if (__first == __last)
4971 return __first;
4972 _ForwardIterator __result = __first;
4973 while (++__first != __last)
4974 if (__comp(*__first, *__result))
4975 __result = __first;
4976 return __result;
4979 // next_permutation and prev_permutation, with and without an explicitly
4980 // supplied comparison function.
4983 * @brief Permute range into the next "dictionary" ordering.
4984 * @param first Start of range.
4985 * @param last End of range.
4986 * @return False if wrapped to first permutation, true otherwise.
4988 * Treats all permutations of the range as a set of "dictionary" sorted
4989 * sequences. Permutes the current sequence into the next one of this set.
4990 * Returns true if there are more sequences to generate. If the sequence
4991 * is the largest of the set, the smallest is generated and false returned.
4993 template<typename _BidirectionalIterator>
4994 bool
4995 next_permutation(_BidirectionalIterator __first,
4996 _BidirectionalIterator __last)
4998 // concept requirements
4999 __glibcxx_function_requires(_BidirectionalIteratorConcept<
5000 _BidirectionalIterator>)
5001 __glibcxx_function_requires(_LessThanComparableConcept<
5002 typename iterator_traits<_BidirectionalIterator>::value_type>)
5003 __glibcxx_requires_valid_range(__first, __last);
5005 if (__first == __last)
5006 return false;
5007 _BidirectionalIterator __i = __first;
5008 ++__i;
5009 if (__i == __last)
5010 return false;
5011 __i = __last;
5012 --__i;
5014 for(;;)
5016 _BidirectionalIterator __ii = __i;
5017 --__i;
5018 if (*__i < *__ii)
5020 _BidirectionalIterator __j = __last;
5021 while (!(*__i < *--__j))
5023 std::iter_swap(__i, __j);
5024 std::reverse(__ii, __last);
5025 return true;
5027 if (__i == __first)
5029 std::reverse(__first, __last);
5030 return false;
5036 * @brief Permute range into the next "dictionary" ordering using
5037 * comparison functor.
5038 * @param first Start of range.
5039 * @param last End of range.
5040 * @param comp
5041 * @return False if wrapped to first permutation, true otherwise.
5043 * Treats all permutations of the range [first,last) as a set of
5044 * "dictionary" sorted sequences ordered by @a comp. Permutes the current
5045 * sequence into the next one of this set. Returns true if there are more
5046 * sequences to generate. If the sequence is the largest of the set, the
5047 * smallest is generated and false returned.
5049 template<typename _BidirectionalIterator, typename _Compare>
5050 bool
5051 next_permutation(_BidirectionalIterator __first,
5052 _BidirectionalIterator __last, _Compare __comp)
5054 // concept requirements
5055 __glibcxx_function_requires(_BidirectionalIteratorConcept<
5056 _BidirectionalIterator>)
5057 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5058 typename iterator_traits<_BidirectionalIterator>::value_type,
5059 typename iterator_traits<_BidirectionalIterator>::value_type>)
5060 __glibcxx_requires_valid_range(__first, __last);
5062 if (__first == __last)
5063 return false;
5064 _BidirectionalIterator __i = __first;
5065 ++__i;
5066 if (__i == __last)
5067 return false;
5068 __i = __last;
5069 --__i;
5071 for(;;)
5073 _BidirectionalIterator __ii = __i;
5074 --__i;
5075 if (__comp(*__i, *__ii))
5077 _BidirectionalIterator __j = __last;
5078 while (!__comp(*__i, *--__j))
5080 std::iter_swap(__i, __j);
5081 std::reverse(__ii, __last);
5082 return true;
5084 if (__i == __first)
5086 std::reverse(__first, __last);
5087 return false;
5093 * @brief Permute range into the previous "dictionary" ordering.
5094 * @param first Start of range.
5095 * @param last End of range.
5096 * @return False if wrapped to last permutation, true otherwise.
5098 * Treats all permutations of the range as a set of "dictionary" sorted
5099 * sequences. Permutes the current sequence into the previous one of this
5100 * set. Returns true if there are more sequences to generate. If the
5101 * sequence is the smallest of the set, the largest is generated and false
5102 * returned.
5104 template<typename _BidirectionalIterator>
5105 bool
5106 prev_permutation(_BidirectionalIterator __first,
5107 _BidirectionalIterator __last)
5109 // concept requirements
5110 __glibcxx_function_requires(_BidirectionalIteratorConcept<
5111 _BidirectionalIterator>)
5112 __glibcxx_function_requires(_LessThanComparableConcept<
5113 typename iterator_traits<_BidirectionalIterator>::value_type>)
5114 __glibcxx_requires_valid_range(__first, __last);
5116 if (__first == __last)
5117 return false;
5118 _BidirectionalIterator __i = __first;
5119 ++__i;
5120 if (__i == __last)
5121 return false;
5122 __i = __last;
5123 --__i;
5125 for(;;)
5127 _BidirectionalIterator __ii = __i;
5128 --__i;
5129 if (*__ii < *__i)
5131 _BidirectionalIterator __j = __last;
5132 while (!(*--__j < *__i))
5134 std::iter_swap(__i, __j);
5135 std::reverse(__ii, __last);
5136 return true;
5138 if (__i == __first)
5140 std::reverse(__first, __last);
5141 return false;
5147 * @brief Permute range into the previous "dictionary" ordering using
5148 * comparison functor.
5149 * @param first Start of range.
5150 * @param last End of range.
5151 * @param comp
5152 * @return False if wrapped to last permutation, true otherwise.
5154 * Treats all permutations of the range [first,last) as a set of
5155 * "dictionary" sorted sequences ordered by @a comp. Permutes the current
5156 * sequence into the previous one of this set. Returns true if there are
5157 * more sequences to generate. If the sequence is the smallest of the set,
5158 * the largest is generated and false returned.
5160 template<typename _BidirectionalIterator, typename _Compare>
5161 bool
5162 prev_permutation(_BidirectionalIterator __first,
5163 _BidirectionalIterator __last, _Compare __comp)
5165 // concept requirements
5166 __glibcxx_function_requires(_BidirectionalIteratorConcept<
5167 _BidirectionalIterator>)
5168 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5169 typename iterator_traits<_BidirectionalIterator>::value_type,
5170 typename iterator_traits<_BidirectionalIterator>::value_type>)
5171 __glibcxx_requires_valid_range(__first, __last);
5173 if (__first == __last)
5174 return false;
5175 _BidirectionalIterator __i = __first;
5176 ++__i;
5177 if (__i == __last)
5178 return false;
5179 __i = __last;
5180 --__i;
5182 for(;;)
5184 _BidirectionalIterator __ii = __i;
5185 --__i;
5186 if (__comp(*__ii, *__i))
5188 _BidirectionalIterator __j = __last;
5189 while (!__comp(*--__j, *__i))
5191 std::iter_swap(__i, __j);
5192 std::reverse(__ii, __last);
5193 return true;
5195 if (__i == __first)
5197 std::reverse(__first, __last);
5198 return false;
5203 // find_first_of, with and without an explicitly supplied comparison function.
5206 * @brief Find element from a set in a sequence.
5207 * @param first1 Start of range to search.
5208 * @param last1 End of range to search.
5209 * @param first2 Start of match candidates.
5210 * @param last2 End of match candidates.
5211 * @return The first iterator @c i in the range
5212 * @p [first1,last1) such that @c *i == @p *(i2) such that i2 is an
5213 * interator in [first2,last2), or @p last1 if no such iterator exists.
5215 * Searches the range @p [first1,last1) for an element that is equal to
5216 * some element in the range [first2,last2). If found, returns an iterator
5217 * in the range [first1,last1), otherwise returns @p last1.
5219 template<typename _InputIterator, typename _ForwardIterator>
5220 _InputIterator
5221 find_first_of(_InputIterator __first1, _InputIterator __last1,
5222 _ForwardIterator __first2, _ForwardIterator __last2)
5224 // concept requirements
5225 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
5226 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
5227 __glibcxx_function_requires(_EqualOpConcept<
5228 typename iterator_traits<_InputIterator>::value_type,
5229 typename iterator_traits<_ForwardIterator>::value_type>)
5230 __glibcxx_requires_valid_range(__first1, __last1);
5231 __glibcxx_requires_valid_range(__first2, __last2);
5233 for ( ; __first1 != __last1; ++__first1)
5234 for (_ForwardIterator __iter = __first2; __iter != __last2; ++__iter)
5235 if (*__first1 == *__iter)
5236 return __first1;
5237 return __last1;
5241 * @brief Find element from a set in a sequence using a predicate.
5242 * @param first1 Start of range to search.
5243 * @param last1 End of range to search.
5244 * @param first2 Start of match candidates.
5245 * @param last2 End of match candidates.
5246 * @param comp Predicate to use.
5247 * @return The first iterator @c i in the range
5248 * @p [first1,last1) such that @c comp(*i, @p *(i2)) is true and i2 is an
5249 * interator in [first2,last2), or @p last1 if no such iterator exists.
5251 * Searches the range @p [first1,last1) for an element that is equal to
5252 * some element in the range [first2,last2). If found, returns an iterator in
5253 * the range [first1,last1), otherwise returns @p last1.
5255 template<typename _InputIterator, typename _ForwardIterator,
5256 typename _BinaryPredicate>
5257 _InputIterator
5258 find_first_of(_InputIterator __first1, _InputIterator __last1,
5259 _ForwardIterator __first2, _ForwardIterator __last2,
5260 _BinaryPredicate __comp)
5262 // concept requirements
5263 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
5264 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
5265 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
5266 typename iterator_traits<_InputIterator>::value_type,
5267 typename iterator_traits<_ForwardIterator>::value_type>)
5268 __glibcxx_requires_valid_range(__first1, __last1);
5269 __glibcxx_requires_valid_range(__first2, __last2);
5271 for ( ; __first1 != __last1; ++__first1)
5272 for (_ForwardIterator __iter = __first2; __iter != __last2; ++__iter)
5273 if (__comp(*__first1, *__iter))
5274 return __first1;
5275 return __last1;
5279 // find_end, with and without an explicitly supplied comparison function.
5280 // Search [first2, last2) as a subsequence in [first1, last1), and return
5281 // the *last* possible match. Note that find_end for bidirectional iterators
5282 // is much faster than for forward iterators.
5284 // find_end for forward iterators.
5285 template<typename _ForwardIterator1, typename _ForwardIterator2>
5286 _ForwardIterator1
5287 __find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
5288 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
5289 forward_iterator_tag, forward_iterator_tag)
5291 if (__first2 == __last2)
5292 return __last1;
5293 else
5295 _ForwardIterator1 __result = __last1;
5296 while (1)
5298 _ForwardIterator1 __new_result
5299 = std::search(__first1, __last1, __first2, __last2);
5300 if (__new_result == __last1)
5301 return __result;
5302 else
5304 __result = __new_result;
5305 __first1 = __new_result;
5306 ++__first1;
5312 template<typename _ForwardIterator1, typename _ForwardIterator2,
5313 typename _BinaryPredicate>
5314 _ForwardIterator1
5315 __find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
5316 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
5317 forward_iterator_tag, forward_iterator_tag,
5318 _BinaryPredicate __comp)
5320 if (__first2 == __last2)
5321 return __last1;
5322 else
5324 _ForwardIterator1 __result = __last1;
5325 while (1)
5327 _ForwardIterator1 __new_result
5328 = std::search(__first1, __last1, __first2, __last2, __comp);
5329 if (__new_result == __last1)
5330 return __result;
5331 else
5333 __result = __new_result;
5334 __first1 = __new_result;
5335 ++__first1;
5341 // find_end for bidirectional iterators. Requires partial specialization.
5342 template<typename _BidirectionalIterator1, typename _BidirectionalIterator2>
5343 _BidirectionalIterator1
5344 __find_end(_BidirectionalIterator1 __first1,
5345 _BidirectionalIterator1 __last1,
5346 _BidirectionalIterator2 __first2,
5347 _BidirectionalIterator2 __last2,
5348 bidirectional_iterator_tag, bidirectional_iterator_tag)
5350 // concept requirements
5351 __glibcxx_function_requires(_BidirectionalIteratorConcept<
5352 _BidirectionalIterator1>)
5353 __glibcxx_function_requires(_BidirectionalIteratorConcept<
5354 _BidirectionalIterator2>)
5356 typedef reverse_iterator<_BidirectionalIterator1> _RevIterator1;
5357 typedef reverse_iterator<_BidirectionalIterator2> _RevIterator2;
5359 _RevIterator1 __rlast1(__first1);
5360 _RevIterator2 __rlast2(__first2);
5361 _RevIterator1 __rresult = std::search(_RevIterator1(__last1), __rlast1,
5362 _RevIterator2(__last2), __rlast2);
5364 if (__rresult == __rlast1)
5365 return __last1;
5366 else
5368 _BidirectionalIterator1 __result = __rresult.base();
5369 std::advance(__result, -std::distance(__first2, __last2));
5370 return __result;
5374 template<typename _BidirectionalIterator1, typename _BidirectionalIterator2,
5375 typename _BinaryPredicate>
5376 _BidirectionalIterator1
5377 __find_end(_BidirectionalIterator1 __first1,
5378 _BidirectionalIterator1 __last1,
5379 _BidirectionalIterator2 __first2,
5380 _BidirectionalIterator2 __last2,
5381 bidirectional_iterator_tag, bidirectional_iterator_tag,
5382 _BinaryPredicate __comp)
5384 // concept requirements
5385 __glibcxx_function_requires(_BidirectionalIteratorConcept<
5386 _BidirectionalIterator1>)
5387 __glibcxx_function_requires(_BidirectionalIteratorConcept<
5388 _BidirectionalIterator2>)
5390 typedef reverse_iterator<_BidirectionalIterator1> _RevIterator1;
5391 typedef reverse_iterator<_BidirectionalIterator2> _RevIterator2;
5393 _RevIterator1 __rlast1(__first1);
5394 _RevIterator2 __rlast2(__first2);
5395 _RevIterator1 __rresult = std::search(_RevIterator1(__last1), __rlast1,
5396 _RevIterator2(__last2), __rlast2,
5397 __comp);
5399 if (__rresult == __rlast1)
5400 return __last1;
5401 else
5403 _BidirectionalIterator1 __result = __rresult.base();
5404 std::advance(__result, -std::distance(__first2, __last2));
5405 return __result;
5409 // Dispatching functions for find_end.
5412 * @brief Find last matching subsequence in a sequence.
5413 * @param first1 Start of range to search.
5414 * @param last1 End of range to search.
5415 * @param first2 Start of sequence to match.
5416 * @param last2 End of sequence to match.
5417 * @return The last iterator @c i in the range
5418 * @p [first1,last1-(last2-first2)) such that @c *(i+N) == @p *(first2+N)
5419 * for each @c N in the range @p [0,last2-first2), or @p last1 if no
5420 * such iterator exists.
5422 * Searches the range @p [first1,last1) for a sub-sequence that compares
5423 * equal value-by-value with the sequence given by @p [first2,last2) and
5424 * returns an iterator to the first element of the sub-sequence, or
5425 * @p last1 if the sub-sequence is not found. The sub-sequence will be the
5426 * last such subsequence contained in [first,last1).
5428 * Because the sub-sequence must lie completely within the range
5429 * @p [first1,last1) it must start at a position less than
5430 * @p last1-(last2-first2) where @p last2-first2 is the length of the
5431 * sub-sequence.
5432 * This means that the returned iterator @c i will be in the range
5433 * @p [first1,last1-(last2-first2))
5435 template<typename _ForwardIterator1, typename _ForwardIterator2>
5436 inline _ForwardIterator1
5437 find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
5438 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
5440 // concept requirements
5441 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
5442 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
5443 __glibcxx_function_requires(_EqualOpConcept<
5444 typename iterator_traits<_ForwardIterator1>::value_type,
5445 typename iterator_traits<_ForwardIterator2>::value_type>)
5446 __glibcxx_requires_valid_range(__first1, __last1);
5447 __glibcxx_requires_valid_range(__first2, __last2);
5449 return std::__find_end(__first1, __last1, __first2, __last2,
5450 std::__iterator_category(__first1),
5451 std::__iterator_category(__first2));
5455 * @brief Find last matching subsequence in a sequence using a predicate.
5456 * @param first1 Start of range to search.
5457 * @param last1 End of range to search.
5458 * @param first2 Start of sequence to match.
5459 * @param last2 End of sequence to match.
5460 * @param comp The predicate to use.
5461 * @return The last iterator @c i in the range
5462 * @p [first1,last1-(last2-first2)) such that @c predicate(*(i+N), @p
5463 * (first2+N)) is true for each @c N in the range @p [0,last2-first2), or
5464 * @p last1 if no such iterator exists.
5466 * Searches the range @p [first1,last1) for a sub-sequence that compares
5467 * equal value-by-value with the sequence given by @p [first2,last2) using
5468 * comp as a predicate and returns an iterator to the first element of the
5469 * sub-sequence, or @p last1 if the sub-sequence is not found. The
5470 * sub-sequence will be the last such subsequence contained in
5471 * [first,last1).
5473 * Because the sub-sequence must lie completely within the range
5474 * @p [first1,last1) it must start at a position less than
5475 * @p last1-(last2-first2) where @p last2-first2 is the length of the
5476 * sub-sequence.
5477 * This means that the returned iterator @c i will be in the range
5478 * @p [first1,last1-(last2-first2))
5480 template<typename _ForwardIterator1, typename _ForwardIterator2,
5481 typename _BinaryPredicate>
5482 inline _ForwardIterator1
5483 find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
5484 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
5485 _BinaryPredicate __comp)
5487 // concept requirements
5488 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
5489 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
5490 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
5491 typename iterator_traits<_ForwardIterator1>::value_type,
5492 typename iterator_traits<_ForwardIterator2>::value_type>)
5493 __glibcxx_requires_valid_range(__first1, __last1);
5494 __glibcxx_requires_valid_range(__first2, __last2);
5496 return std::__find_end(__first1, __last1, __first2, __last2,
5497 std::__iterator_category(__first1),
5498 std::__iterator_category(__first2),
5499 __comp);
5502 _GLIBCXX_END_NAMESPACE
5504 #endif /* _ALGO_H */