1 // <algorithm> Forward declarations -*- C++ -*-
3 // Copyright (C) 2007-2025 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 #ifdef _GLIBCXX_SYSHDR
34 #pragma GCC system_header
37 #include <bits/c++config.h>
38 #include <bits/stl_pair.h>
39 #include <bits/stl_iterator_base_types.h>
40 #if __cplusplus >= 201103L
41 #include <initializer_list>
44 #pragma GCC diagnostic push
45 #pragma GCC diagnostic ignored "-Wc++11-extensions"
47 namespace std
_GLIBCXX_VISIBILITY(default)
49 _GLIBCXX_BEGIN_NAMESPACE_VERSION
79 is_partitioned (C++11)
81 is_sorted_until (C++11)
83 lexicographical_compare
92 minmax_element (C++11)
100 partition_copy (C++11)
101 partition_point (C++11)
122 set_symmetric_difference
138 * @defgroup algorithms Algorithms
140 * Components for performing algorithmic operations. Includes
141 * non-modifying sequence, modifying (mutating) sequence, sorting,
142 * searching, merge, partition, heap, set, minima, maxima, and
143 * permutation operations.
147 * @defgroup mutating_algorithms Mutating
148 * @ingroup algorithms
152 * @defgroup non_mutating_algorithms Non-Mutating
153 * @ingroup algorithms
157 * @defgroup sorting_algorithms Sorting
158 * @ingroup algorithms
162 * @defgroup set_algorithms Set Operations
163 * @ingroup sorting_algorithms
165 * These algorithms are common set operations performed on sequences
166 * that are already sorted. The number of comparisons will be
171 * @defgroup binary_search_algorithms Binary Search
172 * @ingroup sorting_algorithms
174 * These algorithms are variations of a classic binary search, and
175 * all assume that the sequence being searched is already sorted.
177 * The number of comparisons will be logarithmic (and as few as
178 * possible). The number of steps through the sequence will be
179 * logarithmic for random-access iterators (e.g., pointers), and
182 * The LWG has passed Defect Report 270, which notes: <em>The
183 * proposed resolution reinterprets binary search. Instead of
184 * thinking about searching for a value in a sorted range, we view
185 * that as an important special case of a more general algorithm:
186 * searching for the partition point in a partitioned range. We
187 * also add a guarantee that the old wording did not: we ensure that
188 * the upper bound is no earlier than the lower bound, that the pair
189 * returned by equal_range is a valid range, and that the first part
190 * of that pair is the lower bound.</em>
192 * The actual effect of the first sentence is that a comparison
193 * functor passed by the user doesn't necessarily need to induce a
194 * strict weak ordering relation. Rather, it partitions the range.
199 #if __cplusplus >= 201103L
200 template<typename _IIter
, typename _Predicate
>
203 all_of(_IIter
, _IIter
, _Predicate
);
205 template<typename _IIter
, typename _Predicate
>
208 any_of(_IIter
, _IIter
, _Predicate
);
211 template<typename _FIter
, typename _Tp
_GLIBCXX26_ALGO_DEF_VAL_T(_FIter
)>
214 binary_search(_FIter
, _FIter
, const _Tp
&);
216 template<typename _FIter
, typename _Tp
_GLIBCXX26_ALGO_DEF_VAL_T(_FIter
),
220 binary_search(_FIter
, _FIter
, const _Tp
&, _Compare
);
222 #if __cplusplus > 201402L
223 template<typename _Tp
>
226 clamp(const _Tp
&, const _Tp
&, const _Tp
&);
228 template<typename _Tp
, typename _Compare
>
231 clamp(const _Tp
&, const _Tp
&, const _Tp
&, _Compare
);
234 template<typename _IIter
, typename _OIter
>
237 copy(_IIter
, _IIter
, _OIter
);
239 template<typename _BIter1
, typename _BIter2
>
242 copy_backward(_BIter1
, _BIter1
, _BIter2
);
244 #if __cplusplus >= 201103L
245 template<typename _IIter
, typename _OIter
, typename _Predicate
>
248 copy_if(_IIter
, _IIter
, _OIter
, _Predicate
);
250 template<typename _IIter
, typename _Size
, typename _OIter
>
253 copy_n(_IIter
, _Size
, _OIter
);
259 template<typename _FIter
, typename _Tp
_GLIBCXX26_ALGO_DEF_VAL_T(_FIter
)>
262 equal_range(_FIter
, _FIter
, const _Tp
&);
264 template<typename _FIter
, typename _Tp
_GLIBCXX26_ALGO_DEF_VAL_T(_FIter
),
268 equal_range(_FIter
, _FIter
, const _Tp
&, _Compare
);
270 template<typename _FIter
, typename _Tp
_GLIBCXX26_ALGO_DEF_VAL_T(_FIter
)>
273 fill(_FIter
, _FIter
, const _Tp
&);
275 template<typename _OIter
, typename _Size
,
276 typename _Tp
_GLIBCXX26_ALGO_DEF_VAL_T(_OIter
)>
279 fill_n(_OIter
, _Size
, const _Tp
&);
283 template<typename _FIter1
, typename _FIter2
>
286 find_end(_FIter1
, _FIter1
, _FIter2
, _FIter2
);
288 template<typename _FIter1
, typename _FIter2
, typename _BinaryPredicate
>
291 find_end(_FIter1
, _FIter1
, _FIter2
, _FIter2
, _BinaryPredicate
);
296 #if __cplusplus >= 201103L
297 template<typename _IIter
, typename _Predicate
>
300 find_if_not(_IIter
, _IIter
, _Predicate
);
307 template<typename _IIter1
, typename _IIter2
>
310 includes(_IIter1
, _IIter1
, _IIter2
, _IIter2
);
312 template<typename _IIter1
, typename _IIter2
, typename _Compare
>
315 includes(_IIter1
, _IIter1
, _IIter2
, _IIter2
, _Compare
);
317 template<typename _BIter
>
320 inplace_merge(_BIter
, _BIter
, _BIter
);
322 template<typename _BIter
, typename _Compare
>
325 inplace_merge(_BIter
, _BIter
, _BIter
, _Compare
);
327 #if __cplusplus >= 201103L
328 template<typename _RAIter
>
331 is_heap(_RAIter
, _RAIter
);
333 template<typename _RAIter
, typename _Compare
>
336 is_heap(_RAIter
, _RAIter
, _Compare
);
338 template<typename _RAIter
>
341 is_heap_until(_RAIter
, _RAIter
);
343 template<typename _RAIter
, typename _Compare
>
346 is_heap_until(_RAIter
, _RAIter
, _Compare
);
348 template<typename _IIter
, typename _Predicate
>
351 is_partitioned(_IIter
, _IIter
, _Predicate
);
353 template<typename _FIter1
, typename _FIter2
>
356 is_permutation(_FIter1
, _FIter1
, _FIter2
);
358 template<typename _FIter1
, typename _FIter2
,
359 typename _BinaryPredicate
>
362 is_permutation(_FIter1
, _FIter1
, _FIter2
, _BinaryPredicate
);
364 template<typename _FIter
>
367 is_sorted(_FIter
, _FIter
);
369 template<typename _FIter
, typename _Compare
>
372 is_sorted(_FIter
, _FIter
, _Compare
);
374 template<typename _FIter
>
377 is_sorted_until(_FIter
, _FIter
);
379 template<typename _FIter
, typename _Compare
>
382 is_sorted_until(_FIter
, _FIter
, _Compare
);
385 template<typename _FIter1
, typename _FIter2
>
388 iter_swap(_FIter1
, _FIter2
);
390 template<typename _FIter
, typename _Tp
_GLIBCXX26_ALGO_DEF_VAL_T(_FIter
)>
393 lower_bound(_FIter
, _FIter
, const _Tp
&);
395 template<typename _FIter
, typename _Tp
_GLIBCXX26_ALGO_DEF_VAL_T(_FIter
),
399 lower_bound(_FIter
, _FIter
, const _Tp
&, _Compare
);
401 template<typename _RAIter
>
404 make_heap(_RAIter
, _RAIter
);
406 template<typename _RAIter
, typename _Compare
>
409 make_heap(_RAIter
, _RAIter
, _Compare
);
411 template<typename _Tp
>
414 max(const _Tp
&, const _Tp
&);
416 template<typename _Tp
, typename _Compare
>
419 max(const _Tp
&, const _Tp
&, _Compare
);
424 template<typename _Tp
>
427 min(const _Tp
&, const _Tp
&);
429 template<typename _Tp
, typename _Compare
>
432 min(const _Tp
&, const _Tp
&, _Compare
);
436 #if __cplusplus >= 201103L
437 template<typename _Tp
>
439 pair
<const _Tp
&, const _Tp
&>
440 minmax(const _Tp
&, const _Tp
&);
442 template<typename _Tp
, typename _Compare
>
444 pair
<const _Tp
&, const _Tp
&>
445 minmax(const _Tp
&, const _Tp
&, _Compare
);
447 template<typename _FIter
>
450 minmax_element(_FIter
, _FIter
);
452 template<typename _FIter
, typename _Compare
>
455 minmax_element(_FIter
, _FIter
, _Compare
);
457 template<typename _Tp
>
460 min(initializer_list
<_Tp
>);
462 template<typename _Tp
, typename _Compare
>
465 min(initializer_list
<_Tp
>, _Compare
);
467 template<typename _Tp
>
470 max(initializer_list
<_Tp
>);
472 template<typename _Tp
, typename _Compare
>
475 max(initializer_list
<_Tp
>, _Compare
);
477 template<typename _Tp
>
480 minmax(initializer_list
<_Tp
>);
482 template<typename _Tp
, typename _Compare
>
485 minmax(initializer_list
<_Tp
>, _Compare
);
490 template<typename _BIter
>
493 next_permutation(_BIter
, _BIter
);
495 template<typename _BIter
, typename _Compare
>
498 next_permutation(_BIter
, _BIter
, _Compare
);
500 #if __cplusplus >= 201103L
501 template<typename _IIter
, typename _Predicate
>
504 none_of(_IIter
, _IIter
, _Predicate
);
510 template<typename _IIter
, typename _RAIter
>
513 partial_sort_copy(_IIter
, _IIter
, _RAIter
, _RAIter
);
515 template<typename _IIter
, typename _RAIter
, typename _Compare
>
518 partial_sort_copy(_IIter
, _IIter
, _RAIter
, _RAIter
, _Compare
);
522 #if __cplusplus >= 201103L
523 template<typename _IIter
, typename _OIter1
,
524 typename _OIter2
, typename _Predicate
>
526 pair
<_OIter1
, _OIter2
>
527 partition_copy(_IIter
, _IIter
, _OIter1
, _OIter2
, _Predicate
);
529 template<typename _FIter
, typename _Predicate
>
532 partition_point(_FIter
, _FIter
, _Predicate
);
535 template<typename _RAIter
>
538 pop_heap(_RAIter
, _RAIter
);
540 template<typename _RAIter
, typename _Compare
>
543 pop_heap(_RAIter
, _RAIter
, _Compare
);
545 template<typename _BIter
>
548 prev_permutation(_BIter
, _BIter
);
550 template<typename _BIter
, typename _Compare
>
553 prev_permutation(_BIter
, _BIter
, _Compare
);
555 template<typename _RAIter
>
558 push_heap(_RAIter
, _RAIter
);
560 template<typename _RAIter
, typename _Compare
>
563 push_heap(_RAIter
, _RAIter
, _Compare
);
567 template<typename _FIter
, typename _Tp
_GLIBCXX26_ALGO_DEF_VAL_T(_FIter
)>
570 remove(_FIter
, _FIter
, const _Tp
&);
572 template<typename _FIter
, typename _Predicate
>
575 remove_if(_FIter
, _FIter
, _Predicate
);
577 template<typename _IIter
, typename _OIter
,
578 typename _Tp
_GLIBCXX26_ALGO_DEF_VAL_T(_IIter
)>
581 remove_copy(_IIter
, _IIter
, _OIter
, const _Tp
&);
583 template<typename _IIter
, typename _OIter
, typename _Predicate
>
586 remove_copy_if(_IIter
, _IIter
, _OIter
, _Predicate
);
590 template<typename _IIter
, typename _OIter
, typename _Tp
>
593 replace_copy(_IIter
, _IIter
, _OIter
, const _Tp
&, const _Tp
&);
595 template<typename _Iter
, typename _OIter
, typename _Predicate
,
596 typename _Tp
_GLIBCXX26_ALGO_DEF_VAL_T(_OIter
)>
599 replace_copy_if(_Iter
, _Iter
, _OIter
, _Predicate
, const _Tp
&);
603 template<typename _BIter
>
606 reverse(_BIter
, _BIter
);
608 template<typename _BIter
, typename _OIter
>
611 reverse_copy(_BIter
, _BIter
, _OIter
);
613 _GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE(_V2
)
615 template<typename _FIter
>
618 rotate(_FIter
, _FIter
, _FIter
);
620 _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2
)
622 template<typename _FIter
, typename _OIter
>
625 rotate_copy(_FIter
, _FIter
, _FIter
, _OIter
);
631 // set_symmetric_difference
634 #if __cplusplus >= 201103L
635 template<typename _RAIter
, typename _UGenerator
>
637 shuffle(_RAIter
, _RAIter
, _UGenerator
&&);
640 template<typename _RAIter
>
643 sort_heap(_RAIter
, _RAIter
);
645 template<typename _RAIter
, typename _Compare
>
648 sort_heap(_RAIter
, _RAIter
, _Compare
);
651 template<typename _BIter
, typename _Predicate
>
654 stable_partition(_BIter
, _BIter
, _Predicate
);
657 #if __cplusplus < 201103L
658 // For C++11 swap() is declared in <type_traits>.
660 template<typename _Tp
, size_t _Nm
>
663 swap(_Tp
& __a
, _Tp
& __b
);
665 template<typename _Tp
, size_t _Nm
>
668 swap(_Tp (&__a
)[_Nm
], _Tp (&__b
)[_Nm
]);
671 template<typename _FIter1
, typename _FIter2
>
674 swap_ranges(_FIter1
, _FIter1
, _FIter2
);
678 template<typename _FIter
>
681 unique(_FIter
, _FIter
);
683 template<typename _FIter
, typename _BinaryPredicate
>
686 unique(_FIter
, _FIter
, _BinaryPredicate
);
690 template<typename _FIter
, typename _Tp
_GLIBCXX26_ALGO_DEF_VAL_T(_FIter
)>
693 upper_bound(_FIter
, _FIter
, const _Tp
&);
695 template<typename _FIter
, typename _Tp
_GLIBCXX26_ALGO_DEF_VAL_T(_FIter
),
699 upper_bound(_FIter
, _FIter
, const _Tp
&, _Compare
);
701 _GLIBCXX_BEGIN_NAMESPACE_ALGO
703 template<typename _FIter
>
706 adjacent_find(_FIter
, _FIter
);
708 template<typename _FIter
, typename _BinaryPredicate
>
711 adjacent_find(_FIter
, _FIter
, _BinaryPredicate
);
713 template<typename _IIter
, typename _Tp
_GLIBCXX26_ALGO_DEF_VAL_T(_IIter
)>
715 typename iterator_traits
<_IIter
>::difference_type
716 count(_IIter
, _IIter
, const _Tp
&);
718 template<typename _IIter
, typename _Predicate
>
720 typename iterator_traits
<_IIter
>::difference_type
721 count_if(_IIter
, _IIter
, _Predicate
);
723 template<typename _IIter1
, typename _IIter2
>
726 equal(_IIter1
, _IIter1
, _IIter2
);
728 template<typename _IIter1
, typename _IIter2
, typename _BinaryPredicate
>
731 equal(_IIter1
, _IIter1
, _IIter2
, _BinaryPredicate
);
733 template<typename _IIter
, typename _Tp
_GLIBCXX26_ALGO_DEF_VAL_T(_IIter
)>
736 find(_IIter
, _IIter
, const _Tp
&);
738 template<typename _FIter1
, typename _FIter2
>
741 find_first_of(_FIter1
, _FIter1
, _FIter2
, _FIter2
);
743 template<typename _FIter1
, typename _FIter2
, typename _BinaryPredicate
>
746 find_first_of(_FIter1
, _FIter1
, _FIter2
, _FIter2
, _BinaryPredicate
);
748 template<typename _IIter
, typename _Predicate
>
751 find_if(_IIter
, _IIter
, _Predicate
);
753 template<typename _IIter
, typename _Funct
>
756 for_each(_IIter
, _IIter
, _Funct
);
758 template<typename _FIter
, typename _Generator
>
761 generate(_FIter
, _FIter
, _Generator
);
763 template<typename _OIter
, typename _Size
, typename _Generator
>
766 generate_n(_OIter
, _Size
, _Generator
);
768 template<typename _IIter1
, typename _IIter2
>
771 lexicographical_compare(_IIter1
, _IIter1
, _IIter2
, _IIter2
);
773 template<typename _IIter1
, typename _IIter2
, typename _Compare
>
776 lexicographical_compare(_IIter1
, _IIter1
, _IIter2
, _IIter2
, _Compare
);
778 template<typename _FIter
>
781 max_element(_FIter
, _FIter
);
783 template<typename _FIter
, typename _Compare
>
786 max_element(_FIter
, _FIter
, _Compare
);
788 template<typename _IIter1
, typename _IIter2
, typename _OIter
>
791 merge(_IIter1
, _IIter1
, _IIter2
, _IIter2
, _OIter
);
793 template<typename _IIter1
, typename _IIter2
, typename _OIter
,
797 merge(_IIter1
, _IIter1
, _IIter2
, _IIter2
, _OIter
, _Compare
);
799 template<typename _FIter
>
802 min_element(_FIter
, _FIter
);
804 template<typename _FIter
, typename _Compare
>
807 min_element(_FIter
, _FIter
, _Compare
);
809 template<typename _IIter1
, typename _IIter2
>
811 pair
<_IIter1
, _IIter2
>
812 mismatch(_IIter1
, _IIter1
, _IIter2
);
814 template<typename _IIter1
, typename _IIter2
, typename _BinaryPredicate
>
816 pair
<_IIter1
, _IIter2
>
817 mismatch(_IIter1
, _IIter1
, _IIter2
, _BinaryPredicate
);
819 template<typename _RAIter
>
822 nth_element(_RAIter
, _RAIter
, _RAIter
);
824 template<typename _RAIter
, typename _Compare
>
827 nth_element(_RAIter
, _RAIter
, _RAIter
, _Compare
);
829 template<typename _RAIter
>
832 partial_sort(_RAIter
, _RAIter
, _RAIter
);
834 template<typename _RAIter
, typename _Compare
>
837 partial_sort(_RAIter
, _RAIter
, _RAIter
, _Compare
);
839 template<typename _BIter
, typename _Predicate
>
842 partition(_BIter
, _BIter
, _Predicate
);
845 template<typename _RAIter
>
846 _GLIBCXX14_DEPRECATED_SUGGEST("std::shuffle")
848 random_shuffle(_RAIter
, _RAIter
);
850 template<typename _RAIter
, typename _Generator
>
851 _GLIBCXX14_DEPRECATED_SUGGEST("std::shuffle")
853 random_shuffle(_RAIter
, _RAIter
,
854 #if __cplusplus >= 201103L
861 template<typename _FIter
, typename _Tp
_GLIBCXX26_ALGO_DEF_VAL_T(_FIter
)>
864 replace(_FIter
, _FIter
, const _Tp
&, const _Tp
&);
866 template<typename _FIter
, typename _Predicate
,
867 typename _Tp
_GLIBCXX26_ALGO_DEF_VAL_T(_FIter
)>
870 replace_if(_FIter
, _FIter
, _Predicate
, const _Tp
&);
872 template<typename _FIter1
, typename _FIter2
>
875 search(_FIter1
, _FIter1
, _FIter2
, _FIter2
);
877 template<typename _FIter1
, typename _FIter2
, typename _BinaryPredicate
>
880 search(_FIter1
, _FIter1
, _FIter2
, _FIter2
, _BinaryPredicate
);
882 template<typename _FIter
, typename _Size
,
883 typename _Tp
_GLIBCXX26_ALGO_DEF_VAL_T(_FIter
)>
886 search_n(_FIter
, _FIter
, _Size
, const _Tp
&);
888 template<typename _FIter
, typename _Size
,
889 typename _Tp
_GLIBCXX26_ALGO_DEF_VAL_T(_FIter
),
890 typename _BinaryPredicate
>
893 search_n(_FIter
, _FIter
, _Size
, const _Tp
&, _BinaryPredicate
);
895 template<typename _IIter1
, typename _IIter2
, typename _OIter
>
898 set_difference(_IIter1
, _IIter1
, _IIter2
, _IIter2
, _OIter
);
900 template<typename _IIter1
, typename _IIter2
, typename _OIter
,
904 set_difference(_IIter1
, _IIter1
, _IIter2
, _IIter2
, _OIter
, _Compare
);
906 template<typename _IIter1
, typename _IIter2
, typename _OIter
>
909 set_intersection(_IIter1
, _IIter1
, _IIter2
, _IIter2
, _OIter
);
911 template<typename _IIter1
, typename _IIter2
, typename _OIter
,
915 set_intersection(_IIter1
, _IIter1
, _IIter2
, _IIter2
, _OIter
, _Compare
);
917 template<typename _IIter1
, typename _IIter2
, typename _OIter
>
920 set_symmetric_difference(_IIter1
, _IIter1
, _IIter2
, _IIter2
, _OIter
);
922 template<typename _IIter1
, typename _IIter2
, typename _OIter
,
926 set_symmetric_difference(_IIter1
, _IIter1
, _IIter2
, _IIter2
,
929 template<typename _IIter1
, typename _IIter2
, typename _OIter
>
932 set_union(_IIter1
, _IIter1
, _IIter2
, _IIter2
, _OIter
);
934 template<typename _IIter1
, typename _IIter2
, typename _OIter
,
938 set_union(_IIter1
, _IIter1
, _IIter2
, _IIter2
, _OIter
, _Compare
);
940 template<typename _RAIter
>
943 sort(_RAIter
, _RAIter
);
945 template<typename _RAIter
, typename _Compare
>
948 sort(_RAIter
, _RAIter
, _Compare
);
950 template<typename _RAIter
>
953 stable_sort(_RAIter
, _RAIter
);
955 template<typename _RAIter
, typename _Compare
>
958 stable_sort(_RAIter
, _RAIter
, _Compare
);
960 template<typename _IIter
, typename _OIter
, typename _UnaryOperation
>
963 transform(_IIter
, _IIter
, _OIter
, _UnaryOperation
);
965 template<typename _IIter1
, typename _IIter2
, typename _OIter
,
966 typename _BinaryOperation
>
969 transform(_IIter1
, _IIter1
, _IIter2
, _OIter
, _BinaryOperation
);
971 template<typename _IIter
, typename _OIter
>
974 unique_copy(_IIter
, _IIter
, _OIter
);
976 template<typename _IIter
, typename _OIter
, typename _BinaryPredicate
>
979 unique_copy(_IIter
, _IIter
, _OIter
, _BinaryPredicate
);
981 _GLIBCXX_END_NAMESPACE_ALGO
982 _GLIBCXX_END_NAMESPACE_VERSION
985 #pragma GCC diagnostic pop
987 #ifdef _GLIBCXX_PARALLEL
988 # include <parallel/algorithmfwd.h>