1 // <algorithm> declarations -*- C++ -*-
3 // Copyright (C) 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
5 // This file is part of the GNU ISO C++ Library. This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 3, or (at your option)
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // Under Section 7 of GPL version 3, you are granted additional
17 // permissions described in the GCC Runtime Library Exception, version
18 // 3.1, as published by the Free Software Foundation.
20 // You should have received a copy of the GNU General Public License and
21 // a copy of the GCC Runtime Library Exception along with this program;
22 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23 // <http://www.gnu.org/licenses/>.
25 /** @file bits/algorithmfwd.h
26 * This is an internal header file, included by other library headers.
27 * Do not attempt to use it directly. @headername{algorithm}
30 #ifndef _GLIBCXX_ALGORITHMFWD_H
31 #define _GLIBCXX_ALGORITHMFWD_H 1
33 #pragma GCC system_header
35 #include <bits/c++config.h>
36 #include <bits/stl_pair.h>
37 #include <bits/stl_iterator_base_types.h>
38 #include <initializer_list>
40 namespace std _GLIBCXX_VISIBILITY(default)
42 _GLIBCXX_BEGIN_NAMESPACE_VERSION
71 is_partitioned (C++0x)
73 is_sorted_until (C++0x)
75 lexicographical_compare
84 minmax_element (C++0x)
92 partition_copy (C++0x)
93 partition_point (C++0x)
114 set_symmetric_difference
130 * @defgroup algorithms Algorithms
132 * Components for performing algorithmic operations. Includes
133 * non-modifying sequence, modifying (mutating) sequence, sorting,
134 * searching, merge, partition, heap, set, minima, maxima, and
135 * permutation operations.
139 * @defgroup mutating_algorithms Mutating
140 * @ingroup algorithms
144 * @defgroup non_mutating_algorithms Non-Mutating
145 * @ingroup algorithms
149 * @defgroup sorting_algorithms Sorting
150 * @ingroup algorithms
154 * @defgroup set_algorithms Set Operation
155 * @ingroup sorting_algorithms
157 * These algorithms are common set operations performed on sequences
158 * that are already sorted. The number of comparisons will be
163 * @defgroup binary_search_algorithms Binary Search
164 * @ingroup sorting_algorithms
166 * These algorithms are variations of a classic binary search, and
167 * all assume that the sequence being searched is already sorted.
169 * The number of comparisons will be logarithmic (and as few as
170 * possible). The number of steps through the sequence will be
171 * logarithmic for random-access iterators (e.g., pointers), and
174 * The LWG has passed Defect Report 270, which notes: <em>The
175 * proposed resolution reinterprets binary search. Instead of
176 * thinking about searching for a value in a sorted range, we view
177 * that as an important special case of a more general algorithm:
178 * searching for the partition point in a partitioned range. We
179 * also add a guarantee that the old wording did not: we ensure that
180 * the upper bound is no earlier than the lower bound, that the pair
181 * returned by equal_range is a valid range, and that the first part
182 * of that pair is the lower bound.</em>
184 * The actual effect of the first sentence is that a comparison
185 * functor passed by the user doesn't necessarily need to induce a
186 * strict weak ordering relation. Rather, it partitions the range.
191 #ifdef __GXX_EXPERIMENTAL_CXX0X__
192 template<typename _IIter, typename _Predicate>
194 all_of(_IIter, _IIter, _Predicate);
196 template<typename _IIter, typename _Predicate>
198 any_of(_IIter, _IIter, _Predicate);
201 template<typename _FIter, typename _Tp>
203 binary_search(_FIter, _FIter, const _Tp&);
205 template<typename _FIter, typename _Tp, typename _Compare>
207 binary_search(_FIter, _FIter, const _Tp&, _Compare);
209 template<typename _IIter, typename _OIter>
211 copy(_IIter, _IIter, _OIter);
213 template<typename _BIter1, typename _BIter2>
215 copy_backward(_BIter1, _BIter1, _BIter2);
217 #ifdef __GXX_EXPERIMENTAL_CXX0X__
218 template<typename _IIter, typename _OIter, typename _Predicate>
220 copy_if(_IIter, _IIter, _OIter, _Predicate);
222 template<typename _IIter, typename _Size, typename _OIter>
224 copy_n(_IIter, _Size, _OIter);
230 template<typename _FIter, typename _Tp>
232 equal_range(_FIter, _FIter, const _Tp&);
234 template<typename _FIter, typename _Tp, typename _Compare>
236 equal_range(_FIter, _FIter, const _Tp&, _Compare);
238 template<typename _FIter, typename _Tp>
240 fill(_FIter, _FIter, const _Tp&);
242 template<typename _OIter, typename _Size, typename _Tp>
244 fill_n(_OIter, _Size, const _Tp&);
248 template<typename _FIter1, typename _FIter2>
250 find_end(_FIter1, _FIter1, _FIter2, _FIter2);
252 template<typename _FIter1, typename _FIter2, typename _BinaryPredicate>
254 find_end(_FIter1, _FIter1, _FIter2, _FIter2, _BinaryPredicate);
259 #ifdef __GXX_EXPERIMENTAL_CXX0X__
260 template<typename _IIter, typename _Predicate>
262 find_if_not(_IIter, _IIter, _Predicate);
269 template<typename _IIter1, typename _IIter2>
271 includes(_IIter1, _IIter1, _IIter2, _IIter2);
273 template<typename _IIter1, typename _IIter2, typename _Compare>
275 includes(_IIter1, _IIter1, _IIter2, _IIter2, _Compare);
277 template<typename _BIter>
279 inplace_merge(_BIter, _BIter, _BIter);
281 template<typename _BIter, typename _Compare>
283 inplace_merge(_BIter, _BIter, _BIter, _Compare);
285 #ifdef __GXX_EXPERIMENTAL_CXX0X__
286 template<typename _RAIter>
288 is_heap(_RAIter, _RAIter);
290 template<typename _RAIter, typename _Compare>
292 is_heap(_RAIter, _RAIter, _Compare);
294 template<typename _RAIter>
296 is_heap_until(_RAIter, _RAIter);
298 template<typename _RAIter, typename _Compare>
300 is_heap_until(_RAIter, _RAIter, _Compare);
302 template<typename _IIter, typename _Predicate>
304 is_partitioned(_IIter, _IIter, _Predicate);
306 template<typename _FIter1, typename _FIter2>
308 is_permutation(_FIter1, _FIter1, _FIter2);
310 template<typename _FIter1, typename _FIter2,
311 typename _BinaryPredicate>
313 is_permutation(_FIter1, _FIter1, _FIter2, _BinaryPredicate);
315 template<typename _FIter>
317 is_sorted(_FIter, _FIter);
319 template<typename _FIter, typename _Compare>
321 is_sorted(_FIter, _FIter, _Compare);
323 template<typename _FIter>
325 is_sorted_until(_FIter, _FIter);
327 template<typename _FIter, typename _Compare>
329 is_sorted_until(_FIter, _FIter, _Compare);
332 template<typename _FIter1, typename _FIter2>
334 iter_swap(_FIter1, _FIter2);
336 template<typename _FIter, typename _Tp>
338 lower_bound(_FIter, _FIter, const _Tp&);
340 template<typename _FIter, typename _Tp, typename _Compare>
342 lower_bound(_FIter, _FIter, const _Tp&, _Compare);
344 template<typename _RAIter>
346 make_heap(_RAIter, _RAIter);
348 template<typename _RAIter, typename _Compare>
350 make_heap(_RAIter, _RAIter, _Compare);
352 template<typename _Tp>
354 max(const _Tp&, const _Tp&);
356 template<typename _Tp, typename _Compare>
358 max(const _Tp&, const _Tp&, _Compare);
363 template<typename _Tp>
365 min(const _Tp&, const _Tp&);
367 template<typename _Tp, typename _Compare>
369 min(const _Tp&, const _Tp&, _Compare);
373 #ifdef __GXX_EXPERIMENTAL_CXX0X__
374 template<typename _Tp>
375 pair<const _Tp&, const _Tp&>
376 minmax(const _Tp&, const _Tp&);
378 template<typename _Tp, typename _Compare>
379 pair<const _Tp&, const _Tp&>
380 minmax(const _Tp&, const _Tp&, _Compare);
382 template<typename _FIter>
384 minmax_element(_FIter, _FIter);
386 template<typename _FIter, typename _Compare>
388 minmax_element(_FIter, _FIter, _Compare);
390 template<typename _Tp>
392 min(initializer_list<_Tp>);
394 template<typename _Tp, typename _Compare>
396 min(initializer_list<_Tp>, _Compare);
398 template<typename _Tp>
400 max(initializer_list<_Tp>);
402 template<typename _Tp, typename _Compare>
404 max(initializer_list<_Tp>, _Compare);
406 template<typename _Tp>
408 minmax(initializer_list<_Tp>);
410 template<typename _Tp, typename _Compare>
412 minmax(initializer_list<_Tp>, _Compare);
417 template<typename _BIter>
419 next_permutation(_BIter, _BIter);
421 template<typename _BIter, typename _Compare>
423 next_permutation(_BIter, _BIter, _Compare);
425 #ifdef __GXX_EXPERIMENTAL_CXX0X__
426 template<typename _IIter, typename _Predicate>
428 none_of(_IIter, _IIter, _Predicate);
434 template<typename _IIter, typename _RAIter>
436 partial_sort_copy(_IIter, _IIter, _RAIter, _RAIter);
438 template<typename _IIter, typename _RAIter, typename _Compare>
440 partial_sort_copy(_IIter, _IIter, _RAIter, _RAIter, _Compare);
444 #ifdef __GXX_EXPERIMENTAL_CXX0X__
445 template<typename _IIter, typename _OIter1,
446 typename _OIter2, typename _Predicate>
447 pair<_OIter1, _OIter2>
448 partition_copy(_IIter, _IIter, _OIter1, _OIter2, _Predicate);
450 template<typename _FIter, typename _Predicate>
452 partition_point(_FIter, _FIter, _Predicate);
455 template<typename _RAIter>
457 pop_heap(_RAIter, _RAIter);
459 template<typename _RAIter, typename _Compare>
461 pop_heap(_RAIter, _RAIter, _Compare);
463 template<typename _BIter>
465 prev_permutation(_BIter, _BIter);
467 template<typename _BIter, typename _Compare>
469 prev_permutation(_BIter, _BIter, _Compare);
471 template<typename _RAIter>
473 push_heap(_RAIter, _RAIter);
475 template<typename _RAIter, typename _Compare>
477 push_heap(_RAIter, _RAIter, _Compare);
481 template<typename _FIter, typename _Tp>
483 remove(_FIter, _FIter, const _Tp&);
485 template<typename _FIter, typename _Predicate>
487 remove_if(_FIter, _FIter, _Predicate);
489 template<typename _IIter, typename _OIter, typename _Tp>
491 remove_copy(_IIter, _IIter, _OIter, const _Tp&);
493 template<typename _IIter, typename _OIter, typename _Predicate>
495 remove_copy_if(_IIter, _IIter, _OIter, _Predicate);
499 template<typename _IIter, typename _OIter, typename _Tp>
501 replace_copy(_IIter, _IIter, _OIter, const _Tp&, const _Tp&);
503 template<typename _Iter, typename _OIter, typename _Predicate, typename _Tp>
505 replace_copy_if(_Iter, _Iter, _OIter, _Predicate, const _Tp&);
509 template<typename _BIter>
511 reverse(_BIter, _BIter);
513 template<typename _BIter, typename _OIter>
515 reverse_copy(_BIter, _BIter, _OIter);
517 template<typename _FIter>
519 rotate(_FIter, _FIter, _FIter);
521 template<typename _FIter, typename _OIter>
523 rotate_copy(_FIter, _FIter, _FIter, _OIter);
529 // set_symmetric_difference
532 #if defined(__GXX_EXPERIMENTAL_CXX0X__) && defined(_GLIBCXX_USE_C99_STDINT_TR1)
533 template<typename _RAIter, typename _UGenerator>
535 shuffle(_RAIter, _RAIter, _UGenerator&&);
538 template<typename _RAIter>
540 sort_heap(_RAIter, _RAIter);
542 template<typename _RAIter, typename _Compare>
544 sort_heap(_RAIter, _RAIter, _Compare);
546 template<typename _BIter, typename _Predicate>
548 stable_partition(_BIter, _BIter, _Predicate);
550 template<typename _Tp>
554 template<typename _Tp, size_t _Nm>
556 swap(_Tp (&)[_Nm], _Tp (&)[_Nm]);
558 template<typename _FIter1, typename _FIter2>
560 swap_ranges(_FIter1, _FIter1, _FIter2);
564 template<typename _FIter>
566 unique(_FIter, _FIter);
568 template<typename _FIter, typename _BinaryPredicate>
570 unique(_FIter, _FIter, _BinaryPredicate);
574 template<typename _FIter, typename _Tp>
576 upper_bound(_FIter, _FIter, const _Tp&);
578 template<typename _FIter, typename _Tp, typename _Compare>
580 upper_bound(_FIter, _FIter, const _Tp&, _Compare);
582 _GLIBCXX_END_NAMESPACE_VERSION
584 _GLIBCXX_BEGIN_NAMESPACE_ALGO
586 template<typename _FIter>
588 adjacent_find(_FIter, _FIter);
590 template<typename _FIter, typename _BinaryPredicate>
592 adjacent_find(_FIter, _FIter, _BinaryPredicate);
594 template<typename _IIter, typename _Tp>
595 typename iterator_traits<_IIter>::difference_type
596 count(_IIter, _IIter, const _Tp&);
598 template<typename _IIter, typename _Predicate>
599 typename iterator_traits<_IIter>::difference_type
600 count_if(_IIter, _IIter, _Predicate);
602 template<typename _IIter1, typename _IIter2>
604 equal(_IIter1, _IIter1, _IIter2);
606 template<typename _IIter1, typename _IIter2, typename _BinaryPredicate>
608 equal(_IIter1, _IIter1, _IIter2, _BinaryPredicate);
610 template<typename _IIter, typename _Tp>
612 find(_IIter, _IIter, const _Tp&);
614 template<typename _FIter1, typename _FIter2>
616 find_first_of(_FIter1, _FIter1, _FIter2, _FIter2);
618 template<typename _FIter1, typename _FIter2, typename _BinaryPredicate>
620 find_first_of(_FIter1, _FIter1, _FIter2, _FIter2, _BinaryPredicate);
622 template<typename _IIter, typename _Predicate>
624 find_if(_IIter, _IIter, _Predicate);
626 template<typename _IIter, typename _Funct>
628 for_each(_IIter, _IIter, _Funct);
630 template<typename _FIter, typename _Generator>
632 generate(_FIter, _FIter, _Generator);
634 template<typename _OIter, typename _Size, typename _Generator>
636 generate_n(_OIter, _Size, _Generator);
638 template<typename _IIter1, typename _IIter2>
640 lexicographical_compare(_IIter1, _IIter1, _IIter2, _IIter2);
642 template<typename _IIter1, typename _IIter2, typename _Compare>
644 lexicographical_compare(_IIter1, _IIter1, _IIter2, _IIter2, _Compare);
646 template<typename _FIter>
648 max_element(_FIter, _FIter);
650 template<typename _FIter, typename _Compare>
652 max_element(_FIter, _FIter, _Compare);
654 template<typename _IIter1, typename _IIter2, typename _OIter>
656 merge(_IIter1, _IIter1, _IIter2, _IIter2, _OIter);
658 template<typename _IIter1, typename _IIter2, typename _OIter,
661 merge(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Compare);
663 template<typename _FIter>
665 min_element(_FIter, _FIter);
667 template<typename _FIter, typename _Compare>
669 min_element(_FIter, _FIter, _Compare);
671 template<typename _IIter1, typename _IIter2>
672 pair<_IIter1, _IIter2>
673 mismatch(_IIter1, _IIter1, _IIter2);
675 template<typename _IIter1, typename _IIter2, typename _BinaryPredicate>
676 pair<_IIter1, _IIter2>
677 mismatch(_IIter1, _IIter1, _IIter2, _BinaryPredicate);
679 template<typename _RAIter>
681 nth_element(_RAIter, _RAIter, _RAIter);
683 template<typename _RAIter, typename _Compare>
685 nth_element(_RAIter, _RAIter, _RAIter, _Compare);
687 template<typename _RAIter>
689 partial_sort(_RAIter, _RAIter, _RAIter);
691 template<typename _RAIter, typename _Compare>
693 partial_sort(_RAIter, _RAIter, _RAIter, _Compare);
695 template<typename _BIter, typename _Predicate>
697 partition(_BIter, _BIter, _Predicate);
699 template<typename _RAIter>
701 random_shuffle(_RAIter, _RAIter);
703 template<typename _RAIter, typename _Generator>
705 random_shuffle(_RAIter, _RAIter,
706 #ifdef __GXX_EXPERIMENTAL_CXX0X__
712 template<typename _FIter, typename _Tp>
714 replace(_FIter, _FIter, const _Tp&, const _Tp&);
716 template<typename _FIter, typename _Predicate, typename _Tp>
718 replace_if(_FIter, _FIter, _Predicate, const _Tp&);
720 template<typename _FIter1, typename _FIter2>
722 search(_FIter1, _FIter1, _FIter2, _FIter2);
724 template<typename _FIter1, typename _FIter2, typename _BinaryPredicate>
726 search(_FIter1, _FIter1, _FIter2, _FIter2, _BinaryPredicate);
728 template<typename _FIter, typename _Size, typename _Tp>
730 search_n(_FIter, _FIter, _Size, const _Tp&);
732 template<typename _FIter, typename _Size, typename _Tp,
733 typename _BinaryPredicate>
735 search_n(_FIter, _FIter, _Size, const _Tp&, _BinaryPredicate);
737 template<typename _IIter1, typename _IIter2, typename _OIter>
739 set_difference(_IIter1, _IIter1, _IIter2, _IIter2, _OIter);
741 template<typename _IIter1, typename _IIter2, typename _OIter,
744 set_difference(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Compare);
746 template<typename _IIter1, typename _IIter2, typename _OIter>
748 set_intersection(_IIter1, _IIter1, _IIter2, _IIter2, _OIter);
750 template<typename _IIter1, typename _IIter2, typename _OIter,
753 set_intersection(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Compare);
755 template<typename _IIter1, typename _IIter2, typename _OIter>
757 set_symmetric_difference(_IIter1, _IIter1, _IIter2, _IIter2, _OIter);
759 template<typename _IIter1, typename _IIter2, typename _OIter,
762 set_symmetric_difference(_IIter1, _IIter1, _IIter2, _IIter2,
765 template<typename _IIter1, typename _IIter2, typename _OIter>
767 set_union(_IIter1, _IIter1, _IIter2, _IIter2, _OIter);
769 template<typename _IIter1, typename _IIter2, typename _OIter,
772 set_union(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Compare);
774 template<typename _RAIter>
776 sort(_RAIter, _RAIter);
778 template<typename _RAIter, typename _Compare>
780 sort(_RAIter, _RAIter, _Compare);
782 template<typename _RAIter>
784 stable_sort(_RAIter, _RAIter);
786 template<typename _RAIter, typename _Compare>
788 stable_sort(_RAIter, _RAIter, _Compare);
790 template<typename _IIter, typename _OIter, typename _UnaryOperation>
792 transform(_IIter, _IIter, _OIter, _UnaryOperation);
794 template<typename _IIter1, typename _IIter2, typename _OIter,
795 typename _BinaryOperation>
797 transform(_IIter1, _IIter1, _IIter2, _OIter, _BinaryOperation);
799 template<typename _IIter, typename _OIter>
801 unique_copy(_IIter, _IIter, _OIter);
803 template<typename _IIter, typename _OIter, typename _BinaryPredicate>
805 unique_copy(_IIter, _IIter, _OIter, _BinaryPredicate);
807 _GLIBCXX_END_NAMESPACE_ALGO
810 #ifdef _GLIBCXX_PARALLEL
811 # include <parallel/algorithmfwd.h>