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