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 // You should have received a copy of the GNU General Public License along
17 // with this library; see the file COPYING3. If not see
18 // <http://www.gnu.org/licenses/>.
22 #if __cplusplus >= 202002L
23 #ifndef __cpp_lib_ranges
24 # error "Feature test macro for ranges is missing in <algorithm>"
25 #elif __cpp_lib_ranges < 201911L
26 # error "Feature test macro for ranges has wrong value in <algorithm>"
32 // 25.1, non-modifying sequence operations:
33 template<typename _IIter
, typename _Funct
>
36 for_each(_IIter
, _IIter
, _Funct
);
38 template<typename _IIter
, typename _Tp
>
41 find(_IIter
, _IIter
, const _Tp
&);
43 template<typename _IIter
, typename _Predicate
>
46 find_if(_IIter
, _IIter
, _Predicate
);
48 #if __cplusplus >= 201103L
49 template<typename _IIter
, typename _Predicate
>
52 all_of(_IIter
, _IIter
, _Predicate
);
54 template<typename _IIter
, typename _Predicate
>
57 any_of(_IIter
, _IIter
, _Predicate
);
59 template<typename _IIter
, typename _Predicate
>
62 none_of(_IIter
, _IIter
, _Predicate
);
64 template<typename _IIter
, typename _Predicate
>
67 find_if_not(_IIter
, _IIter
, _Predicate
);
69 template<typename _IIter
, typename _Predicate
>
72 is_partitioned(_IIter
, _IIter
, _Predicate
);
74 template<typename _FIter
, typename _Predicate
>
77 partition_point(_FIter
, _FIter
, _Predicate
);
80 template<typename _FIter1
, typename _FIter2
>
83 find_end(_FIter1
, _FIter1
, _FIter2
, _FIter2
);
85 template<typename _FIter1
, typename _FIter2
, typename _BinaryPredicate
>
88 find_end(_FIter1
, _FIter1
, _FIter2
, _FIter2
, _BinaryPredicate
);
90 template<typename _FIter1
, typename _FIter2
>
93 find_first_of(_FIter1
, _FIter1
, _FIter2
, _FIter2
);
95 template<typename _FIter1
, typename _FIter2
, typename _BinaryPredicate
>
98 find_first_of(_FIter1
, _FIter1
, _FIter2
, _FIter2
, _BinaryPredicate
);
100 template<typename _FIter
>
103 adjacent_find(_FIter
, _FIter
);
105 template<typename _FIter
, typename _BinaryPredicate
>
108 adjacent_find(_FIter
, _FIter
, _BinaryPredicate
);
110 template<typename _IIter
, typename _Tp
>
112 typename iterator_traits
<_IIter
>::difference_type
113 count(_IIter
, _IIter
, const _Tp
&);
115 template<typename _IIter
, typename _Predicate
>
117 typename iterator_traits
<_IIter
>::difference_type
118 count_if(_IIter
, _IIter
, _Predicate
);
120 template<typename _IIter1
, typename _IIter2
>
122 pair
<_IIter1
, _IIter2
>
123 mismatch(_IIter1
, _IIter1
, _IIter2
);
125 template<typename _IIter1
, typename _IIter2
, typename _BinaryPredicate
>
127 pair
<_IIter1
, _IIter2
>
128 mismatch(_IIter1
, _IIter1
, _IIter2
, _BinaryPredicate
);
130 template<typename _IIter1
, typename _IIter2
>
133 equal(_IIter1
, _IIter1
, _IIter2
);
135 template<typename _IIter1
, typename _IIter2
, typename _BinaryPredicate
>
138 equal(_IIter1
, _IIter1
, _IIter2
, _BinaryPredicate
);
140 template<typename _FIter1
, typename _FIter2
>
143 search(_FIter1
, _FIter1
, _FIter2
, _FIter2
);
145 template<typename _FIter1
, typename _FIter2
, typename _BinaryPredicate
>
148 search(_FIter1
, _FIter1
, _FIter2
, _FIter2
, _BinaryPredicate
);
150 template<typename _FIter
, typename _Size
, typename _Tp
>
153 search_n(_FIter
, _FIter
, _Size
, const _Tp
&);
155 template<typename _FIter
, typename _Size
, typename _Tp
,
156 typename _BinaryPredicate
>
159 search_n(_FIter
, _FIter
, _Size
, const _Tp
&, _BinaryPredicate
);
161 // 25.2, modifying sequence operations:
163 template<typename _IIter
, typename _OIter
>
166 copy(_IIter
, _IIter
, _OIter
);
168 template<typename _BIter1
, typename _BIter2
>
171 copy_backward (_BIter1
, _BIter1
, _BIter2
);
174 #if __cplusplus < 201103L
175 template<typename _Tp
>
180 template<typename _Tp
, size_t _Nm
>
183 swap(_Tp (&)[_Nm
], _Tp (&)[_Nm
]);
185 // C++11 swap() has complicated SFINAE constraints, test signatures like so:
186 void (*swap_scalars
)(int&, int&) = &swap
;
187 void (*swap_arrays
)(int(&)[5], int(&)[5]) = &swap
;
190 template<typename _FIter1
, typename _FIter2
>
193 swap_ranges(_FIter1 first1
, _FIter1
, _FIter2
);
195 template<typename _FIter1
, typename _FIter2
>
198 iter_swap(_FIter1
, _FIter2 b
);
200 template<typename _IIter
, typename _OIter
, typename _UnaryOperation
>
203 transform(_IIter
, _IIter
, _OIter
, _UnaryOperation op
);
205 template<typename _IIter1
, typename _IIter2
, typename _OIter
,
206 typename _BinaryOperation
>
209 transform(_IIter1
, _IIter1
, _IIter2
, _OIter
, _BinaryOperation
);
211 template<typename _FIter
, typename _Tp
>
214 replace(_FIter
, _FIter
, const _Tp
&, const _Tp
&);
216 template<typename _FIter
, typename _Predicate
, typename _Tp
>
219 replace_if(_FIter
, _FIter
, _Predicate
, const _Tp
&);
221 template<typename _IIter
, typename _OIter
, typename _Tp
>
224 replace_copy(_IIter
, _IIter
, _OIter
, const _Tp
&, const _Tp
&);
226 template<typename _Iter
, typename _OIter
, typename _Predicate
, typename _Tp
>
229 replace_copy_if(_Iter
, _Iter
, _OIter
, _Predicate
, const _Tp
&);
231 template<typename _FIter
, typename _Tp
>
234 fill(_FIter
, _FIter
, const _Tp
&);
236 template<typename _OIter
, typename _Size
, typename _Tp
>
239 fill_n(_OIter
, _Size n
, const _Tp
&);
241 template<typename _FIter
, typename _Generator
>
244 generate(_FIter
, _FIter
, _Generator
);
246 template<typename _OIter
, typename _Size
, typename _Generator
>
249 generate_n(_OIter
, _Size
, _Generator
);
251 template<typename _FIter
, typename _Tp
>
254 remove(_FIter
, _FIter
, const _Tp
&);
256 template<typename _FIter
, typename _Predicate
>
259 remove_if(_FIter
, _FIter
, _Predicate
);
261 template<typename _IIter
, typename _OIter
, typename _Tp
>
264 remove_copy(_IIter
, _IIter
, _OIter
, const _Tp
&);
266 template<typename _IIter
, typename _OIter
, typename _Predicate
>
269 remove_copy_if(_IIter
, _IIter
, _OIter
, _Predicate
);
271 #if __cplusplus >= 201103L
272 template<typename _IIter
, typename _OIter
, typename _Predicate
>
275 copy_if(_IIter
, _IIter
, _OIter
, _Predicate
);
277 template<typename _IIter
, typename _Size
, typename _OIter
>
280 copy_n(_IIter
, _Size
, _OIter
);
282 template<typename _IIter
, typename _OIter1
,
283 typename _OIter2
, typename _Predicate
>
285 pair
<_OIter1
, _OIter2
>
286 partition_copy(_IIter
, _IIter
, _OIter1
, _OIter2
, _Predicate
);
289 template<typename _FIter
>
292 unique(_FIter
, _FIter
);
294 template<typename _FIter
, typename _BinaryPredicate
>
297 unique(_FIter
, _FIter
, _BinaryPredicate
);
299 template<typename _IIter
, typename _OIter
>
302 unique_copy(_IIter
, _IIter
, _OIter
);
304 template<typename _IIter
, typename _OIter
, typename _BinaryPredicate
>
307 unique_copy(_IIter
, _IIter
, _OIter
, _BinaryPredicate
);
309 template<typename _BIter
>
312 reverse(_BIter
, _BIter
);
314 template<typename _BIter
, typename _OIter
>
317 reverse_copy(_BIter
, _BIter
, _OIter
);
319 template<typename _FIter
>
322 rotate(_FIter
, _FIter
, _FIter
);
324 template<typename _FIter
, typename _OIter
>
327 rotate_copy (_FIter
, _FIter
, _FIter
, _OIter
);
329 #if __cplusplus <= 201103L
330 template<typename _RAIter
>
332 random_shuffle(_RAIter
, _RAIter
);
334 template<typename _RAIter
, typename _Generator
>
336 random_shuffle(_RAIter
, _RAIter
, _Generator
&);
339 #if __cplusplus >= 201103L
340 template<typename _RAIter
, typename _UniformRandomBitGenerator
>
342 shuffle(_RAIter
, _RAIter
, _UniformRandomBitGenerator
&);
345 // 25.2.12, partitions:
346 template<typename _BIter
, typename _Predicate
>
349 partition(_BIter
, _BIter
, _Predicate
);
351 template<typename _BIter
, typename _Predicate
>
353 stable_partition(_BIter
, _BIter
, _Predicate
);
355 // 25.3, sorting and related operations:
357 template<typename _RAIter
>
360 sort(_RAIter
, _RAIter
);
362 template<typename _RAIter
, typename _Compare
>
365 sort(_RAIter
, _RAIter
, _Compare
);
367 template<typename _RAIter
>
369 stable_sort(_RAIter
, _RAIter
);
371 template<typename _RAIter
, typename _Compare
>
373 stable_sort(_RAIter
, _RAIter
, _Compare
);
375 template<typename _RAIter
>
378 partial_sort(_RAIter
, _RAIter
, _RAIter
);
380 template<typename _RAIter
, typename _Compare
>
383 partial_sort(_RAIter
, _RAIter
, _RAIter
, _Compare
);
385 template<typename _IIter
, typename _RAIter
>
388 partial_sort_copy(_IIter
, _IIter
, _RAIter
, _RAIter
);
390 template<typename _IIter
, typename _RAIter
, typename _Compare
>
393 partial_sort_copy(_IIter
, _IIter
, _RAIter
, _RAIter
, _Compare
);
395 template<typename _RAIter
>
398 nth_element(_RAIter
, _RAIter
, _RAIter
);
400 template<typename _RAIter
, typename _Compare
>
403 nth_element(_RAIter
, _RAIter
, _RAIter
, _Compare
);
405 // 25.3.3, binary search:
406 template<typename _FIter
, typename _Tp
>
409 lower_bound(_FIter
, _FIter
, const _Tp
&);
411 template<typename _FIter
, typename _Tp
, typename _Compare
>
414 lower_bound(_FIter
, _FIter
, const _Tp
&, _Compare
);
416 template<typename _FIter
, typename _Tp
>
419 upper_bound(_FIter
, _FIter
, const _Tp
&);
421 template<typename _FIter
, typename _Tp
, typename _Compare
>
424 upper_bound(_FIter
, _FIter
, const _Tp
&, _Compare
);
426 template<typename _FIter
, typename _Tp
>
429 equal_range(_FIter
, _FIter
, const _Tp
&);
431 template<typename _FIter
, typename _Tp
, typename _Compare
>
434 equal_range(_FIter
, _FIter
, const _Tp
&, _Compare
);
436 template<typename _FIter
, typename _Tp
>
439 binary_search(_FIter
, _FIter
, const _Tp
&);
441 template<typename _FIter
, typename _Tp
, typename _Compare
>
444 binary_search(_FIter
, _FIter
, const _Tp
&, _Compare
);
447 template<typename _IIter1
, typename _IIter2
, typename _OIter
>
450 merge(_IIter1
, _IIter1
, _IIter2
, _IIter2
, _OIter
);
452 template<typename _IIter1
, typename _IIter2
, typename _OIter
,
456 merge(_IIter1
, _IIter1
, _IIter2
, _IIter2
, _OIter
, _Compare
);
458 template<typename _BIter
>
460 inplace_merge(_BIter
, _BIter
, _BIter
);
462 template<typename _BIter
, typename _Compare
>
464 inplace_merge(_BIter
, _BIter
, _BIter
, _Compare
);
466 // 25.3.5, set operations:
467 template<typename _IIter1
, typename _IIter2
>
470 includes(_IIter1
, _IIter1
, _IIter2
, _IIter2
);
472 template<typename _IIter1
, typename _IIter2
, typename _Compare
>
475 includes(_IIter1
, _IIter1
, _IIter2
, _IIter2
, _Compare
);
477 template<typename _IIter1
, typename _IIter2
, typename _OIter
>
480 set_union(_IIter1
, _IIter1
, _IIter2
, _IIter2
, _OIter
);
482 template<typename _IIter1
, typename _IIter2
, typename _OIter
,
486 set_union(_IIter1
, _IIter1
, _IIter2
, _IIter2
, _OIter
, _Compare
);
488 template<typename _IIter1
, typename _IIter2
, typename _OIter
>
491 set_intersection(_IIter1
, _IIter1
, _IIter2
, _IIter2
, _OIter
);
493 template<typename _IIter1
, typename _IIter2
, typename _OIter
,
497 set_intersection(_IIter1
, _IIter1
, _IIter2
, _IIter2
, _OIter
, _Compare
);
499 template<typename _IIter1
, typename _IIter2
, typename _OIter
>
502 set_difference(_IIter1
, _IIter1
, _IIter2
, _IIter2
, _OIter
);
504 template<typename _IIter1
, typename _IIter2
, typename _OIter
,
508 set_difference(_IIter1
, _IIter1
, _IIter2
, _IIter2
, _OIter
, _Compare
);
510 template<typename _IIter1
, typename _IIter2
, typename _OIter
>
513 set_symmetric_difference(_IIter1
, _IIter1
, _IIter2
, _IIter2
, _OIter
);
515 template<typename _IIter1
, typename _IIter2
, typename _OIter
,
519 set_symmetric_difference(_IIter1
, _IIter1
, _IIter2
, _IIter2
,
522 // 25.3.6, heap operations:
523 template<typename _RAIter
>
526 push_heap(_RAIter
, _RAIter
);
528 template<typename _RAIter
, typename _Compare
>
531 push_heap(_RAIter
, _RAIter
, _Compare
);
533 template<typename _RAIter
>
536 pop_heap(_RAIter
, _RAIter
);
538 template<typename _RAIter
, typename _Compare
>
541 pop_heap(_RAIter
, _RAIter
, _Compare
);
543 template<typename _RAIter
>
546 make_heap(_RAIter
, _RAIter
);
548 template<typename _RAIter
, typename _Compare
>
551 make_heap(_RAIter
, _RAIter
, _Compare
);
553 template<typename _RAIter
>
556 sort_heap(_RAIter
, _RAIter
);
558 template<typename _RAIter
, typename _Compare
>
561 sort_heap(_RAIter
, _RAIter
, _Compare
);
563 #if __cplusplus >= 201103L
564 template<typename _RAIter
>
567 is_heap(_RAIter
, _RAIter
);
569 template<typename _RAIter
, typename _Compare
>
572 is_heap(_RAIter
, _RAIter
, _Compare
);
574 template<typename _RAIter
>
577 is_heap_until(_RAIter
, _RAIter
);
579 template<typename _RAIter
, typename _Compare
>
582 is_heap_until(_RAIter
, _RAIter
, _Compare
);
584 template<typename _FIter
>
587 is_sorted(_FIter
, _FIter
);
589 template<typename _FIter
, typename _Compare
>
592 is_sorted(_FIter
, _FIter
, _Compare
);
594 template<typename _FIter
>
597 is_sorted_until(_FIter
, _FIter
);
599 template<typename _FIter
, typename _Compare
>
602 is_sorted_until(_FIter
, _FIter
, _Compare
);
605 // 25.3.7, minimum and maximum:
606 template<typename _Tp
>
609 min(const _Tp
&, const _Tp
&);
611 template<typename _Tp
, typename _Compare
>
614 min(const _Tp
&, const _Tp
&, _Compare
);
616 template<typename _Tp
>
619 max(const _Tp
&, const _Tp
&);
621 template<typename _Tp
, typename _Compare
>
624 max(const _Tp
&, const _Tp
&, _Compare
);
626 template<typename _FIter
>
629 min_element(_FIter
, _FIter
);
631 template<typename _FIter
, typename _Compare
>
634 min_element(_FIter
, _FIter
, _Compare
);
636 template<typename _FIter
>
639 max_element(_FIter
, _FIter
);
641 template<typename _FIter
, typename _Compare
>
644 max_element(_FIter
, _FIter
, _Compare
);
646 #if __cplusplus >= 201103L
647 template<typename _Tp
>
649 pair
<const _Tp
&, const _Tp
&>
650 minmax(const _Tp
&, const _Tp
&);
652 template<typename _Tp
, typename _Compare
>
654 pair
<const _Tp
&, const _Tp
&>
655 minmax(const _Tp
&, const _Tp
&, _Compare
);
657 template<typename _FIter
>
660 minmax_element(_FIter
, _FIter
);
662 template<typename _FIter
, typename _Compare
>
665 minmax_element(_FIter
, _FIter
, _Compare
);
667 template<typename _Tp
>
670 min(initializer_list
<_Tp
>);
672 template<typename _Tp
, typename _Compare
>
675 min(initializer_list
<_Tp
>, _Compare
);
677 template<typename _Tp
>
680 max(initializer_list
<_Tp
>);
682 template<typename _Tp
, typename _Compare
>
685 max(initializer_list
<_Tp
>, _Compare
);
687 template<typename _Tp
>
690 minmax(initializer_list
<_Tp
>);
692 template<typename _Tp
, typename _Compare
>
695 minmax(initializer_list
<_Tp
>, _Compare
);
698 template<typename _IIter1
, typename _IIter2
>
701 lexicographical_compare(_IIter1
, _IIter1
, _IIter2
, _IIter2
);
703 template<typename _IIter1
, typename _IIter2
, typename _Compare
>
706 lexicographical_compare(_IIter1
, _IIter1
, _IIter2
, _IIter2
, _Compare
);
708 // 25.3.9, permutations
709 template<typename _BIter
>
712 next_permutation(_BIter
, _BIter
);
714 template<typename _BIter
, typename _Compare
>
717 next_permutation(_BIter
, _BIter
, _Compare
);
719 template<typename _BIter
>
722 prev_permutation(_BIter
, _BIter
);
724 template<typename _BIter
, typename _Compare
>
727 prev_permutation(_BIter
, _BIter
, _Compare
);