2 //===----------------------------------------------------------------------===//
4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5 // See https://llvm.org/LICENSE.txt for license information.
6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
8 //===----------------------------------------------------------------------===//
10 #ifndef _LIBCPP_ALGORITHM
11 #define _LIBCPP_ALGORITHM
16 #include <initializer_list>
23 // [algorithms.results], algorithm result types
24 template <class I, class F>
25 struct in_fun_result; // since C++20
27 template <class I1, class I2>
28 struct in_in_result; // since C++20
30 template <class I, class O>
31 struct in_out_result; // since C++20
33 template <class I1, class I2, class O>
34 struct in_in_out_result; // since C++20
36 template <class I, class O1, class O2>
37 struct in_out_out_result; // since C++20
39 template <class I1, class I2>
40 struct min_max_result; // since C++20
43 struct in_found_result; // since C++20
45 template<forward_iterator I, sentinel_for<I> S, class Proj = identity,
46 indirect_strict_weak_order<projected<I, Proj>> Comp = ranges::less> // since C++20
47 constexpr I min_element(I first, S last, Comp comp = {}, Proj proj = {});
49 template<forward_range R, class Proj = identity,
50 indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less> // since C++20
51 constexpr borrowed_iterator_t<R> min_element(R&& r, Comp comp = {}, Proj proj = {});
53 template<forward_iterator I, sentinel_for<I> S, class Proj = identity,
54 indirect_strict_weak_order<projected<I, Proj>> Comp = ranges::less>
55 constexpr I ranges::max_element(I first, S last, Comp comp = {}, Proj proj = {}); // since C++20
57 template<forward_range R, class Proj = identity,
58 indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less>
59 constexpr borrowed_iterator_t<R> ranges::max_element(R&& r, Comp comp = {}, Proj proj = {}); // since C++20
61 template<class I1, class I2>
62 using mismatch_result = in_in_result<I1, I2>;
64 template <input_iterator I1, sentinel_for<_I1> S1, input_iterator I2, sentinel_for<_I2> S2,
65 class Pred = ranges::equal_to, class Proj1 = identity, class Proj2 = identity>
66 requires indirectly_comparable<I1, I2, Pred, Proj1, Proj2>
67 constexpr mismatch_result<_I1, _I2> // since C++20
68 mismatch()(I1 first1, S1 last1, I2 first2, S2 last2, Pred pred = {}, Proj1 proj1 = {}, Proj2 proj2 = {})
70 template <input_range R1, input_range R2,
71 class Pred = ranges::equal_to, class Proj1 = identity, class Proj2 = identity>
72 requires indirectly_comparable<iterator_t<R1>, iterator_t<R2>, Pred, Proj1, Proj2>
73 constexpr mismatch_result<borrowed_iterator_t<R1>, borrowed_iterator_t<R2>>
74 mismatch(R1&& r1, R2&& r2, Pred pred = {}, Proj1 proj1 = {}, Proj2 proj2 = {}) // since C++20
76 requires indirect_binary_predicate<ranges::equal_to, projected<I, Proj>, const T*>
77 constexpr I find(I first, S last, const T& value, Proj proj = {}); // since C++20
79 template<input_range R, class T, class Proj = identity>
80 requires indirect_binary_predicate<ranges::equal_to, projected<iterator_t<R>, Proj>, const T*>
81 constexpr borrowed_iterator_t<R>
82 find(R&& r, const T& value, Proj proj = {}); // since C++20
84 template<input_iterator I, sentinel_for<I> S, class Proj = identity,
85 indirect_unary_predicate<projected<I, Proj>> Pred>
86 constexpr I find_if(I first, S last, Pred pred, Proj proj = {}); // since C++20
88 template<input_range R, class Proj = identity,
89 indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred>
90 constexpr borrowed_iterator_t<R>
91 find_if(R&& r, Pred pred, Proj proj = {}); // since C++20
93 template<input_iterator I, sentinel_for<I> S, class Proj = identity,
94 indirect_unary_predicate<projected<I, Proj>> Pred>
95 constexpr I find_if_not(I first, S last, Pred pred, Proj proj = {}); // since C++20
97 template<input_range R, class Proj = identity,
98 indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred>
99 constexpr borrowed_iterator_t<R>
100 find_if_not(R&& r, Pred pred, Proj proj = {}); // since C++20
102 template<class T, class Proj = identity,
103 indirect_strict_weak_order<projected<const T*, Proj>> Comp = ranges::less>
104 constexpr const T& min(const T& a, const T& b, Comp comp = {}, Proj proj = {}); // since C++20
106 template<copyable T, class Proj = identity,
107 indirect_strict_weak_order<projected<const T*, Proj>> Comp = ranges::less>
108 constexpr T min(initializer_list<T> r, Comp comp = {}, Proj proj = {}); // since C++20
110 template<input_range R, class Proj = identity,
111 indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less>
112 requires indirectly_copyable_storable<iterator_t<R>, range_value_t<R>*>
113 constexpr range_value_t<R>
114 min(R&& r, Comp comp = {}, Proj proj = {}); // since C++20
116 template<class T, class Proj = identity,
117 indirect_strict_weak_order<projected<const T*, Proj>> Comp = ranges::less>
118 constexpr const T& max(const T& a, const T& b, Comp comp = {}, Proj proj = {}); // since C++20
120 template<copyable T, class Proj = identity,
121 indirect_strict_weak_order<projected<const T*, Proj>> Comp = ranges::less>
122 constexpr T max(initializer_list<T> r, Comp comp = {}, Proj proj = {}); // since C++20
124 template<input_range R, class Proj = identity,
125 indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less>
126 requires indirectly_copyable_storable<iterator_t<R>, range_value_t<R>*>
127 constexpr range_value_t<R>
128 max(R&& r, Comp comp = {}, Proj proj = {}); // since C++20
130 template<class I, class O>
131 using unary_transform_result = in_out_result<I, O>; // since C++20
133 template<class I1, class I2, class O>
134 using binary_transform_result = in_in_out_result<I1, I2, O>; // since C++20
136 template<input_iterator I, sentinel_for<I> S, weakly_incrementable O,
137 copy_constructible F, class Proj = identity>
138 requires indirectly_writable<O, indirect_result_t<F&, projected<I, Proj>>>
139 constexpr ranges::unary_transform_result<I, O>
140 transform(I first1, S last1, O result, F op, Proj proj = {}); // since C++20
142 template<input_range R, weakly_incrementable O, copy_constructible F,
143 class Proj = identity>
144 requires indirectly_writable<O, indirect_result_t<F&, projected<iterator_t<R>, Proj>>>
145 constexpr ranges::unary_transform_result<borrowed_iterator_t<R>, O>
146 transform(R&& r, O result, F op, Proj proj = {}); // since C++20
148 template<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2,
149 weakly_incrementable O, copy_constructible F, class Proj1 = identity,
150 class Proj2 = identity>
151 requires indirectly_writable<O, indirect_result_t<F&, projected<I1, Proj1>,
152 projected<I2, Proj2>>>
153 constexpr ranges::binary_transform_result<I1, I2, O>
154 transform(I1 first1, S1 last1, I2 first2, S2 last2, O result,
155 F binary_op, Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20
157 template<input_range R1, input_range R2, weakly_incrementable O,
158 copy_constructible F, class Proj1 = identity, class Proj2 = identity>
159 requires indirectly_writable<O, indirect_result_t<F&, projected<iterator_t<R1>, Proj1>,
160 projected<iterator_t<R2>, Proj2>>>
161 constexpr ranges::binary_transform_result<borrowed_iterator_t<R1>, borrowed_iterator_t<R2>, O>
162 transform(R1&& r1, R2&& r2, O result,
163 F binary_op, Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20
165 template<input_iterator I, sentinel_for<I> S, class T, class Proj = identity>
166 requires indirect_binary_predicate<ranges::equal_to, projected<I, Proj>, const T*>
167 constexpr iter_difference_t<I>
168 count(I first, S last, const T& value, Proj proj = {}); // since C++20
170 template<input_range R, class T, class Proj = identity>
171 requires indirect_binary_predicate<ranges::equal_to, projected<iterator_t<R>, Proj>, const T*>
172 constexpr range_difference_t<R>
173 count(R&& r, const T& value, Proj proj = {}); // since C++20
175 template<input_iterator I, sentinel_for<I> S, class Proj = identity,
176 indirect_unary_predicate<projected<I, Proj>> Pred>
177 constexpr iter_difference_t<I>
178 count_if(I first, S last, Pred pred, Proj proj = {}); // since C++20
180 template<input_range R, class Proj = identity,
181 indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred>
182 constexpr range_difference_t<R>
183 count_if(R&& r, Pred pred, Proj proj = {}); // since C++20
186 using minmax_result = min_max_result<T>;
188 template<class T, class Proj = identity,
189 indirect_strict_weak_order<projected<const T*, Proj>> Comp = ranges::less>
190 constexpr ranges::minmax_result<const T&>
191 minmax(const T& a, const T& b, Comp comp = {}, Proj proj = {}); // since C++20
193 template<copyable T, class Proj = identity,
194 indirect_strict_weak_order<projected<const T*, Proj>> Comp = ranges::less>
195 constexpr ranges::minmax_result<T>
196 minmax(initializer_list<T> r, Comp comp = {}, Proj proj = {}); // since C++20
198 template<input_range R, class Proj = identity,
199 indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less>
200 requires indirectly_copyable_storable<iterator_t<R>, range_value_t<R>*>
201 constexpr ranges::minmax_result<range_value_t<R>>
202 minmax(R&& r, Comp comp = {}, Proj proj = {}); // since C++20
205 using minmax_element_result = min_max_result<I>;
207 template<forward_iterator I, sentinel_for<I> S, class Proj = identity,
208 indirect_strict_weak_order<projected<I, Proj>> Comp = ranges::less>
209 constexpr ranges::minmax_element_result<I>
210 minmax_element(I first, S last, Comp comp = {}, Proj proj = {}); // since C++20
212 template<forward_range R, class Proj = identity,
213 indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less>
214 constexpr ranges::minmax_element_result<borrowed_iterator_t<R>>
215 minmax_element(R&& r, Comp comp = {}, Proj proj = {}); // since C++20
217 template<class I, class O>
218 using copy_result = in_out_result<I, O>; // since C++20
220 template<class I, class O>
221 using copy_n_result = in_out_result<I, O>; // since C++20
223 template<class I, class O>
224 using copy_if_result = in_out_result<I, O>; // since C++20
226 template<class I1, class I2>
227 using copy_backward_result = in_out_result<I1, I2>; // since C++20
229 template<input_iterator I, sentinel_for<I> S, weakly_incrementable O>
230 requires indirectly_copyable<I, O>
231 constexpr ranges::copy_result<I, O> ranges::copy(I first, S last, O result); // since C++20
233 template<input_range R, weakly_incrementable O>
234 requires indirectly_copyable<iterator_t<R>, O>
235 constexpr ranges::copy_result<borrowed_iterator_t<R>, O> ranges::copy(R&& r, O result); // since C++20
237 template<input_iterator I, weakly_incrementable O>
238 requires indirectly_copyable<I, O>
239 constexpr ranges::copy_n_result<I, O>
240 ranges::copy_n(I first, iter_difference_t<I> n, O result); // since C++20
242 template<input_iterator I, sentinel_for<I> S, weakly_incrementable O, class Proj = identity,
243 indirect_unary_predicate<projected<I, Proj>> Pred>
244 requires indirectly_copyable<I, O>
245 constexpr ranges::copy_if_result<I, O>
246 ranges::copy_if(I first, S last, O result, Pred pred, Proj proj = {}); // since C++20
248 template<input_range R, weakly_incrementable O, class Proj = identity,
249 indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred>
250 requires indirectly_copyable<iterator_t<R>, O>
251 constexpr ranges::copy_if_result<borrowed_iterator_t<R>, O>
252 ranges::copy_if(R&& r, O result, Pred pred, Proj proj = {}); // since C++20
254 template<bidirectional_iterator I1, sentinel_for<I1> S1, bidirectional_iterator I2>
255 requires indirectly_copyable<I1, I2>
256 constexpr ranges::copy_backward_result<I1, I2>
257 ranges::copy_backward(I1 first, S1 last, I2 result); // since C++20
259 template<bidirectional_range R, bidirectional_iterator I>
260 requires indirectly_copyable<iterator_t<R>, I>
261 constexpr ranges::copy_backward_result<borrowed_iterator_t<R>, I>
262 ranges::copy_backward(R&& r, I result); // since C++20
264 template<class I, class F>
265 using for_each_result = in_fun_result<I, F>; // since C++20
267 template<input_iterator I, sentinel_for<I> S, class Proj = identity,
268 indirectly_unary_invocable<projected<I, Proj>> Fun>
269 constexpr ranges::for_each_result<I, Fun>
270 ranges::for_each(I first, S last, Fun f, Proj proj = {}); // since C++20
272 template<input_range R, class Proj = identity,
273 indirectly_unary_invocable<projected<iterator_t<R>, Proj>> Fun>
274 constexpr ranges::for_each_result<borrowed_iterator_t<R>, Fun>
275 ranges::for_each(R&& r, Fun f, Proj proj = {}); // since C++20
277 template<input_iterator I, class Proj = identity,
278 indirectly_unary_invocable<projected<I, Proj>> Fun>
279 constexpr ranges::for_each_n_result<I, Fun>
280 ranges::for_each_n(I first, iter_difference_t<I> n, Fun f, Proj proj = {}); // since C++20
282 template<input_iterator I, sentinel_for<I> S, class Proj = identity,
283 indirect_unary_predicate<projected<I, Proj>> Pred>
284 constexpr bool ranges::is_partitioned(I first, S last, Pred pred, Proj proj = {}); // since C++20
286 template<input_range R, class Proj = identity,
287 indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred>
288 constexpr bool ranges::is_partitioned(R&& r, Pred pred, Proj proj = {}); // since C++20
290 template<random_access_iterator I, sentinel_for<I> S, class Comp = ranges::less,
291 class Proj = identity>
292 requires sortable<I, Comp, Proj>
294 ranges::push_heap(I first, S last, Comp comp = {}, Proj proj = {}); // since C++20
296 template<random_access_range R, class Comp = ranges::less, class Proj = identity>
297 requires sortable<iterator_t<R>, Comp, Proj>
298 constexpr borrowed_iterator_t<R>
299 ranges::push_heap(R&& r, Comp comp = {}, Proj proj = {}); // since C++20
301 template<random_access_iterator I, sentinel_for<I> S, class Comp = ranges::less,
302 class Proj = identity>
303 requires sortable<I, Comp, Proj>
305 ranges::pop_heap(I first, S last, Comp comp = {}, Proj proj = {}); // since C++20
307 template<random_access_range R, class Comp = ranges::less, class Proj = identity>
308 requires sortable<iterator_t<R>, Comp, Proj>
309 constexpr borrowed_iterator_t<R>
310 ranges::pop_heap(R&& r, Comp comp = {}, Proj proj = {}); // since C++20
312 template<random_access_iterator I, sentinel_for<I> S, class Comp = ranges::less,
313 class Proj = identity>
314 requires sortable<I, Comp, Proj>
316 ranges::make_heap(I first, S last, Comp comp = {}, Proj proj = {}); // since C++20
318 template<random_access_range R, class Comp = ranges::less, class Proj = identity>
319 requires sortable<iterator_t<R>, Comp, Proj>
320 constexpr borrowed_iterator_t<R>
321 ranges::make_heap(R&& r, Comp comp = {}, Proj proj = {}); // since C++20
323 template<random_access_iterator I, sentinel_for<I> S, class Comp = ranges::less,
324 class Proj = identity>
325 requires sortable<I, Comp, Proj>
327 ranges::sort_heap(I first, S last, Comp comp = {}, Proj proj = {}); // since C++20
329 template<random_access_range R, class Comp = ranges::less, class Proj = identity>
330 requires sortable<iterator_t<R>, Comp, Proj>
331 constexpr borrowed_iterator_t<R>
332 ranges::sort_heap(R&& r, Comp comp = {}, Proj proj = {}); // since C++20
334 template<random_access_iterator I, sentinel_for<I> S, class Proj = identity,
335 indirect_strict_weak_order<projected<I, Proj>> Comp = ranges::less>
336 constexpr bool is_heap(I first, S last, Comp comp = {}, Proj proj = {}); // since C++20
338 template<random_access_range R, class Proj = identity,
339 indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less>
340 constexpr bool is_heap(R&& r, Comp comp = {}, Proj proj = {}); // since C++20
342 template<random_access_iterator I, sentinel_for<I> S, class Proj = identity,
343 indirect_strict_weak_order<projected<I, Proj>> Comp = ranges::less>
344 constexpr I is_heap_until(I first, S last, Comp comp = {}, Proj proj = {}); // since C++20
346 template<random_access_range R, class Proj = identity,
347 indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less>
348 constexpr borrowed_iterator_t<R>
349 is_heap_until(R&& r, Comp comp = {}, Proj proj = {}); // since C++20
351 template<bidirectional_iterator I, sentinel_for<I> S>
352 requires permutable<I>
353 constexpr I ranges::reverse(I first, S last); // since C++20
355 template<bidirectional_range R>
356 requires permutable<iterator_t<R>>
357 constexpr borrowed_iterator_t<R> ranges::reverse(R&& r); // since C++20
359 template<random_access_iterator I, sentinel_for<I> S, class Comp = ranges::less,
360 class Proj = identity>
361 requires sortable<I, Comp, Proj>
363 ranges::sort(I first, S last, Comp comp = {}, Proj proj = {}); // since C++20
365 template<random_access_range R, class Comp = ranges::less, class Proj = identity>
366 requires sortable<iterator_t<R>, Comp, Proj>
367 constexpr borrowed_iterator_t<R>
368 ranges::sort(R&& r, Comp comp = {}, Proj proj = {}); // since C++20
370 template<random_access_iterator I, sentinel_for<I> S, class Comp = ranges::less,
371 class Proj = identity>
372 requires sortable<I, Comp, Proj>
373 I ranges::stable_sort(I first, S last, Comp comp = {}, Proj proj = {}); // since C++20
375 template<random_access_range R, class Comp = ranges::less, class Proj = identity>
376 requires sortable<iterator_t<R>, Comp, Proj>
377 borrowed_iterator_t<R>
378 ranges::stable_sort(R&& r, Comp comp = {}, Proj proj = {}); // since C++20
380 template<random_access_iterator I, sentinel_for<I> S, class Comp = ranges::less,
381 class Proj = identity>
382 requires sortable<I, Comp, Proj>
384 ranges::partial_sort(I first, I middle, S last, Comp comp = {}, Proj proj = {}); // since C++20
386 template<random_access_range R, class Comp = ranges::less, class Proj = identity>
387 requires sortable<iterator_t<R>, Comp, Proj>
388 constexpr borrowed_iterator_t<R>
389 ranges::partial_sort(R&& r, iterator_t<R> middle, Comp comp = {}, Proj proj = {}); // since C++20
391 template<class T, output_iterator<const T&> O, sentinel_for<O> S>
392 constexpr O ranges::fill(O first, S last, const T& value); // since C++20
394 template<class T, output_range<const T&> R>
395 constexpr borrowed_iterator_t<R> ranges::fill(R&& r, const T& value); // since C++20
397 template<class T, output_iterator<const T&> O>
398 constexpr O ranges::fill_n(O first, iter_difference_t<O> n, const T& value); // since C++20
400 template<input_or_output_iterator O, sentinel_for<O> S, copy_constructible F>
401 requires invocable<F&> && indirectly_writable<O, invoke_result_t<F&>>
402 constexpr O generate(O first, S last, F gen); // since C++20
404 template<class ExecutionPolicy, class ForwardIterator, class Generator>
405 void generate(ExecutionPolicy&& exec,
406 ForwardIterator first, ForwardIterator last,
407 Generator gen); // since C++17
409 template<class R, copy_constructible F>
410 requires invocable<F&> && output_range<R, invoke_result_t<F&>>
411 constexpr borrowed_iterator_t<R> generate(R&& r, F gen); // since C++20
413 template<input_or_output_iterator O, copy_constructible F>
414 requires invocable<F&> && indirectly_writable<O, invoke_result_t<F&>>
415 constexpr O generate_n(O first, iter_difference_t<O> n, F gen); // since C++20
417 template<class ExecutionPolicy, class ForwardIterator, class Size, class Generator>
418 ForwardIterator generate_n(ExecutionPolicy&& exec,
419 ForwardIterator first, Size n, Generator gen); // since C++17
421 template<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2,
422 class Pred = ranges::equal_to, class Proj1 = identity, class Proj2 = identity>
423 requires indirectly_comparable<I1, I2, Pred, Proj1, Proj2>
424 constexpr bool ranges::equal(I1 first1, S1 last1, I2 first2, S2 last2,
426 Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20
428 template<input_range R1, input_range R2, class Pred = ranges::equal_to,
429 class Proj1 = identity, class Proj2 = identity>
430 requires indirectly_comparable<iterator_t<R1>, iterator_t<R2>, Pred, Proj1, Proj2>
431 constexpr bool ranges::equal(R1&& r1, R2&& r2, Pred pred = {},
432 Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20
434 template<input_iterator I, sentinel_for<I> S, class Proj = identity,
435 indirect_unary_predicate<projected<I, Proj>> Pred>
436 constexpr bool ranges::all_of(I first, S last, Pred pred, Proj proj = {}); // since C++20
438 template<input_range R, class Proj = identity,
439 indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred>
440 constexpr bool ranges::all_of(R&& r, Pred pred, Proj proj = {}); // since C++20
442 template<input_iterator I, sentinel_for<I> S, class Proj = identity,
443 indirect_unary_predicate<projected<I, Proj>> Pred>
444 constexpr bool ranges::any_of(I first, S last, Pred pred, Proj proj = {}); // since C++20
446 template<input_range R, class Proj = identity,
447 indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred>
448 constexpr bool ranges::any_of(R&& r, Pred pred, Proj proj = {}); // since C++20
450 template<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2,
451 class Pred = ranges::equal_to, class Proj1 = identity, class Proj2 = identity>
452 requires (forward_iterator<I1> || sized_sentinel_for<S1, I1>) &&
453 (forward_iterator<I2> || sized_sentinel_for<S2, I2>) &&
454 indirectly_comparable<I1, I2, Pred, Proj1, Proj2>
455 constexpr bool ranges::ends_with(I1 first1, S1 last1, I2 first2, S2 last2, Pred pred = {},
456 Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++23
458 template<input_range R1, input_range R2, class Pred = ranges::equal_to, class Proj1 = identity,
459 class Proj2 = identity>
460 requires (forward_range<R1> || sized_range<R1>) &&
461 (forward_range<R2> || sized_range<R2>) &&
462 indirectly_comparable<iterator_t<R1>, iterator_t<R2>, Pred, Proj1, Proj2>
463 constexpr bool ranges::ends_with(R1&& r1, R2&& r2, Pred pred = {},
464 Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++23
466 template<input_iterator I, sentinel_for<I> S, class Proj = identity,
467 indirect_unary_predicate<projected<I, Proj>> Pred>
468 constexpr bool ranges::none_of(I first, S last, Pred pred, Proj proj = {}); // since C++20
470 template<input_range R, class Proj = identity,
471 indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred>
472 constexpr bool ranges::none_of(R&& r, Pred pred, Proj proj = {}); // since C++20
474 template<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2,
475 class Pred = ranges::equal_to, class Proj1 = identity, class Proj2 = identity>
476 requires indirectly_comparable<I1, I2, Pred, Proj1, Proj2>
477 constexpr bool ranges::starts_with(I1 first1, S1 last1, I2 first2, S2 last2, Pred pred = {},
478 Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++23
480 template<input_range R1, input_range R2, class Pred = ranges::equal_to, class Proj1 = identity,
481 class Proj2 = identity>
482 requires indirectly_comparable<iterator_t<R1>, iterator_t<R2>, Pred, Proj1, Proj2>
483 constexpr bool ranges::starts_with(R1&& r1, R2&& r2, Pred pred = {},
484 Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++23
486 template<input_iterator I1, sentinel_for<I1> S1,
487 random_access_iterator I2, sentinel_for<I2> S2,
488 class Comp = ranges::less, class Proj1 = identity, class Proj2 = identity>
489 requires indirectly_copyable<I1, I2> && sortable<I2, Comp, Proj2> &&
490 indirect_strict_weak_order<Comp, projected<I1, Proj1>, projected<I2, Proj2>>
491 constexpr partial_sort_copy_result<I1, I2>
492 partial_sort_copy(I1 first, S1 last, I2 result_first, S2 result_last,
493 Comp comp = {}, Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20
495 template<input_range R1, random_access_range R2, class Comp = ranges::less,
496 class Proj1 = identity, class Proj2 = identity>
497 requires indirectly_copyable<iterator_t<R1>, iterator_t<R2>> &&
498 sortable<iterator_t<R2>, Comp, Proj2> &&
499 indirect_strict_weak_order<Comp, projected<iterator_t<R1>, Proj1>,
500 projected<iterator_t<R2>, Proj2>>
501 constexpr partial_sort_copy_result<borrowed_iterator_t<R1>, borrowed_iterator_t<R2>>
502 partial_sort_copy(R1&& r, R2&& result_r, Comp comp = {},
503 Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20
505 template<forward_iterator I, sentinel_for<I> S, class Proj = identity,
506 indirect_strict_weak_order<projected<I, Proj>> Comp = ranges::less>
507 constexpr bool ranges::is_sorted(I first, S last, Comp comp = {}, Proj proj = {}); // since C++20
509 template<forward_range R, class Proj = identity,
510 indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less>
511 constexpr bool ranges::is_sorted(R&& r, Comp comp = {}, Proj proj = {}); // since C++20
513 template<forward_iterator I, sentinel_for<I> S, class Proj = identity,
514 indirect_strict_weak_order<projected<I, Proj>> Comp = ranges::less>
515 constexpr I ranges::is_sorted_until(I first, S last, Comp comp = {}, Proj proj = {}); // since C++20
517 template<forward_range R, class Proj = identity,
518 indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less>
519 constexpr borrowed_iterator_t<R>
520 ranges::is_sorted_until(R&& r, Comp comp = {}, Proj proj = {}); // since C++20
522 template<random_access_iterator I, sentinel_for<I> S, class Comp = ranges::less,
523 class Proj = identity>
524 requires sortable<I, Comp, Proj>
526 ranges::nth_element(I first, I nth, S last, Comp comp = {}, Proj proj = {}); // since C++20
528 template<random_access_range R, class Comp = ranges::less, class Proj = identity>
529 requires sortable<iterator_t<R>, Comp, Proj>
530 constexpr borrowed_iterator_t<R>
531 ranges::nth_element(R&& r, iterator_t<R> nth, Comp comp = {}, Proj proj = {}); // since C++20
533 template<forward_iterator I, sentinel_for<I> S, class T, class Proj = identity,
534 indirect_strict_weak_order<const T*, projected<I, Proj>> Comp = ranges::less> // since C++20
535 constexpr I upper_bound(I first, S last, const T& value, Comp comp = {}, Proj proj = {});
537 template<forward_range R, class T, class Proj = identity,
538 indirect_strict_weak_order<const T*, projected<iterator_t<R>, Proj>> Comp =
540 constexpr borrowed_iterator_t<R>
541 upper_bound(R&& r, const T& value, Comp comp = {}, Proj proj = {}); // since C++20
543 template<forward_iterator I, sentinel_for<I> S, class T, class Proj = identity,
544 indirect_strict_weak_order<const T*, projected<I, Proj>> Comp = ranges::less>
545 constexpr I lower_bound(I first, S last, const T& value, Comp comp = {},
546 Proj proj = {}); // since C++20
547 template<forward_range R, class T, class Proj = identity,
548 indirect_strict_weak_order<const T*, projected<iterator_t<R>, Proj>> Comp =
550 constexpr borrowed_iterator_t<R>
551 lower_bound(R&& r, const T& value, Comp comp = {}, Proj proj = {}); // since C++20
553 template<forward_iterator I, sentinel_for<I> S, class T, class Proj = identity,
554 indirect_strict_weak_order<const T*, projected<I, Proj>> Comp = ranges::less>
555 constexpr bool binary_search(I first, S last, const T& value, Comp comp = {},
556 Proj proj = {}); // since C++20
558 template<forward_range R, class T, class Proj = identity,
559 indirect_strict_weak_order<const T*, projected<iterator_t<R>, Proj>> Comp =
561 constexpr bool binary_search(R&& r, const T& value, Comp comp = {},
562 Proj proj = {}); // since C++20
564 template<permutable I, sentinel_for<I> S, class Proj = identity,
565 indirect_unary_predicate<projected<I, Proj>> Pred>
566 constexpr subrange<I>
567 partition(I first, S last, Pred pred, Proj proj = {}); // since C++20
569 template<forward_range R, class Proj = identity,
570 indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred>
571 requires permutable<iterator_t<R>>
572 constexpr borrowed_subrange_t<R>
573 partition(R&& r, Pred pred, Proj proj = {}); // since C++20
575 template<bidirectional_iterator I, sentinel_for<I> S, class Proj = identity,
576 indirect_unary_predicate<projected<I, Proj>> Pred>
577 requires permutable<I>
578 subrange<I> stable_partition(I first, S last, Pred pred, Proj proj = {}); // since C++20
580 template<bidirectional_range R, class Proj = identity,
581 indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred>
582 requires permutable<iterator_t<R>>
583 borrowed_subrange_t<R> stable_partition(R&& r, Pred pred, Proj proj = {}); // since C++20
585 template<input_iterator I1, sentinel_for<I1> S1, forward_iterator I2, sentinel_for<I2> S2,
586 class Pred = ranges::equal_to, class Proj1 = identity, class Proj2 = identity>
587 requires indirectly_comparable<I1, I2, Pred, Proj1, Proj2>
588 constexpr I1 ranges::find_first_of(I1 first1, S1 last1, I2 first2, S2 last2,
590 Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20
592 template<input_range R1, forward_range R2,
593 class Pred = ranges::equal_to, class Proj1 = identity, class Proj2 = identity>
594 requires indirectly_comparable<iterator_t<R1>, iterator_t<R2>, Pred, Proj1, Proj2>
595 constexpr borrowed_iterator_t<R1>
596 ranges::find_first_of(R1&& r1, R2&& r2,
598 Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20
600 template<forward_iterator I, sentinel_for<I> S, class Proj = identity,
601 indirect_binary_predicate<projected<I, Proj>,
602 projected<I, Proj>> Pred = ranges::equal_to>
603 constexpr I ranges::adjacent_find(I first, S last, Pred pred = {}, Proj proj = {}); // since C++20
605 template<forward_range R, class Proj = identity,
606 indirect_binary_predicate<projected<iterator_t<R>, Proj>,
607 projected<iterator_t<R>, Proj>> Pred = ranges::equal_to>
608 constexpr borrowed_iterator_t<R> ranges::adjacent_find(R&& r, Pred pred = {}, Proj proj = {}); // since C++20
610 template<input_iterator I, sentinel_for<I> S, class T1, class T2, class Proj = identity>
611 requires indirectly_writable<I, const T2&> &&
612 indirect_binary_predicate<ranges::equal_to, projected<I, Proj>, const T1*>
614 ranges::replace(I first, S last, const T1& old_value, const T2& new_value, Proj proj = {}); // since C++20
616 template<input_range R, class T1, class T2, class Proj = identity>
617 requires indirectly_writable<iterator_t<R>, const T2&> &&
618 indirect_binary_predicate<ranges::equal_to, projected<iterator_t<R>, Proj>, const T1*>
619 constexpr borrowed_iterator_t<R>
620 ranges::replace(R&& r, const T1& old_value, const T2& new_value, Proj proj = {}); // since C++20
622 template<input_iterator I, sentinel_for<I> S, class T, class Proj = identity,
623 indirect_unary_predicate<projected<I, Proj>> Pred>
624 requires indirectly_writable<I, const T&>
625 constexpr I ranges::replace_if(I first, S last, Pred pred, const T& new_value, Proj proj = {}); // since C++20
627 template<input_range R, class T, class Proj = identity,
628 indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred>
629 requires indirectly_writable<iterator_t<R>, const T&>
630 constexpr borrowed_iterator_t<R>
631 ranges::replace_if(R&& r, Pred pred, const T& new_value, Proj proj = {}); // since C++20
633 template<class T, class Proj = identity,
634 indirect_strict_weak_order<projected<const T*, Proj>> Comp = ranges::less>
636 ranges::clamp(const T& v, const T& lo, const T& hi, Comp comp = {}, Proj proj = {}); // since C++20
638 template<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2,
639 class Proj1 = identity, class Proj2 = identity,
640 indirect_strict_weak_order<projected<I1, Proj1>,
641 projected<I2, Proj2>> Comp = ranges::less>
643 ranges::lexicographical_compare(I1 first1, S1 last1, I2 first2, S2 last2,
644 Comp comp = {}, Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20
646 template<input_range R1, input_range R2, class Proj1 = identity,
647 class Proj2 = identity,
648 indirect_strict_weak_order<projected<iterator_t<R1>, Proj1>,
649 projected<iterator_t<R2>, Proj2>> Comp = ranges::less>
651 ranges::lexicographical_compare(R1&& r1, R2&& r2, Comp comp = {},
652 Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20
654 template<bidirectional_iterator I1, sentinel_for<I1> S1, bidirectional_iterator I2>
655 requires indirectly_movable<I1, I2>
656 constexpr ranges::move_backward_result<I1, I2>
657 ranges::move_backward(I1 first, S1 last, I2 result); // since C++20
659 template<bidirectional_range R, bidirectional_iterator I>
660 requires indirectly_movable<iterator_t<R>, I>
661 constexpr ranges::move_backward_result<borrowed_iterator_t<R>, I>
662 ranges::move_backward(R&& r, I result); // since C++20
664 template<input_iterator I, sentinel_for<I> S, weakly_incrementable O>
665 requires indirectly_movable<I, O>
666 constexpr ranges::move_result<I, O>
667 ranges::move(I first, S last, O result); // since C++20
669 template<input_range R, weakly_incrementable O>
670 requires indirectly_movable<iterator_t<R>, O>
671 constexpr ranges::move_result<borrowed_iterator_t<R>, O>
672 ranges::move(R&& r, O result); // since C++20
674 template<class I, class O1, class O2>
675 using partition_copy_result = in_out_out_result<I, O1, O2>; // since C++20
677 template<input_iterator I, sentinel_for<I> S,
678 weakly_incrementable O1, weakly_incrementable O2,
679 class Proj = identity, indirect_unary_predicate<projected<I, Proj>> Pred>
680 requires indirectly_copyable<I, O1> && indirectly_copyable<I, O2>
681 constexpr partition_copy_result<I, O1, O2>
682 partition_copy(I first, S last, O1 out_true, O2 out_false, Pred pred,
683 Proj proj = {}); // since C++20
685 template<input_range R, weakly_incrementable O1, weakly_incrementable O2,
686 class Proj = identity,
687 indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred>
688 requires indirectly_copyable<iterator_t<R>, O1> &&
689 indirectly_copyable<iterator_t<R>, O2>
690 constexpr partition_copy_result<borrowed_iterator_t<R>, O1, O2>
691 partition_copy(R&& r, O1 out_true, O2 out_false, Pred pred, Proj proj = {}); // since C++20
693 template<forward_iterator I, sentinel_for<I> S, class Proj = identity,
694 indirect_unary_predicate<projected<I, Proj>> Pred>
695 constexpr I partition_point(I first, S last, Pred pred, Proj proj = {}); // since C++20
697 template<forward_range R, class Proj = identity,
698 indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred>
699 constexpr borrowed_iterator_t<R>
700 partition_point(R&& r, Pred pred, Proj proj = {}); // since C++20
702 template<class I1, class I2, class O>
703 using merge_result = in_in_out_result<I1, I2, O>; // since C++20
705 template<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2,
706 weakly_incrementable O, class Comp = ranges::less, class Proj1 = identity,
707 class Proj2 = identity>
708 requires mergeable<I1, I2, O, Comp, Proj1, Proj2>
709 constexpr merge_result<I1, I2, O>
710 merge(I1 first1, S1 last1, I2 first2, S2 last2, O result,
711 Comp comp = {}, Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20
713 template<input_range R1, input_range R2, weakly_incrementable O, class Comp = ranges::less,
714 class Proj1 = identity, class Proj2 = identity>
715 requires mergeable<iterator_t<R1>, iterator_t<R2>, O, Comp, Proj1, Proj2>
716 constexpr merge_result<borrowed_iterator_t<R1>, borrowed_iterator_t<R2>, O>
717 merge(R1&& r1, R2&& r2, O result,
718 Comp comp = {}, Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20
720 template<permutable I, sentinel_for<I> S, class T, class Proj = identity>
721 requires indirect_binary_predicate<ranges::equal_to, projected<I, Proj>, const T*>
722 constexpr subrange<I> ranges::remove(I first, S last, const T& value, Proj proj = {}); // since C++20
724 template<forward_range R, class T, class Proj = identity>
725 requires permutable<iterator_t<R>> &&
726 indirect_binary_predicate<ranges::equal_to, projected<iterator_t<R>, Proj>, const T*>
727 constexpr borrowed_subrange_t<R>
728 ranges::remove(R&& r, const T& value, Proj proj = {}); // since C++20
730 template<permutable I, sentinel_for<I> S, class Proj = identity,
731 indirect_unary_predicate<projected<I, Proj>> Pred>
732 constexpr subrange<I> ranges::remove_if(I first, S last, Pred pred, Proj proj = {}); // since C++20
734 template<forward_range R, class Proj = identity,
735 indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred>
736 requires permutable<iterator_t<R>>
737 constexpr borrowed_subrange_t<R>
738 ranges::remove_if(R&& r, Pred pred, Proj proj = {}); // since C++20
740 template<class I, class O>
741 using set_difference_result = in_out_result<I, O>; // since C++20
743 template<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2,
744 weakly_incrementable O, class Comp = ranges::less,
745 class Proj1 = identity, class Proj2 = identity>
746 requires mergeable<I1, I2, O, Comp, Proj1, Proj2>
747 constexpr set_difference_result<I1, O>
748 set_difference(I1 first1, S1 last1, I2 first2, S2 last2, O result,
749 Comp comp = {}, Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20
751 template<input_range R1, input_range R2, weakly_incrementable O,
752 class Comp = ranges::less, class Proj1 = identity, class Proj2 = identity>
753 requires mergeable<iterator_t<R1>, iterator_t<R2>, O, Comp, Proj1, Proj2>
754 constexpr set_difference_result<borrowed_iterator_t<R1>, O>
755 set_difference(R1&& r1, R2&& r2, O result,
756 Comp comp = {}, Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20
758 template<class I1, class I2, class O>
759 using set_intersection_result = in_in_out_result<I1, I2, O>; // since C++20
761 template<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2,
762 weakly_incrementable O, class Comp = ranges::less,
763 class Proj1 = identity, class Proj2 = identity>
764 requires mergeable<I1, I2, O, Comp, Proj1, Proj2>
765 constexpr set_intersection_result<I1, I2, O>
766 set_intersection(I1 first1, S1 last1, I2 first2, S2 last2, O result,
767 Comp comp = {}, Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20
769 template<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2,
770 weakly_incrementable O, class Comp = ranges::less,
771 class Proj1 = identity, class Proj2 = identity>
772 requires mergeable<I1, I2, O, Comp, Proj1, Proj2>
773 constexpr set_intersection_result<borrowed_iterator_t<R1>, borrowed_iterator_t<R2>, O>
774 set_intersection(R1&& r1, R2&& r2, O result,
775 Comp comp = {}, Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20
777 template <class _InIter, class _OutIter>
778 using reverse_copy_result = in_out_result<_InIter, _OutIter>; // since C++20
780 template<bidirectional_iterator I, sentinel_for<I> S, weakly_incrementable O>
781 requires indirectly_copyable<I, O>
782 constexpr ranges::reverse_copy_result<I, O>
783 ranges::reverse_copy(I first, S last, O result); // since C++20
785 template<bidirectional_range R, weakly_incrementable O>
786 requires indirectly_copyable<iterator_t<R>, O>
787 constexpr ranges::reverse_copy_result<borrowed_iterator_t<R>, O>
788 ranges::reverse_copy(R&& r, O result); // since C++20
790 template<permutable I, sentinel_for<I> S>
791 constexpr subrange<I> rotate(I first, I middle, S last); // since C++20
793 template<forward_range R>
794 requires permutable<iterator_t<R>>
795 constexpr borrowed_subrange_t<R> rotate(R&& r, iterator_t<R> middle); // since C++20
797 template <class _InIter, class _OutIter>
798 using rotate_copy_result = in_out_result<_InIter, _OutIter>; // since C++20
800 template<forward_iterator I, sentinel_for<I> S, weakly_incrementable O>
801 requires indirectly_copyable<I, O>
802 constexpr ranges::rotate_copy_result<I, O>
803 ranges::rotate_copy(I first, I middle, S last, O result); // since C++20
805 template<forward_range R, weakly_incrementable O>
806 requires indirectly_copyable<iterator_t<R>, O>
807 constexpr ranges::rotate_copy_result<borrowed_iterator_t<R>, O>
808 ranges::rotate_copy(R&& r, iterator_t<R> middle, O result); // since C++20
810 template<input_iterator I, sentinel_for<I> S, weakly_incrementable O, class Gen>
811 requires (forward_iterator<I> || random_access_iterator<O>) &&
812 indirectly_copyable<I, O> &&
813 uniform_random_bit_generator<remove_reference_t<Gen>>
814 O sample(I first, S last, O out, iter_difference_t<I> n, Gen&& g); // since C++20
816 template<input_range R, weakly_incrementable O, class Gen>
817 requires (forward_range<R> || random_access_iterator<O>) &&
818 indirectly_copyable<iterator_t<R>, O> &&
819 uniform_random_bit_generator<remove_reference_t<Gen>>
820 O sample(R&& r, O out, range_difference_t<R> n, Gen&& g); // since C++20
822 template<random_access_iterator I, sentinel_for<I> S, class Gen>
823 requires permutable<I> &&
824 uniform_random_bit_generator<remove_reference_t<Gen>>
825 I shuffle(I first, S last, Gen&& g); // since C++20
827 template<random_access_range R, class Gen>
828 requires permutable<iterator_t<R>> &&
829 uniform_random_bit_generator<remove_reference_t<Gen>>
830 borrowed_iterator_t<R> shuffle(R&& r, Gen&& g); // since C++20
832 template<forward_iterator I1, sentinel_for<I1> S1, forward_iterator I2,
833 sentinel_for<I2> S2, class Proj1 = identity, class Proj2 = identity,
834 indirect_equivalence_relation<projected<I1, Proj1>,
835 projected<I2, Proj2>> Pred = ranges::equal_to>
836 constexpr bool ranges::is_permutation(I1 first1, S1 last1, I2 first2, S2 last2,
838 Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20
840 template<forward_range R1, forward_range R2,
841 class Proj1 = identity, class Proj2 = identity,
842 indirect_equivalence_relation<projected<iterator_t<R1>, Proj1>,
843 projected<iterator_t<R2>, Proj2>> Pred = ranges::equal_to>
844 constexpr bool ranges::is_permutation(R1&& r1, R2&& r2, Pred pred = {},
845 Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20
847 template<forward_iterator I1, sentinel_for<I1> S1, forward_iterator I2,
848 sentinel_for<I2> S2, class Pred = ranges::equal_to,
849 class Proj1 = identity, class Proj2 = identity>
850 requires indirectly_comparable<I1, I2, Pred, Proj1, Proj2>
851 constexpr subrange<I1>
852 ranges::search(I1 first1, S1 last1, I2 first2, S2 last2, Pred pred = {},
853 Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20
855 template<forward_range R1, forward_range R2, class Pred = ranges::equal_to,
856 class Proj1 = identity, class Proj2 = identity>
857 requires indirectly_comparable<iterator_t<R1>, iterator_t<R2>, Pred, Proj1, Proj2>
858 constexpr borrowed_subrange_t<R1>
859 ranges::search(R1&& r1, R2&& r2, Pred pred = {},
860 Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20
862 template<forward_iterator I, sentinel_for<I> S, class T,
863 class Pred = ranges::equal_to, class Proj = identity>
864 requires indirectly_comparable<I, const T*, Pred, Proj>
865 constexpr subrange<I>
866 ranges::search_n(I first, S last, iter_difference_t<I> count,
867 const T& value, Pred pred = {}, Proj proj = {}); // since C++20
869 template<forward_range R, class T, class Pred = ranges::equal_to,
870 class Proj = identity>
871 requires indirectly_comparable<iterator_t<R>, const T*, Pred, Proj>
872 constexpr borrowed_subrange_t<R>
873 ranges::search_n(R&& r, range_difference_t<R> count,
874 const T& value, Pred pred = {}, Proj proj = {}); // since C++20
876 template<forward_iterator I1, sentinel_for<I1> S1, forward_iterator I2, sentinel_for<I2> S2,
877 class Pred = ranges::equal_to, class Proj1 = identity, class Proj2 = identity>
878 requires indirectly_comparable<I1, I2, Pred, Proj1, Proj2>
879 constexpr subrange<I1>
880 ranges::find_end(I1 first1, S1 last1, I2 first2, S2 last2, Pred pred = {},
881 Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20
883 template<forward_range R1, forward_range R2,
884 class Pred = ranges::equal_to, class Proj1 = identity, class Proj2 = identity>
885 requires indirectly_comparable<iterator_t<R1>, iterator_t<R2>, Pred, Proj1, Proj2>
886 constexpr borrowed_subrange_t<R1>
887 ranges::find_end(R1&& r1, R2&& r2, Pred pred = {},
888 Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20
890 template<class I1, class I2, class O>
891 using set_symmetric_difference_result = in_in_out_result<I1, I2, O>; // since C++20
893 template<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2,
894 weakly_incrementable O, class Comp = ranges::less,
895 class Proj1 = identity, class Proj2 = identity>
896 requires mergeable<I1, I2, O, Comp, Proj1, Proj2>
897 constexpr set_symmetric_difference_result<I1, I2, O>
898 set_symmetric_difference(I1 first1, S1 last1, I2 first2, S2 last2, O result,
899 Comp comp = {}, Proj1 proj1 = {},
900 Proj2 proj2 = {}); // since C++20
902 template<input_range R1, input_range R2, weakly_incrementable O,
903 class Comp = ranges::less, class Proj1 = identity, class Proj2 = identity>
904 requires mergeable<iterator_t<R1>, iterator_t<R2>, O, Comp, Proj1, Proj2>
905 constexpr set_symmetric_difference_result<borrowed_iterator_t<R1>,
906 borrowed_iterator_t<R2>, O>
907 set_symmetric_difference(R1&& r1, R2&& r2, O result, Comp comp = {},
908 Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20
910 template<forward_iterator I, sentinel_for<I> S, class T, class Proj = identity,
911 indirect_strict_weak_order<const T*, projected<I, Proj>> Comp = ranges::less>
912 constexpr subrange<I>
913 equal_range(I first, S last, const T& value, Comp comp = {}, Proj proj = {}); // since C++20
915 template<forward_range R, class T, class Proj = identity,
916 indirect_strict_weak_order<const T*, projected<iterator_t<R>, Proj>> Comp =
918 constexpr borrowed_subrange_t<R>
919 equal_range(R&& r, const T& value, Comp comp = {}, Proj proj = {}); // since C++20
921 template<class I1, class I2, class O>
922 using set_union_result = in_in_out_result<I1, I2, O>; // since C++20
924 template<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2,
925 weakly_incrementable O, class Comp = ranges::less,
926 class Proj1 = identity, class Proj2 = identity>
927 requires mergeable<I1, I2, O, Comp, Proj1, Proj2>
928 constexpr set_union_result<I1, I2, O>
929 set_union(I1 first1, S1 last1, I2 first2, S2 last2, O result, Comp comp = {},
930 Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20
932 template<input_range R1, input_range R2, weakly_incrementable O,
933 class Comp = ranges::less, class Proj1 = identity, class Proj2 = identity>
934 requires mergeable<iterator_t<R1>, iterator_t<R2>, O, Comp, Proj1, Proj2>
935 constexpr set_union_result<borrowed_iterator_t<R1>, borrowed_iterator_t<R2>, O>
936 set_union(R1&& r1, R2&& r2, O result, Comp comp = {},
937 Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20
939 template<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2,
940 class Proj1 = identity, class Proj2 = identity,
941 indirect_strict_weak_order<projected<I1, Proj1>, projected<I2, Proj2>> Comp =
943 constexpr bool includes(I1 first1, S1 last1, I2 first2, S2 last2, Comp comp = {},
944 Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20
946 template<input_range R1, input_range R2, class Proj1 = identity,
947 class Proj2 = identity,
948 indirect_strict_weak_order<projected<iterator_t<R1>, Proj1>,
949 projected<iterator_t<R2>, Proj2>> Comp = ranges::less>
950 constexpr bool includes(R1&& r1, R2&& r2, Comp comp = {},
951 Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20
953 template<bidirectional_iterator I, sentinel_for<I> S, class Comp = ranges::less,
954 class Proj = identity>
955 requires sortable<I, Comp, Proj>
956 I inplace_merge(I first, I middle, S last, Comp comp = {}, Proj proj = {}); // since C++20
958 template<bidirectional_range R, class Comp = ranges::less, class Proj = identity>
959 requires sortable<iterator_t<R>, Comp, Proj>
960 borrowed_iterator_t<R>
961 inplace_merge(R&& r, iterator_t<R> middle, Comp comp = {},
962 Proj proj = {}); // since C++20
964 template<permutable I, sentinel_for<I> S, class Proj = identity,
965 indirect_equivalence_relation<projected<I, Proj>> C = ranges::equal_to>
966 constexpr subrange<I> unique(I first, S last, C comp = {}, Proj proj = {}); // since C++20
968 template<forward_range R, class Proj = identity,
969 indirect_equivalence_relation<projected<iterator_t<R>, Proj>> C = ranges::equal_to>
970 requires permutable<iterator_t<R>>
971 constexpr borrowed_subrange_t<R>
972 unique(R&& r, C comp = {}, Proj proj = {}); // since C++20
974 template<input_iterator I, sentinel_for<I> S, weakly_incrementable O, class Proj = identity,
975 indirect_equivalence_relation<projected<I, Proj>> C = ranges::equal_to>
976 requires indirectly_copyable<I, O> &&
977 (forward_iterator<I> ||
978 (input_iterator<O> && same_as<iter_value_t<I>, iter_value_t<O>>) ||
979 indirectly_copyable_storable<I, O>)
980 constexpr unique_copy_result<I, O>
981 unique_copy(I first, S last, O result, C comp = {}, Proj proj = {}); // since C++20
983 template<input_range R, weakly_incrementable O, class Proj = identity,
984 indirect_equivalence_relation<projected<iterator_t<R>, Proj>> C = ranges::equal_to>
985 requires indirectly_copyable<iterator_t<R>, O> &&
986 (forward_iterator<iterator_t<R>> ||
987 (input_iterator<O> && same_as<range_value_t<R>, iter_value_t<O>>) ||
988 indirectly_copyable_storable<iterator_t<R>, O>)
989 constexpr unique_copy_result<borrowed_iterator_t<R>, O>
990 unique_copy(R&& r, O result, C comp = {}, Proj proj = {}); // since C++20
992 template<class I, class O>
993 using remove_copy_result = in_out_result<I, O>; // since C++20
995 template<input_iterator I, sentinel_for<I> S, weakly_incrementable O, class T,
996 class Proj = identity>
997 indirect_binary_predicate<ranges::equal_to, projected<I, Proj>, const T*>
998 constexpr remove_copy_result<I, O>
999 remove_copy(I first, S last, O result, const T& value, Proj proj = {}); // since C++20
1001 template<input_range R, weakly_incrementable O, class T, class Proj = identity>
1002 requires indirectly_copyable<iterator_t<R>, O> &&
1003 indirect_binary_predicate<ranges::equal_to,
1004 projected<iterator_t<R>, Proj>, const T*>
1005 constexpr remove_copy_result<borrowed_iterator_t<R>, O>
1006 remove_copy(R&& r, O result, const T& value, Proj proj = {}); // since C++20
1008 template<class I, class O>
1009 using remove_copy_if_result = in_out_result<I, O>; // since C++20
1011 template<input_iterator I, sentinel_for<I> S, weakly_incrementable O,
1012 class Proj = identity, indirect_unary_predicate<projected<I, Proj>> Pred>
1013 requires indirectly_copyable<I, O>
1014 constexpr remove_copy_if_result<I, O>
1015 remove_copy_if(I first, S last, O result, Pred pred, Proj proj = {}); // since C++20
1017 template<input_range R, weakly_incrementable O, class Proj = identity,
1018 indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred>
1019 requires indirectly_copyable<iterator_t<R>, O>
1020 constexpr remove_copy_if_result<borrowed_iterator_t<R>, O>
1021 remove_copy_if(R&& r, O result, Pred pred, Proj proj = {}); // since C++20
1023 template<class I, class O>
1024 using replace_copy_result = in_out_result<I, O>; // since C++20
1026 template<input_iterator I, sentinel_for<I> S, class T1, class T2,
1027 output_iterator<const T2&> O, class Proj = identity>
1028 requires indirectly_copyable<I, O> &&
1029 indirect_binary_predicate<ranges::equal_to, projected<I, Proj>, const T1*>
1030 constexpr replace_copy_result<I, O>
1031 replace_copy(I first, S last, O result, const T1& old_value, const T2& new_value,
1032 Proj proj = {}); // since C++20
1034 template<input_range R, class T1, class T2, output_iterator<const T2&> O,
1035 class Proj = identity>
1036 requires indirectly_copyable<iterator_t<R>, O> &&
1037 indirect_binary_predicate<ranges::equal_to,
1038 projected<iterator_t<R>, Proj>, const T1*>
1039 constexpr replace_copy_result<borrowed_iterator_t<R>, O>
1040 replace_copy(R&& r, O result, const T1& old_value, const T2& new_value,
1041 Proj proj = {}); // since C++20
1043 template<class I, class O>
1044 using replace_copy_if_result = in_out_result<I, O>; // since C++20
1046 template<input_iterator I, sentinel_for<I> S, class T, output_iterator<const T&> O,
1047 class Proj = identity, indirect_unary_predicate<projected<I, Proj>> Pred>
1048 requires indirectly_copyable<I, O>
1049 constexpr replace_copy_if_result<I, O>
1050 replace_copy_if(I first, S last, O result, Pred pred, const T& new_value,
1051 Proj proj = {}); // since C++20
1053 template<input_range R, class T, output_iterator<const T&> O, class Proj = identity,
1054 indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred>
1055 requires indirectly_copyable<iterator_t<R>, O>
1056 constexpr replace_copy_if_result<borrowed_iterator_t<R>, O>
1057 replace_copy_if(R&& r, O result, Pred pred, const T& new_value,
1058 Proj proj = {}); // since C++20
1061 using prev_permutation_result = in_found_result<I>; // since C++20
1063 template<bidirectional_iterator I, sentinel_for<I> S, class Comp = ranges::less,
1064 class Proj = identity>
1065 requires sortable<I, Comp, Proj>
1066 constexpr ranges::prev_permutation_result<I>
1067 ranges::prev_permutation(I first, S last, Comp comp = {}, Proj proj = {}); // since C++20
1069 template<bidirectional_range R, class Comp = ranges::less,
1070 class Proj = identity>
1071 requires sortable<iterator_t<R>, Comp, Proj>
1072 constexpr ranges::prev_permutation_result<borrowed_iterator_t<R>>
1073 ranges::prev_permutation(R&& r, Comp comp = {}, Proj proj = {}); // since C++20
1076 using next_permutation_result = in_found_result<I>; // since C++20
1078 template<bidirectional_iterator I, sentinel_for<I> S, class Comp = ranges::less,
1079 class Proj = identity>
1080 requires sortable<I, Comp, Proj>
1081 constexpr ranges::next_permutation_result<I>
1082 ranges::next_permutation(I first, S last, Comp comp = {}, Proj proj = {}); // since C++20
1084 template<bidirectional_range R, class Comp = ranges::less,
1085 class Proj = identity>
1086 requires sortable<iterator_t<R>, Comp, Proj>
1087 constexpr ranges::next_permutation_result<borrowed_iterator_t<R>>
1088 ranges::next_permutation(R&& r, Comp comp = {}, Proj proj = {}); // since C++20
1092 template <class InputIterator, class Predicate>
1093 constexpr bool // constexpr in C++20
1094 all_of(InputIterator first, InputIterator last, Predicate pred);
1096 template <class InputIterator, class Predicate>
1097 constexpr bool // constexpr in C++20
1098 any_of(InputIterator first, InputIterator last, Predicate pred);
1100 template <class InputIterator, class Predicate>
1101 constexpr bool // constexpr in C++20
1102 none_of(InputIterator first, InputIterator last, Predicate pred);
1104 template <class InputIterator, class Function>
1105 constexpr Function // constexpr in C++20
1106 for_each(InputIterator first, InputIterator last, Function f);
1108 template<class InputIterator, class Size, class Function>
1109 constexpr InputIterator // constexpr in C++20
1110 for_each_n(InputIterator first, Size n, Function f); // C++17
1112 template <class InputIterator, class T>
1113 constexpr InputIterator // constexpr in C++20
1114 find(InputIterator first, InputIterator last, const T& value);
1116 template <class InputIterator, class Predicate>
1117 constexpr InputIterator // constexpr in C++20
1118 find_if(InputIterator first, InputIterator last, Predicate pred);
1120 template<class InputIterator, class Predicate>
1121 constexpr InputIterator // constexpr in C++20
1122 find_if_not(InputIterator first, InputIterator last, Predicate pred);
1124 template <class ForwardIterator1, class ForwardIterator2>
1125 constexpr ForwardIterator1 // constexpr in C++20
1126 find_end(ForwardIterator1 first1, ForwardIterator1 last1,
1127 ForwardIterator2 first2, ForwardIterator2 last2);
1129 template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
1130 constexpr ForwardIterator1 // constexpr in C++20
1131 find_end(ForwardIterator1 first1, ForwardIterator1 last1,
1132 ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
1134 template <class ForwardIterator1, class ForwardIterator2>
1135 constexpr ForwardIterator1 // constexpr in C++20
1136 find_first_of(ForwardIterator1 first1, ForwardIterator1 last1,
1137 ForwardIterator2 first2, ForwardIterator2 last2);
1139 template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
1140 constexpr ForwardIterator1 // constexpr in C++20
1141 find_first_of(ForwardIterator1 first1, ForwardIterator1 last1,
1142 ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
1144 template <class ForwardIterator>
1145 constexpr ForwardIterator // constexpr in C++20
1146 adjacent_find(ForwardIterator first, ForwardIterator last);
1148 template <class ForwardIterator, class BinaryPredicate>
1149 constexpr ForwardIterator // constexpr in C++20
1150 adjacent_find(ForwardIterator first, ForwardIterator last, BinaryPredicate pred);
1152 template <class InputIterator, class T>
1153 constexpr typename iterator_traits<InputIterator>::difference_type // constexpr in C++20
1154 count(InputIterator first, InputIterator last, const T& value);
1156 template <class InputIterator, class Predicate>
1157 constexpr typename iterator_traits<InputIterator>::difference_type // constexpr in C++20
1158 count_if(InputIterator first, InputIterator last, Predicate pred);
1160 template <class InputIterator1, class InputIterator2>
1161 constexpr pair<InputIterator1, InputIterator2> // constexpr in C++20
1162 mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2);
1164 template <class InputIterator1, class InputIterator2>
1165 constexpr pair<InputIterator1, InputIterator2> // constexpr in C++20
1166 mismatch(InputIterator1 first1, InputIterator1 last1,
1167 InputIterator2 first2, InputIterator2 last2); // **C++14**
1169 template <class InputIterator1, class InputIterator2, class BinaryPredicate>
1170 constexpr pair<InputIterator1, InputIterator2> // constexpr in C++20
1171 mismatch(InputIterator1 first1, InputIterator1 last1,
1172 InputIterator2 first2, BinaryPredicate pred);
1174 template <class InputIterator1, class InputIterator2, class BinaryPredicate>
1175 constexpr pair<InputIterator1, InputIterator2> // constexpr in C++20
1176 mismatch(InputIterator1 first1, InputIterator1 last1,
1177 InputIterator2 first2, InputIterator2 last2,
1178 BinaryPredicate pred); // **C++14**
1180 template <class InputIterator1, class InputIterator2>
1181 constexpr bool // constexpr in C++20
1182 equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2);
1184 template <class InputIterator1, class InputIterator2>
1185 constexpr bool // constexpr in C++20
1186 equal(InputIterator1 first1, InputIterator1 last1,
1187 InputIterator2 first2, InputIterator2 last2); // **C++14**
1189 template <class InputIterator1, class InputIterator2, class BinaryPredicate>
1190 constexpr bool // constexpr in C++20
1191 equal(InputIterator1 first1, InputIterator1 last1,
1192 InputIterator2 first2, BinaryPredicate pred);
1194 template <class InputIterator1, class InputIterator2, class BinaryPredicate>
1195 constexpr bool // constexpr in C++20
1196 equal(InputIterator1 first1, InputIterator1 last1,
1197 InputIterator2 first2, InputIterator2 last2,
1198 BinaryPredicate pred); // **C++14**
1200 template<class ForwardIterator1, class ForwardIterator2>
1201 constexpr bool // constexpr in C++20
1202 is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
1203 ForwardIterator2 first2);
1205 template<class ForwardIterator1, class ForwardIterator2>
1206 constexpr bool // constexpr in C++20
1207 is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
1208 ForwardIterator2 first2, ForwardIterator2 last2); // **C++14**
1210 template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
1211 constexpr bool // constexpr in C++20
1212 is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
1213 ForwardIterator2 first2, BinaryPredicate pred);
1215 template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
1216 constexpr bool // constexpr in C++20
1217 is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
1218 ForwardIterator2 first2, ForwardIterator2 last2,
1219 BinaryPredicate pred); // **C++14**
1221 template <class ForwardIterator1, class ForwardIterator2>
1222 constexpr ForwardIterator1 // constexpr in C++20
1223 search(ForwardIterator1 first1, ForwardIterator1 last1,
1224 ForwardIterator2 first2, ForwardIterator2 last2);
1226 template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
1227 constexpr ForwardIterator1 // constexpr in C++20
1228 search(ForwardIterator1 first1, ForwardIterator1 last1,
1229 ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
1231 template <class ForwardIterator, class Size, class T>
1232 constexpr ForwardIterator // constexpr in C++20
1233 search_n(ForwardIterator first, ForwardIterator last, Size count, const T& value);
1235 template <class ForwardIterator, class Size, class T, class BinaryPredicate>
1236 constexpr ForwardIterator // constexpr in C++20
1237 search_n(ForwardIterator first, ForwardIterator last,
1238 Size count, const T& value, BinaryPredicate pred);
1240 template <class InputIterator, class OutputIterator>
1241 constexpr OutputIterator // constexpr in C++20
1242 copy(InputIterator first, InputIterator last, OutputIterator result);
1244 template<class InputIterator, class OutputIterator, class Predicate>
1245 constexpr OutputIterator // constexpr in C++20
1246 copy_if(InputIterator first, InputIterator last,
1247 OutputIterator result, Predicate pred);
1249 template<class InputIterator, class Size, class OutputIterator>
1250 constexpr OutputIterator // constexpr in C++20
1251 copy_n(InputIterator first, Size n, OutputIterator result);
1253 template <class BidirectionalIterator1, class BidirectionalIterator2>
1254 constexpr BidirectionalIterator2 // constexpr in C++20
1255 copy_backward(BidirectionalIterator1 first, BidirectionalIterator1 last,
1256 BidirectionalIterator2 result);
1259 template<class InputIterator, class OutputIterator>
1260 constexpr OutputIterator move(InputIterator first, InputIterator last,
1261 OutputIterator result);
1263 template<class BidirectionalIterator1, class BidirectionalIterator2>
1264 constexpr BidirectionalIterator2
1265 move_backward(BidirectionalIterator1 first, BidirectionalIterator1 last,
1266 BidirectionalIterator2 result);
1268 template <class ForwardIterator1, class ForwardIterator2>
1269 constexpr ForwardIterator2 // constexpr in C++20
1270 swap_ranges(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2);
1273 template<class I1, class I2>
1274 using swap_ranges_result = in_in_result<I1, I2>;
1276 template<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2>
1277 requires indirectly_swappable<I1, I2>
1278 constexpr ranges::swap_ranges_result<I1, I2>
1279 swap_ranges(I1 first1, S1 last1, I2 first2, S2 last2);
1281 template<input_range R1, input_range R2>
1282 requires indirectly_swappable<iterator_t<R1>, iterator_t<R2>>
1283 constexpr ranges::swap_ranges_result<borrowed_iterator_t<R1>, borrowed_iterator_t<R2>>
1284 swap_ranges(R1&& r1, R2&& r2);
1287 template <class ForwardIterator1, class ForwardIterator2>
1288 constexpr void // constexpr in C++20
1289 iter_swap(ForwardIterator1 a, ForwardIterator2 b);
1291 template <class InputIterator, class OutputIterator, class UnaryOperation>
1292 constexpr OutputIterator // constexpr in C++20
1293 transform(InputIterator first, InputIterator last, OutputIterator result, UnaryOperation op);
1295 template <class InputIterator1, class InputIterator2, class OutputIterator, class BinaryOperation>
1296 constexpr OutputIterator // constexpr in C++20
1297 transform(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2,
1298 OutputIterator result, BinaryOperation binary_op);
1300 template <class ForwardIterator, class T>
1301 constexpr void // constexpr in C++20
1302 replace(ForwardIterator first, ForwardIterator last, const T& old_value, const T& new_value);
1304 template <class ForwardIterator, class Predicate, class T>
1305 constexpr void // constexpr in C++20
1306 replace_if(ForwardIterator first, ForwardIterator last, Predicate pred, const T& new_value);
1308 template <class InputIterator, class OutputIterator, class T>
1309 constexpr OutputIterator // constexpr in C++20
1310 replace_copy(InputIterator first, InputIterator last, OutputIterator result,
1311 const T& old_value, const T& new_value);
1313 template <class InputIterator, class OutputIterator, class Predicate, class T>
1314 constexpr OutputIterator // constexpr in C++20
1315 replace_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred, const T& new_value);
1317 template <class ForwardIterator, class T>
1318 constexpr void // constexpr in C++20
1319 fill(ForwardIterator first, ForwardIterator last, const T& value);
1321 template <class OutputIterator, class Size, class T>
1322 constexpr OutputIterator // constexpr in C++20
1323 fill_n(OutputIterator first, Size n, const T& value);
1325 template <class ForwardIterator, class Generator>
1326 constexpr void // constexpr in C++20
1327 generate(ForwardIterator first, ForwardIterator last, Generator gen);
1329 template <class OutputIterator, class Size, class Generator>
1330 constexpr OutputIterator // constexpr in C++20
1331 generate_n(OutputIterator first, Size n, Generator gen);
1333 template <class ForwardIterator, class T>
1334 constexpr ForwardIterator // constexpr in C++20
1335 remove(ForwardIterator first, ForwardIterator last, const T& value);
1337 template <class ForwardIterator, class Predicate>
1338 constexpr ForwardIterator // constexpr in C++20
1339 remove_if(ForwardIterator first, ForwardIterator last, Predicate pred);
1341 template <class InputIterator, class OutputIterator, class T>
1342 constexpr OutputIterator // constexpr in C++20
1343 remove_copy(InputIterator first, InputIterator last, OutputIterator result, const T& value);
1345 template <class InputIterator, class OutputIterator, class Predicate>
1346 constexpr OutputIterator // constexpr in C++20
1347 remove_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred);
1349 template <class ForwardIterator>
1350 constexpr ForwardIterator // constexpr in C++20
1351 unique(ForwardIterator first, ForwardIterator last);
1353 template <class ForwardIterator, class BinaryPredicate>
1354 constexpr ForwardIterator // constexpr in C++20
1355 unique(ForwardIterator first, ForwardIterator last, BinaryPredicate pred);
1357 template <class InputIterator, class OutputIterator>
1358 constexpr OutputIterator // constexpr in C++20
1359 unique_copy(InputIterator first, InputIterator last, OutputIterator result);
1361 template <class InputIterator, class OutputIterator, class BinaryPredicate>
1362 constexpr OutputIterator // constexpr in C++20
1363 unique_copy(InputIterator first, InputIterator last, OutputIterator result, BinaryPredicate pred);
1365 template <class BidirectionalIterator>
1366 constexpr void // constexpr in C++20
1367 reverse(BidirectionalIterator first, BidirectionalIterator last);
1369 template <class BidirectionalIterator, class OutputIterator>
1370 constexpr OutputIterator // constexpr in C++20
1371 reverse_copy(BidirectionalIterator first, BidirectionalIterator last, OutputIterator result);
1373 template <class ForwardIterator>
1374 constexpr ForwardIterator // constexpr in C++20
1375 rotate(ForwardIterator first, ForwardIterator middle, ForwardIterator last);
1377 template <class ForwardIterator, class OutputIterator>
1378 constexpr OutputIterator // constexpr in C++20
1379 rotate_copy(ForwardIterator first, ForwardIterator middle, ForwardIterator last, OutputIterator result);
1381 template <class RandomAccessIterator>
1383 random_shuffle(RandomAccessIterator first, RandomAccessIterator last); // deprecated in C++14, removed in C++17
1385 template <class RandomAccessIterator, class RandomNumberGenerator>
1387 random_shuffle(RandomAccessIterator first, RandomAccessIterator last,
1388 RandomNumberGenerator& rand); // deprecated in C++14, removed in C++17
1390 template<class PopulationIterator, class SampleIterator,
1391 class Distance, class UniformRandomBitGenerator>
1392 SampleIterator sample(PopulationIterator first, PopulationIterator last,
1393 SampleIterator out, Distance n,
1394 UniformRandomBitGenerator&& g); // C++17
1396 template<class RandomAccessIterator, class UniformRandomNumberGenerator>
1397 void shuffle(RandomAccessIterator first, RandomAccessIterator last,
1398 UniformRandomNumberGenerator&& g);
1400 template<class ForwardIterator>
1401 constexpr ForwardIterator
1402 shift_left(ForwardIterator first, ForwardIterator last,
1403 typename iterator_traits<ForwardIterator>::difference_type n); // C++20
1405 template<class ForwardIterator>
1406 constexpr ForwardIterator
1407 shift_right(ForwardIterator first, ForwardIterator last,
1408 typename iterator_traits<ForwardIterator>::difference_type n); // C++20
1410 template <class InputIterator, class Predicate>
1411 constexpr bool // constexpr in C++20
1412 is_partitioned(InputIterator first, InputIterator last, Predicate pred);
1414 template <class ForwardIterator, class Predicate>
1415 constexpr ForwardIterator // constexpr in C++20
1416 partition(ForwardIterator first, ForwardIterator last, Predicate pred);
1418 template <class InputIterator, class OutputIterator1,
1419 class OutputIterator2, class Predicate>
1420 constexpr pair<OutputIterator1, OutputIterator2> // constexpr in C++20
1421 partition_copy(InputIterator first, InputIterator last,
1422 OutputIterator1 out_true, OutputIterator2 out_false,
1425 template <class ForwardIterator, class Predicate>
1427 stable_partition(ForwardIterator first, ForwardIterator last, Predicate pred);
1429 template<class ForwardIterator, class Predicate>
1430 constexpr ForwardIterator // constexpr in C++20
1431 partition_point(ForwardIterator first, ForwardIterator last, Predicate pred);
1433 template <class ForwardIterator>
1434 constexpr bool // constexpr in C++20
1435 is_sorted(ForwardIterator first, ForwardIterator last);
1437 template <class ForwardIterator, class Compare>
1438 constexpr bool // constexpr in C++20
1439 is_sorted(ForwardIterator first, ForwardIterator last, Compare comp);
1441 template<class ForwardIterator>
1442 constexpr ForwardIterator // constexpr in C++20
1443 is_sorted_until(ForwardIterator first, ForwardIterator last);
1445 template <class ForwardIterator, class Compare>
1446 constexpr ForwardIterator // constexpr in C++20
1447 is_sorted_until(ForwardIterator first, ForwardIterator last, Compare comp);
1449 template <class RandomAccessIterator>
1450 constexpr void // constexpr in C++20
1451 sort(RandomAccessIterator first, RandomAccessIterator last);
1453 template <class RandomAccessIterator, class Compare>
1454 constexpr void // constexpr in C++20
1455 sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
1457 template <class RandomAccessIterator>
1459 stable_sort(RandomAccessIterator first, RandomAccessIterator last);
1461 template <class RandomAccessIterator, class Compare>
1463 stable_sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
1465 template <class RandomAccessIterator>
1466 constexpr void // constexpr in C++20
1467 partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last);
1469 template <class RandomAccessIterator, class Compare>
1470 constexpr void // constexpr in C++20
1471 partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, Compare comp);
1473 template <class InputIterator, class RandomAccessIterator>
1474 constexpr RandomAccessIterator // constexpr in C++20
1475 partial_sort_copy(InputIterator first, InputIterator last,
1476 RandomAccessIterator result_first, RandomAccessIterator result_last);
1478 template <class InputIterator, class RandomAccessIterator, class Compare>
1479 constexpr RandomAccessIterator // constexpr in C++20
1480 partial_sort_copy(InputIterator first, InputIterator last,
1481 RandomAccessIterator result_first, RandomAccessIterator result_last, Compare comp);
1483 template <class RandomAccessIterator>
1484 constexpr void // constexpr in C++20
1485 nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last);
1487 template <class RandomAccessIterator, class Compare>
1488 constexpr void // constexpr in C++20
1489 nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last, Compare comp);
1491 template <class ForwardIterator, class T>
1492 constexpr ForwardIterator // constexpr in C++20
1493 lower_bound(ForwardIterator first, ForwardIterator last, const T& value);
1495 template <class ForwardIterator, class T, class Compare>
1496 constexpr ForwardIterator // constexpr in C++20
1497 lower_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
1499 template <class ForwardIterator, class T>
1500 constexpr ForwardIterator // constexpr in C++20
1501 upper_bound(ForwardIterator first, ForwardIterator last, const T& value);
1503 template <class ForwardIterator, class T, class Compare>
1504 constexpr ForwardIterator // constexpr in C++20
1505 upper_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
1507 template <class ForwardIterator, class T>
1508 constexpr pair<ForwardIterator, ForwardIterator> // constexpr in C++20
1509 equal_range(ForwardIterator first, ForwardIterator last, const T& value);
1511 template <class ForwardIterator, class T, class Compare>
1512 constexpr pair<ForwardIterator, ForwardIterator> // constexpr in C++20
1513 equal_range(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
1515 template <class ForwardIterator, class T>
1516 constexpr bool // constexpr in C++20
1517 binary_search(ForwardIterator first, ForwardIterator last, const T& value);
1519 template <class ForwardIterator, class T, class Compare>
1520 constexpr bool // constexpr in C++20
1521 binary_search(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);
1523 template <class InputIterator1, class InputIterator2, class OutputIterator>
1524 constexpr OutputIterator // constexpr in C++20
1525 merge(InputIterator1 first1, InputIterator1 last1,
1526 InputIterator2 first2, InputIterator2 last2, OutputIterator result);
1528 template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
1529 constexpr OutputIterator // constexpr in C++20
1530 merge(InputIterator1 first1, InputIterator1 last1,
1531 InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
1533 template <class BidirectionalIterator>
1535 inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last);
1537 template <class BidirectionalIterator, class Compare>
1539 inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last, Compare comp);
1541 template <class InputIterator1, class InputIterator2>
1542 constexpr bool // constexpr in C++20
1543 includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2);
1545 template <class InputIterator1, class InputIterator2, class Compare>
1546 constexpr bool // constexpr in C++20
1547 includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, Compare comp);
1549 template <class InputIterator1, class InputIterator2, class OutputIterator>
1550 constexpr OutputIterator // constexpr in C++20
1551 set_union(InputIterator1 first1, InputIterator1 last1,
1552 InputIterator2 first2, InputIterator2 last2, OutputIterator result);
1554 template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
1555 constexpr OutputIterator // constexpr in C++20
1556 set_union(InputIterator1 first1, InputIterator1 last1,
1557 InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
1559 template <class InputIterator1, class InputIterator2, class OutputIterator>
1560 constexpr OutputIterator // constexpr in C++20
1561 set_intersection(InputIterator1 first1, InputIterator1 last1,
1562 InputIterator2 first2, InputIterator2 last2, OutputIterator result);
1564 template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
1565 constexpr OutputIterator // constexpr in C++20
1566 set_intersection(InputIterator1 first1, InputIterator1 last1,
1567 InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
1569 template <class InputIterator1, class InputIterator2, class OutputIterator>
1570 constexpr OutputIterator // constexpr in C++20
1571 set_difference(InputIterator1 first1, InputIterator1 last1,
1572 InputIterator2 first2, InputIterator2 last2, OutputIterator result);
1574 template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
1575 constexpr OutputIterator // constexpr in C++20
1576 set_difference(InputIterator1 first1, InputIterator1 last1,
1577 InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
1579 template <class InputIterator1, class InputIterator2, class OutputIterator>
1580 constexpr OutputIterator // constexpr in C++20
1581 set_symmetric_difference(InputIterator1 first1, InputIterator1 last1,
1582 InputIterator2 first2, InputIterator2 last2, OutputIterator result);
1584 template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
1585 constexpr OutputIterator // constexpr in C++20
1586 set_symmetric_difference(InputIterator1 first1, InputIterator1 last1,
1587 InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp);
1589 template <class RandomAccessIterator>
1590 constexpr void // constexpr in C++20
1591 push_heap(RandomAccessIterator first, RandomAccessIterator last);
1593 template <class RandomAccessIterator, class Compare>
1594 constexpr void // constexpr in C++20
1595 push_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
1597 template <class RandomAccessIterator>
1598 constexpr void // constexpr in C++20
1599 pop_heap(RandomAccessIterator first, RandomAccessIterator last);
1601 template <class RandomAccessIterator, class Compare>
1602 constexpr void // constexpr in C++20
1603 pop_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
1605 template <class RandomAccessIterator>
1606 constexpr void // constexpr in C++20
1607 make_heap(RandomAccessIterator first, RandomAccessIterator last);
1609 template <class RandomAccessIterator, class Compare>
1610 constexpr void // constexpr in C++20
1611 make_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
1613 template <class RandomAccessIterator>
1614 constexpr void // constexpr in C++20
1615 sort_heap(RandomAccessIterator first, RandomAccessIterator last);
1617 template <class RandomAccessIterator, class Compare>
1618 constexpr void // constexpr in C++20
1619 sort_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
1621 template <class RandomAccessIterator>
1622 constexpr bool // constexpr in C++20
1623 is_heap(RandomAccessIterator first, RandomAccessiterator last);
1625 template <class RandomAccessIterator, class Compare>
1626 constexpr bool // constexpr in C++20
1627 is_heap(RandomAccessIterator first, RandomAccessiterator last, Compare comp);
1629 template <class RandomAccessIterator>
1630 constexpr RandomAccessIterator // constexpr in C++20
1631 is_heap_until(RandomAccessIterator first, RandomAccessiterator last);
1633 template <class RandomAccessIterator, class Compare>
1634 constexpr RandomAccessIterator // constexpr in C++20
1635 is_heap_until(RandomAccessIterator first, RandomAccessiterator last, Compare comp);
1637 template <class ForwardIterator>
1638 constexpr ForwardIterator // constexpr in C++14
1639 min_element(ForwardIterator first, ForwardIterator last);
1641 template <class ForwardIterator, class Compare>
1642 constexpr ForwardIterator // constexpr in C++14
1643 min_element(ForwardIterator first, ForwardIterator last, Compare comp);
1646 constexpr const T& // constexpr in C++14
1647 min(const T& a, const T& b);
1649 template <class T, class Compare>
1650 constexpr const T& // constexpr in C++14
1651 min(const T& a, const T& b, Compare comp);
1654 constexpr T // constexpr in C++14
1655 min(initializer_list<T> t);
1657 template<class T, class Compare>
1658 constexpr T // constexpr in C++14
1659 min(initializer_list<T> t, Compare comp);
1662 constexpr const T& clamp(const T& v, const T& lo, const T& hi); // C++17
1664 template<class T, class Compare>
1665 constexpr const T& clamp(const T& v, const T& lo, const T& hi, Compare comp); // C++17
1667 template <class ForwardIterator>
1668 constexpr ForwardIterator // constexpr in C++14
1669 max_element(ForwardIterator first, ForwardIterator last);
1671 template <class ForwardIterator, class Compare>
1672 constexpr ForwardIterator // constexpr in C++14
1673 max_element(ForwardIterator first, ForwardIterator last, Compare comp);
1676 constexpr const T& // constexpr in C++14
1677 max(const T& a, const T& b);
1679 template <class T, class Compare>
1680 constexpr const T& // constexpr in C++14
1681 max(const T& a, const T& b, Compare comp);
1684 constexpr T // constexpr in C++14
1685 max(initializer_list<T> t);
1687 template<class T, class Compare>
1688 constexpr T // constexpr in C++14
1689 max(initializer_list<T> t, Compare comp);
1691 template<class ForwardIterator>
1692 constexpr pair<ForwardIterator, ForwardIterator> // constexpr in C++14
1693 minmax_element(ForwardIterator first, ForwardIterator last);
1695 template<class ForwardIterator, class Compare>
1696 constexpr pair<ForwardIterator, ForwardIterator> // constexpr in C++14
1697 minmax_element(ForwardIterator first, ForwardIterator last, Compare comp);
1700 constexpr pair<const T&, const T&> // constexpr in C++14
1701 minmax(const T& a, const T& b);
1703 template<class T, class Compare>
1704 constexpr pair<const T&, const T&> // constexpr in C++14
1705 minmax(const T& a, const T& b, Compare comp);
1708 constexpr pair<T, T> // constexpr in C++14
1709 minmax(initializer_list<T> t);
1711 template<class T, class Compare>
1712 constexpr pair<T, T> // constexpr in C++14
1713 minmax(initializer_list<T> t, Compare comp);
1715 template <class InputIterator1, class InputIterator2>
1716 constexpr bool // constexpr in C++20
1717 lexicographical_compare(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2);
1719 template <class InputIterator1, class InputIterator2, class Compare>
1720 constexpr bool // constexpr in C++20
1721 lexicographical_compare(InputIterator1 first1, InputIterator1 last1,
1722 InputIterator2 first2, InputIterator2 last2, Compare comp);
1724 template<class InputIterator1, class InputIterator2, class Cmp>
1726 lexicographical_compare_three_way(InputIterator1 first1, InputIterator1 last1,
1727 InputIterator2 first2, InputIterator2 last2,
1729 -> decltype(comp(*b1, *b2)); // since C++20
1731 template<class InputIterator1, class InputIterator2>
1733 lexicographical_compare_three_way(InputIterator1 first1, InputIterator1 last1,
1734 InputIterator2 first2, InputIterator2 last2); // since C++20
1736 template <class BidirectionalIterator>
1737 constexpr bool // constexpr in C++20
1738 next_permutation(BidirectionalIterator first, BidirectionalIterator last);
1740 template <class BidirectionalIterator, class Compare>
1741 constexpr bool // constexpr in C++20
1742 next_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp);
1744 template <class BidirectionalIterator>
1745 constexpr bool // constexpr in C++20
1746 prev_permutation(BidirectionalIterator first, BidirectionalIterator last);
1748 template <class BidirectionalIterator, class Compare>
1749 constexpr bool // constexpr in C++20
1750 prev_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp);
1755 #include <__assert> // all public C++ headers provide the assertion handler
1759 #include <__algorithm/adjacent_find.h>
1760 #include <__algorithm/all_of.h>
1761 #include <__algorithm/any_of.h>
1762 #include <__algorithm/binary_search.h>
1763 #include <__algorithm/clamp.h>
1764 #include <__algorithm/comp.h>
1765 #include <__algorithm/comp_ref_type.h>
1766 #include <__algorithm/copy.h>
1767 #include <__algorithm/copy_backward.h>
1768 #include <__algorithm/copy_if.h>
1769 #include <__algorithm/copy_n.h>
1770 #include <__algorithm/count.h>
1771 #include <__algorithm/count_if.h>
1772 #include <__algorithm/equal.h>
1773 #include <__algorithm/equal_range.h>
1774 #include <__algorithm/fill.h>
1775 #include <__algorithm/fill_n.h>
1776 #include <__algorithm/find.h>
1777 #include <__algorithm/find_end.h>
1778 #include <__algorithm/find_first_of.h>
1779 #include <__algorithm/find_if.h>
1780 #include <__algorithm/find_if_not.h>
1781 #include <__algorithm/for_each.h>
1782 #include <__algorithm/for_each_n.h>
1783 #include <__algorithm/generate.h>
1784 #include <__algorithm/generate_n.h>
1785 #include <__algorithm/half_positive.h>
1786 #include <__algorithm/in_found_result.h>
1787 #include <__algorithm/in_fun_result.h>
1788 #include <__algorithm/in_in_out_result.h>
1789 #include <__algorithm/in_in_result.h>
1790 #include <__algorithm/in_out_out_result.h>
1791 #include <__algorithm/in_out_result.h>
1792 #include <__algorithm/includes.h>
1793 #include <__algorithm/inplace_merge.h>
1794 #include <__algorithm/is_heap.h>
1795 #include <__algorithm/is_heap_until.h>
1796 #include <__algorithm/is_partitioned.h>
1797 #include <__algorithm/is_permutation.h>
1798 #include <__algorithm/is_sorted.h>
1799 #include <__algorithm/is_sorted_until.h>
1800 #include <__algorithm/iter_swap.h>
1801 #include <__algorithm/lexicographical_compare.h>
1802 #include <__algorithm/lexicographical_compare_three_way.h>
1803 #include <__algorithm/lower_bound.h>
1804 #include <__algorithm/make_heap.h>
1805 #include <__algorithm/max.h>
1806 #include <__algorithm/max_element.h>
1807 #include <__algorithm/merge.h>
1808 #include <__algorithm/min.h>
1809 #include <__algorithm/min_element.h>
1810 #include <__algorithm/min_max_result.h>
1811 #include <__algorithm/minmax.h>
1812 #include <__algorithm/minmax_element.h>
1813 #include <__algorithm/mismatch.h>
1814 #include <__algorithm/move.h>
1815 #include <__algorithm/move_backward.h>
1816 #include <__algorithm/next_permutation.h>
1817 #include <__algorithm/none_of.h>
1818 #include <__algorithm/nth_element.h>
1819 #include <__algorithm/partial_sort.h>
1820 #include <__algorithm/partial_sort_copy.h>
1821 #include <__algorithm/partition.h>
1822 #include <__algorithm/partition_copy.h>
1823 #include <__algorithm/partition_point.h>
1824 #include <__algorithm/pop_heap.h>
1825 #include <__algorithm/prev_permutation.h>
1826 #include <__algorithm/pstl_any_all_none_of.h>
1827 #include <__algorithm/pstl_copy.h>
1828 #include <__algorithm/pstl_count.h>
1829 #include <__algorithm/pstl_equal.h>
1830 #include <__algorithm/pstl_fill.h>
1831 #include <__algorithm/pstl_find.h>
1832 #include <__algorithm/pstl_for_each.h>
1833 #include <__algorithm/pstl_generate.h>
1834 #include <__algorithm/pstl_is_partitioned.h>
1835 #include <__algorithm/pstl_merge.h>
1836 #include <__algorithm/pstl_move.h>
1837 #include <__algorithm/pstl_replace.h>
1838 #include <__algorithm/pstl_rotate_copy.h>
1839 #include <__algorithm/pstl_sort.h>
1840 #include <__algorithm/pstl_stable_sort.h>
1841 #include <__algorithm/pstl_transform.h>
1842 #include <__algorithm/push_heap.h>
1843 #include <__algorithm/ranges_adjacent_find.h>
1844 #include <__algorithm/ranges_all_of.h>
1845 #include <__algorithm/ranges_any_of.h>
1846 #include <__algorithm/ranges_binary_search.h>
1847 #include <__algorithm/ranges_clamp.h>
1848 #include <__algorithm/ranges_copy.h>
1849 #include <__algorithm/ranges_copy_backward.h>
1850 #include <__algorithm/ranges_copy_if.h>
1851 #include <__algorithm/ranges_copy_n.h>
1852 #include <__algorithm/ranges_count.h>
1853 #include <__algorithm/ranges_count_if.h>
1854 #include <__algorithm/ranges_ends_with.h>
1855 #include <__algorithm/ranges_equal.h>
1856 #include <__algorithm/ranges_equal_range.h>
1857 #include <__algorithm/ranges_fill.h>
1858 #include <__algorithm/ranges_fill_n.h>
1859 #include <__algorithm/ranges_find.h>
1860 #include <__algorithm/ranges_find_end.h>
1861 #include <__algorithm/ranges_find_first_of.h>
1862 #include <__algorithm/ranges_find_if.h>
1863 #include <__algorithm/ranges_find_if_not.h>
1864 #include <__algorithm/ranges_for_each.h>
1865 #include <__algorithm/ranges_for_each_n.h>
1866 #include <__algorithm/ranges_generate.h>
1867 #include <__algorithm/ranges_generate_n.h>
1868 #include <__algorithm/ranges_includes.h>
1869 #include <__algorithm/ranges_inplace_merge.h>
1870 #include <__algorithm/ranges_is_heap.h>
1871 #include <__algorithm/ranges_is_heap_until.h>
1872 #include <__algorithm/ranges_is_partitioned.h>
1873 #include <__algorithm/ranges_is_permutation.h>
1874 #include <__algorithm/ranges_is_sorted.h>
1875 #include <__algorithm/ranges_is_sorted_until.h>
1876 #include <__algorithm/ranges_lexicographical_compare.h>
1877 #include <__algorithm/ranges_lower_bound.h>
1878 #include <__algorithm/ranges_make_heap.h>
1879 #include <__algorithm/ranges_max.h>
1880 #include <__algorithm/ranges_max_element.h>
1881 #include <__algorithm/ranges_merge.h>
1882 #include <__algorithm/ranges_min.h>
1883 #include <__algorithm/ranges_min_element.h>
1884 #include <__algorithm/ranges_minmax.h>
1885 #include <__algorithm/ranges_minmax_element.h>
1886 #include <__algorithm/ranges_mismatch.h>
1887 #include <__algorithm/ranges_move.h>
1888 #include <__algorithm/ranges_move_backward.h>
1889 #include <__algorithm/ranges_next_permutation.h>
1890 #include <__algorithm/ranges_none_of.h>
1891 #include <__algorithm/ranges_nth_element.h>
1892 #include <__algorithm/ranges_partial_sort.h>
1893 #include <__algorithm/ranges_partial_sort_copy.h>
1894 #include <__algorithm/ranges_partition.h>
1895 #include <__algorithm/ranges_partition_copy.h>
1896 #include <__algorithm/ranges_partition_point.h>
1897 #include <__algorithm/ranges_pop_heap.h>
1898 #include <__algorithm/ranges_prev_permutation.h>
1899 #include <__algorithm/ranges_push_heap.h>
1900 #include <__algorithm/ranges_remove.h>
1901 #include <__algorithm/ranges_remove_copy.h>
1902 #include <__algorithm/ranges_remove_copy_if.h>
1903 #include <__algorithm/ranges_remove_if.h>
1904 #include <__algorithm/ranges_replace.h>
1905 #include <__algorithm/ranges_replace_copy.h>
1906 #include <__algorithm/ranges_replace_copy_if.h>
1907 #include <__algorithm/ranges_replace_if.h>
1908 #include <__algorithm/ranges_reverse.h>
1909 #include <__algorithm/ranges_reverse_copy.h>
1910 #include <__algorithm/ranges_rotate.h>
1911 #include <__algorithm/ranges_rotate_copy.h>
1912 #include <__algorithm/ranges_sample.h>
1913 #include <__algorithm/ranges_search.h>
1914 #include <__algorithm/ranges_search_n.h>
1915 #include <__algorithm/ranges_set_difference.h>
1916 #include <__algorithm/ranges_set_intersection.h>
1917 #include <__algorithm/ranges_set_symmetric_difference.h>
1918 #include <__algorithm/ranges_set_union.h>
1919 #include <__algorithm/ranges_shuffle.h>
1920 #include <__algorithm/ranges_sort.h>
1921 #include <__algorithm/ranges_sort_heap.h>
1922 #include <__algorithm/ranges_stable_partition.h>
1923 #include <__algorithm/ranges_stable_sort.h>
1924 #include <__algorithm/ranges_starts_with.h>
1925 #include <__algorithm/ranges_swap_ranges.h>
1926 #include <__algorithm/ranges_transform.h>
1927 #include <__algorithm/ranges_unique.h>
1928 #include <__algorithm/ranges_unique_copy.h>
1929 #include <__algorithm/ranges_upper_bound.h>
1930 #include <__algorithm/remove.h>
1931 #include <__algorithm/remove_copy.h>
1932 #include <__algorithm/remove_copy_if.h>
1933 #include <__algorithm/remove_if.h>
1934 #include <__algorithm/replace.h>
1935 #include <__algorithm/replace_copy.h>
1936 #include <__algorithm/replace_copy_if.h>
1937 #include <__algorithm/replace_if.h>
1938 #include <__algorithm/reverse.h>
1939 #include <__algorithm/reverse_copy.h>
1940 #include <__algorithm/rotate.h>
1941 #include <__algorithm/rotate_copy.h>
1942 #include <__algorithm/sample.h>
1943 #include <__algorithm/search.h>
1944 #include <__algorithm/search_n.h>
1945 #include <__algorithm/set_difference.h>
1946 #include <__algorithm/set_intersection.h>
1947 #include <__algorithm/set_symmetric_difference.h>
1948 #include <__algorithm/set_union.h>
1949 #include <__algorithm/shift_left.h>
1950 #include <__algorithm/shift_right.h>
1951 #include <__algorithm/shuffle.h>
1952 #include <__algorithm/sift_down.h>
1953 #include <__algorithm/sort.h>
1954 #include <__algorithm/sort_heap.h>
1955 #include <__algorithm/stable_partition.h>
1956 #include <__algorithm/stable_sort.h>
1957 #include <__algorithm/swap_ranges.h>
1958 #include <__algorithm/transform.h>
1959 #include <__algorithm/unique.h>
1960 #include <__algorithm/unique_copy.h>
1961 #include <__algorithm/unwrap_iter.h>
1962 #include <__algorithm/upper_bound.h>
1964 // standard-mandated includes
1967 #include <initializer_list>
1969 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
1970 # pragma GCC system_header
1973 #if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
1976 # include <concepts>
1979 # include <iterator>
1981 # include <stdexcept>
1982 # include <type_traits>
1986 #endif // _LIBCPP_ALGORITHM