1// -*- C++ -*- 2//===----------------------------------------------------------------------===// 3// 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 7// 8//===----------------------------------------------------------------------===// 9 10#ifndef _LIBCPP_ALGORITHM 11#define _LIBCPP_ALGORITHM 12 13/* 14 algorithm synopsis 15 16#include <initializer_list> 17 18namespace std 19{ 20 21namespace ranges { 22 template <class I, class F> 23 struct in_fun_result; // since C++20 24 25 template <class I1, class I2> 26 struct in_in_result; // since C++20 27 28 template <class I1, class I2, class O> 29 struct in_in_out_result; // since C++20 30 31 template <class I, class O1, class O2> 32 struct in_out_out_result; // since C++20 33 34 template <class I1, class I2> 35 struct min_max_result; // since C++20 36 37 template <class I> 38 struct in_found_result; // since C++20 39 40 template<forward_iterator I, sentinel_for<I> S, class Proj = identity, 41 indirect_strict_weak_order<projected<I, Proj>> Comp = ranges::less> // since C++20 42 constexpr I min_element(I first, S last, Comp comp = {}, Proj proj = {}); 43 44 template<forward_range R, class Proj = identity, 45 indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less> // since C++20 46 constexpr borrowed_iterator_t<R> min_element(R&& r, Comp comp = {}, Proj proj = {}); 47 48 template<forward_iterator I, sentinel_for<I> S, class Proj = identity, 49 indirect_strict_weak_order<projected<I, Proj>> Comp = ranges::less> 50 constexpr I ranges::max_element(I first, S last, Comp comp = {}, Proj proj = {}); // since C++20 51 52 template<forward_range R, class Proj = identity, 53 indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less> 54 constexpr borrowed_iterator_t<R> ranges::max_element(R&& r, Comp comp = {}, Proj proj = {}); // since C++20 55 56 template <input_iterator I1, sentinel_for<_I1> S1, input_iterator I2, sentinel_for<_I2> S2, 57 class Pred = ranges::equal_to, class Proj1 = identity, class Proj2 = identity> 58 requires indirectly_comparable<I1, I2, Pred, Proj1, Proj2> 59 constexpr mismatch_result<_I1, _I2> 60 mismatch()(I1 first1, S1 last1, I2 first2, S2 last2, Pred pred = {}, Proj1 proj1 = {}, Proj2 proj2 = {}) // since C++20 61 62 template <input_range R1, input_range R2, 63 class Pred = ranges::equal_to, class Proj1 = identity, class Proj2 = identity> 64 requires indirectly_comparable<iterator_t<R1>, iterator_t<R2>, Pred, Proj1, Proj2> 65 constexpr mismatch_result<borrowed_iterator_t<R1>, borrowed_iterator_t<R2>> 66 mismatch(R1&& r1, R2&& r2, Pred pred = {}, Proj1 proj1 = {}, Proj2 proj2 = {}) // since C++20 67 68 requires indirect_binary_predicate<ranges::equal_to, projected<I, Proj>, const T*> 69 constexpr I find(I first, S last, const T& value, Proj proj = {}); // since C++20 70 71 template<input_range R, class T, class Proj = identity> 72 requires indirect_binary_predicate<ranges::equal_to, projected<iterator_t<R>, Proj>, const T*> 73 constexpr borrowed_iterator_t<R> 74 find(R&& r, const T& value, Proj proj = {}); // since C++20 75 76 template<input_iterator I, sentinel_for<I> S, class Proj = identity, 77 indirect_unary_predicate<projected<I, Proj>> Pred> 78 constexpr I find_if(I first, S last, Pred pred, Proj proj = {}); // since C++20 79 80 template<input_range R, class Proj = identity, 81 indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred> 82 constexpr borrowed_iterator_t<R> 83 find_if(R&& r, Pred pred, Proj proj = {}); // since C++20 84 85 template<input_iterator I, sentinel_for<I> S, class Proj = identity, 86 indirect_unary_predicate<projected<I, Proj>> Pred> 87 constexpr I find_if_not(I first, S last, Pred pred, Proj proj = {}); // since C++20 88 89 template<input_range R, class Proj = identity, 90 indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred> 91 constexpr borrowed_iterator_t<R> 92 find_if_not(R&& r, Pred pred, Proj proj = {}); // since C++20 93 94 template<class T, class Proj = identity, 95 indirect_strict_weak_order<projected<const T*, Proj>> Comp = ranges::less> 96 constexpr const T& min(const T& a, const T& b, Comp comp = {}, Proj proj = {}); // since C++20 97 98 template<copyable T, class Proj = identity, 99 indirect_strict_weak_order<projected<const T*, Proj>> Comp = ranges::less> 100 constexpr T min(initializer_list<T> r, Comp comp = {}, Proj proj = {}); // since C++20 101 102 template<input_range R, class Proj = identity, 103 indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less> 104 requires indirectly_copyable_storable<iterator_t<R>, range_value_t<R>*> 105 constexpr range_value_t<R> 106 min(R&& r, Comp comp = {}, Proj proj = {}); // since C++20 107 108 template<class T, class Proj = identity, 109 indirect_strict_weak_order<projected<const T*, Proj>> Comp = ranges::less> 110 constexpr const T& max(const T& a, const T& b, Comp comp = {}, Proj proj = {}); // since C++20 111 112 template<copyable T, class Proj = identity, 113 indirect_strict_weak_order<projected<const T*, Proj>> Comp = ranges::less> 114 constexpr T max(initializer_list<T> r, Comp comp = {}, Proj proj = {}); // since C++20 115 116 template<input_range R, class Proj = identity, 117 indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less> 118 requires indirectly_copyable_storable<iterator_t<R>, range_value_t<R>*> 119 constexpr range_value_t<R> 120 max(R&& r, Comp comp = {}, Proj proj = {}); // since C++20 121 122 template<class I, class O> 123 using unary_transform_result = in_out_result<I, O>; // since C++20 124 125 template<class I1, class I2, class O> 126 using binary_transform_result = in_in_out_result<I1, I2, O>; // since C++20 127 128 template<input_iterator I, sentinel_for<I> S, weakly_incrementable O, 129 copy_constructible F, class Proj = identity> 130 requires indirectly_writable<O, indirect_result_t<F&, projected<I, Proj>>> 131 constexpr ranges::unary_transform_result<I, O> 132 transform(I first1, S last1, O result, F op, Proj proj = {}); // since C++20 133 134 template<input_range R, weakly_incrementable O, copy_constructible F, 135 class Proj = identity> 136 requires indirectly_writable<O, indirect_result_t<F&, projected<iterator_t<R>, Proj>>> 137 constexpr ranges::unary_transform_result<borrowed_iterator_t<R>, O> 138 transform(R&& r, O result, F op, Proj proj = {}); // since C++20 139 140 template<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2, 141 weakly_incrementable O, copy_constructible F, class Proj1 = identity, 142 class Proj2 = identity> 143 requires indirectly_writable<O, indirect_result_t<F&, projected<I1, Proj1>, 144 projected<I2, Proj2>>> 145 constexpr ranges::binary_transform_result<I1, I2, O> 146 transform(I1 first1, S1 last1, I2 first2, S2 last2, O result, 147 F binary_op, Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20 148 149 template<input_range R1, input_range R2, weakly_incrementable O, 150 copy_constructible F, class Proj1 = identity, class Proj2 = identity> 151 requires indirectly_writable<O, indirect_result_t<F&, projected<iterator_t<R1>, Proj1>, 152 projected<iterator_t<R2>, Proj2>>> 153 constexpr ranges::binary_transform_result<borrowed_iterator_t<R1>, borrowed_iterator_t<R2>, O> 154 transform(R1&& r1, R2&& r2, O result, 155 F binary_op, Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20 156 157 template<input_iterator I, sentinel_for<I> S, class T, class Proj = identity> 158 requires indirect_binary_predicate<ranges::equal_to, projected<I, Proj>, const T*> 159 constexpr iter_difference_t<I> 160 count(I first, S last, const T& value, Proj proj = {}); // since C++20 161 162 template<input_range R, class T, class Proj = identity> 163 requires indirect_binary_predicate<ranges::equal_to, projected<iterator_t<R>, Proj>, const T*> 164 constexpr range_difference_t<R> 165 count(R&& r, const T& value, Proj proj = {}); // since C++20 166 167 template<input_iterator I, sentinel_for<I> S, class Proj = identity, 168 indirect_unary_predicate<projected<I, Proj>> Pred> 169 constexpr iter_difference_t<I> 170 count_if(I first, S last, Pred pred, Proj proj = {}); // since C++20 171 172 template<input_range R, class Proj = identity, 173 indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred> 174 constexpr range_difference_t<R> 175 count_if(R&& r, Pred pred, Proj proj = {}); // since C++20 176 177 template<class T, class Proj = identity, 178 indirect_strict_weak_order<projected<const T*, Proj>> Comp = ranges::less> 179 constexpr ranges::minmax_result<const T&> 180 minmax(const T& a, const T& b, Comp comp = {}, Proj proj = {}); // since C++20 181 182 template<copyable T, class Proj = identity, 183 indirect_strict_weak_order<projected<const T*, Proj>> Comp = ranges::less> 184 constexpr ranges::minmax_result<T> 185 minmax(initializer_list<T> r, Comp comp = {}, Proj proj = {}); // since C++20 186 187 template<input_range R, class Proj = identity, 188 indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less> 189 requires indirectly_copyable_storable<iterator_t<R>, range_value_t<R>*> 190 constexpr ranges::minmax_result<range_value_t<R>> 191 minmax(R&& r, Comp comp = {}, Proj proj = {}); // since C++20 192 193 template<forward_iterator I, sentinel_for<I> S, class Proj = identity, 194 indirect_strict_weak_order<projected<I, Proj>> Comp = ranges::less> 195 constexpr ranges::minmax_element_result<I> 196 minmax_element(I first, S last, Comp comp = {}, Proj proj = {}); // since C++20 197 198 template<forward_range R, class Proj = identity, 199 indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less> 200 constexpr ranges::minmax_element_result<borrowed_iterator_t<R>> 201 minmax_element(R&& r, Comp comp = {}, Proj proj = {}); // since C++20 202 203 template<class I, class O> 204 using copy_result = in_out_result<I, O>; // since C++20 205 206 template<class I, class O> 207 using copy_n_result = in_out_result<I, O>; // since C++20 208 209 template<class I, class O> 210 using copy_if_result = in_out_result<I, O>; // since C++20 211 212 template<class I1, class I2> 213 using copy_backward_result = in_out_result<I1, I2>; // since C++20 214 215 template<input_iterator I, sentinel_for<I> S, weakly_incrementable O> 216 requires indirectly_copyable<I, O> 217 constexpr ranges::copy_result<I, O> ranges::copy(I first, S last, O result); // since C++20 218 219 template<input_range R, weakly_incrementable O> 220 requires indirectly_copyable<iterator_t<R>, O> 221 constexpr ranges::copy_result<borrowed_iterator_t<R>, O> ranges::copy(R&& r, O result); // since C++20 222 223 template<input_iterator I, weakly_incrementable O> 224 requires indirectly_copyable<I, O> 225 constexpr ranges::copy_n_result<I, O> 226 ranges::copy_n(I first, iter_difference_t<I> n, O result); // since C++20 227 228 template<input_iterator I, sentinel_for<I> S, weakly_incrementable O, class Proj = identity, 229 indirect_unary_predicate<projected<I, Proj>> Pred> 230 requires indirectly_copyable<I, O> 231 constexpr ranges::copy_if_result<I, O> 232 ranges::copy_if(I first, S last, O result, Pred pred, Proj proj = {}); // since C++20 233 234 template<input_range R, weakly_incrementable O, class Proj = identity, 235 indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred> 236 requires indirectly_copyable<iterator_t<R>, O> 237 constexpr ranges::copy_if_result<borrowed_iterator_t<R>, O> 238 ranges::copy_if(R&& r, O result, Pred pred, Proj proj = {}); // since C++20 239 240 template<bidirectional_iterator I1, sentinel_for<I1> S1, bidirectional_iterator I2> 241 requires indirectly_copyable<I1, I2> 242 constexpr ranges::copy_backward_result<I1, I2> 243 ranges::copy_backward(I1 first, S1 last, I2 result); // since C++20 244 245 template<bidirectional_range R, bidirectional_iterator I> 246 requires indirectly_copyable<iterator_t<R>, I> 247 constexpr ranges::copy_backward_result<borrowed_iterator_t<R>, I> 248 ranges::copy_backward(R&& r, I result); // since C++20 249 250 template<class I, class F> 251 using for_each_result = in_fun_result<I, F>; // since C++20 252 253 template<input_iterator I, sentinel_for<I> S, class Proj = identity, 254 indirectly_unary_invocable<projected<I, Proj>> Fun> 255 constexpr ranges::for_each_result<I, Fun> 256 ranges::for_each(I first, S last, Fun f, Proj proj = {}); // since C++20 257 258 template<input_range R, class Proj = identity, 259 indirectly_unary_invocable<projected<iterator_t<R>, Proj>> Fun> 260 constexpr ranges::for_each_result<borrowed_iterator_t<R>, Fun> 261 ranges::for_each(R&& r, Fun f, Proj proj = {}); // since C++20 262 263 template<input_iterator I, class Proj = identity, 264 indirectly_unary_invocable<projected<I, Proj>> Fun> 265 constexpr ranges::for_each_n_result<I, Fun> 266 ranges::for_each_n(I first, iter_difference_t<I> n, Fun f, Proj proj = {}); // since C++20 267 268 template<input_iterator I, sentinel_for<I> S, class Proj = identity, 269 indirect_unary_predicate<projected<I, Proj>> Pred> 270 constexpr bool ranges::is_partitioned(I first, S last, Pred pred, Proj proj = {}); // since C++20 271 272 template<input_range R, class Proj = identity, 273 indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred> 274 constexpr bool ranges::is_partitioned(R&& r, Pred pred, Proj proj = {}); // since C++20 275 276 277 template<bidirectional_iterator I, sentinel_for<I> S> 278 requires permutable<I> 279 constexpr I ranges::reverse(I first, S last); // since C++20 280 281 template<bidirectional_range R> 282 requires permutable<iterator_t<R>> 283 constexpr borrowed_iterator_t<R> ranges::reverse(R&& r); // since C++20 284 285 template<random_access_iterator I, sentinel_for<I> S, class Comp = ranges::less, 286 class Proj = identity> 287 requires sortable<I, Comp, Proj> 288 constexpr I 289 sort(I first, S last, Comp comp = {}, Proj proj = {}); // since C++20 290 291 template<random_access_range R, class Comp = ranges::less, class Proj = identity> 292 requires sortable<iterator_t<R>, Comp, Proj> 293 constexpr borrowed_iterator_t<R> 294 sort(R&& r, Comp comp = {}, Proj proj = {}); // since C++20 295 296 template<class T, output_iterator<const T&> O, sentinel_for<O> S> 297 constexpr O ranges::fill(O first, S last, const T& value); // since C++20 298 299 template<class T, output_range<const T&> R> 300 constexpr borrowed_iterator_t<R> ranges::fill(R&& r, const T& value); // since C++20 301 302 template<class T, output_iterator<const T&> O> 303 constexpr O ranges::fill_n(O first, iter_difference_t<O> n, const T& value); // since C++20 304 305 template<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2, 306 class Pred = ranges::equal_to, class Proj1 = identity, class Proj2 = identity> 307 requires indirectly_comparable<I1, I2, Pred, Proj1, Proj2> 308 constexpr bool ranges::equal(I1 first1, S1 last1, I2 first2, S2 last2, 309 Pred pred = {}, 310 Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20 311 312 template<input_range R1, input_range R2, class Pred = ranges::equal_to, 313 class Proj1 = identity, class Proj2 = identity> 314 requires indirectly_comparable<iterator_t<R1>, iterator_t<R2>, Pred, Proj1, Proj2> 315 constexpr bool ranges::equal(R1&& r1, R2&& r2, Pred pred = {}, 316 Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20 317 318 template<input_iterator I, sentinel_for<I> S, class Proj = identity, 319 indirect_unary_predicate<projected<I, Proj>> Pred> 320 constexpr bool ranges::all_of(I first, S last, Pred pred, Proj proj = {}); // since C++20 321 322 template<input_range R, class Proj = identity, 323 indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred> 324 constexpr bool ranges::all_of(R&& r, Pred pred, Proj proj = {}); // since C++20 325 326 template<input_iterator I, sentinel_for<I> S, class Proj = identity, 327 indirect_unary_predicate<projected<I, Proj>> Pred> 328 constexpr bool ranges::any_of(I first, S last, Pred pred, Proj proj = {}); // since C++20 329 330 template<input_range R, class Proj = identity, 331 indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred> 332 constexpr bool ranges::any_of(R&& r, Pred pred, Proj proj = {}); // since C++20 333 334 template<input_iterator I, sentinel_for<I> S, class Proj = identity, 335 indirect_unary_predicate<projected<I, Proj>> Pred> 336 constexpr bool ranges::none_of(I first, S last, Pred pred, Proj proj = {}); // since C++20 337 338 template<input_range R, class Proj = identity, 339 indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred> 340 constexpr bool ranges::none_of(R&& r, Pred pred, Proj proj = {}); // since C++20 341 342 template<forward_iterator I, sentinel_for<I> S, class Proj = identity, 343 indirect_strict_weak_order<projected<I, Proj>> Comp = ranges::less> 344 constexpr bool ranges::is_sorted(I first, S last, Comp comp = {}, Proj proj = {}); // since C++20 345 346 template<forward_range R, class Proj = identity, 347 indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less> 348 constexpr bool ranges::is_sorted(R&& r, Comp comp = {}, Proj proj = {}); // since C++20 349 350 template<forward_iterator I, sentinel_for<I> S, class Proj = identity, 351 indirect_strict_weak_order<projected<I, Proj>> Comp = ranges::less> 352 constexpr I ranges::is_sorted_until(I first, S last, Comp comp = {}, Proj proj = {}); // since C++20 353 354 template<forward_range R, class Proj = identity, 355 indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less> 356 constexpr borrowed_iterator_t<R> 357 ranges::is_sorted_until(R&& r, Comp comp = {}, Proj proj = {}); // since C++20 358 359 template<forward_iterator I, sentinel_for<I> S, class T, class Proj = identity, 360 indirect_strict_weak_order<const T*, projected<I, Proj>> Comp = ranges::less> 361 constexpr I upper_bound(I first, S last, const T& value, Comp comp = {}, Proj proj = {}); // since C++20 362 363 template<forward_range R, class T, class Proj = identity, 364 indirect_strict_weak_order<const T*, projected<iterator_t<R>, Proj>> Comp = 365 ranges::less> 366 constexpr borrowed_iterator_t<R> 367 upper_bound(R&& r, const T& value, Comp comp = {}, Proj proj = {}); // since C++20 368 369 template<forward_iterator I, sentinel_for<I> S, class T, class Proj = identity, 370 indirect_strict_weak_order<const T*, projected<I, Proj>> Comp = ranges::less> 371 constexpr I lower_bound(I first, S last, const T& value, Comp comp = {}, 372 Proj proj = {}); // since C++20 373 template<forward_range R, class T, class Proj = identity, 374 indirect_strict_weak_order<const T*, projected<iterator_t<R>, Proj>> Comp = 375 ranges::less> 376 constexpr borrowed_iterator_t<R> 377 lower_bound(R&& r, const T& value, Comp comp = {}, Proj proj = {}); // since C++20 378 379 template<forward_iterator I, sentinel_for<I> S, class T, class Proj = identity, 380 indirect_strict_weak_order<const T*, projected<I, Proj>> Comp = ranges::less> 381 constexpr bool binary_search(I first, S last, const T& value, Comp comp = {}, 382 Proj proj = {}); // since C++20 383 384 template<forward_range R, class T, class Proj = identity, 385 indirect_strict_weak_order<const T*, projected<iterator_t<R>, Proj>> Comp = 386 ranges::less> 387 constexpr bool binary_search(R&& r, const T& value, Comp comp = {}, 388 Proj proj = {}); // since C++20 389 template<input_iterator I1, sentinel_for<I1> S1, forward_iterator I2, sentinel_for<I2> S2, 390 class Pred = ranges::equal_to, class Proj1 = identity, class Proj2 = identity> 391 requires indirectly_comparable<I1, I2, Pred, Proj1, Proj2> 392 constexpr I1 ranges::find_first_of(I1 first1, S1 last1, I2 first2, S2 last2, 393 Pred pred = {}, 394 Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20 395 396 template<input_range R1, forward_range R2, 397 class Pred = ranges::equal_to, class Proj1 = identity, class Proj2 = identity> 398 requires indirectly_comparable<iterator_t<R1>, iterator_t<R2>, Pred, Proj1, Proj2> 399 constexpr borrowed_iterator_t<R1> 400 ranges::find_first_of(R1&& r1, R2&& r2, 401 Pred pred = {}, 402 Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20 403 404 template<forward_iterator I, sentinel_for<I> S, class Proj = identity, 405 indirect_binary_predicate<projected<I, Proj>, 406 projected<I, Proj>> Pred = ranges::equal_to> 407 constexpr I ranges::adjacent_find(I first, S last, Pred pred = {}, Proj proj = {}); // since C+20 408 409 template<forward_range R, class Proj = identity, 410 indirect_binary_predicate<projected<iterator_t<R>, Proj>, 411 projected<iterator_t<R>, Proj>> Pred = ranges::equal_to> 412 constexpr borrowed_iterator_t<R> ranges::adjacent_find(R&& r, Pred pred = {}, Proj proj = {}); // since C++20 413 414 template<input_iterator I, sentinel_for<I> S, class T1, class T2, class Proj = identity> 415 requires indirectly_writable<I, const T2&> && 416 indirect_binary_predicate<ranges::equal_to, projected<I, Proj>, const T1*> 417 constexpr I 418 ranges::replace(I first, S last, const T1& old_value, const T2& new_value, Proj proj = {}); // since C++20 419 420 template<input_range R, class T1, class T2, class Proj = identity> 421 requires indirectly_writable<iterator_t<R>, const T2&> && 422 indirect_binary_predicate<ranges::equal_to, projected<iterator_t<R>, Proj>, const T1*> 423 constexpr borrowed_iterator_t<R> 424 ranges::replace(R&& r, const T1& old_value, const T2& new_value, Proj proj = {}); // since C++20 425 426 template<input_iterator I, sentinel_for<I> S, class T, class Proj = identity, 427 indirect_unary_predicate<projected<I, Proj>> Pred> 428 requires indirectly_writable<I, const T&> 429 constexpr I ranges::replace_if(I first, S last, Pred pred, const T& new_value, Proj proj = {}); // since C++20 430 431 template<input_range R, class T, class Proj = identity, 432 indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred> 433 requires indirectly_writable<iterator_t<R>, const T&> 434 constexpr borrowed_iterator_t<R> 435 ranges::replace_if(R&& r, Pred pred, const T& new_value, Proj proj = {}); // since C++20 436 437 template<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2, 438 class Proj1 = identity, class Proj2 = identity, 439 indirect_strict_weak_order<projected<I1, Proj1>, 440 projected<I2, Proj2>> Comp = ranges::less> 441 constexpr bool 442 ranges::lexicographical_compare(I1 first1, S1 last1, I2 first2, S2 last2, 443 Comp comp = {}, Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20 444 445 template<input_range R1, input_range R2, class Proj1 = identity, 446 class Proj2 = identity, 447 indirect_strict_weak_order<projected<iterator_t<R1>, Proj1>, 448 projected<iterator_t<R2>, Proj2>> Comp = ranges::less> 449 constexpr bool 450 ranges::lexicographical_compare(R1&& r1, R2&& r2, Comp comp = {}, 451 Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20 452 453} 454 455 constexpr bool // constexpr in C++20 456 all_of(InputIterator first, InputIterator last, Predicate pred); 457 458template <class InputIterator, class Predicate> 459 constexpr bool // constexpr in C++20 460 any_of(InputIterator first, InputIterator last, Predicate pred); 461 462template <class InputIterator, class Predicate> 463 constexpr bool // constexpr in C++20 464 none_of(InputIterator first, InputIterator last, Predicate pred); 465 466template <class InputIterator, class Function> 467 constexpr Function // constexpr in C++20 468 for_each(InputIterator first, InputIterator last, Function f); 469 470template<class InputIterator, class Size, class Function> 471 constexpr InputIterator // constexpr in C++20 472 for_each_n(InputIterator first, Size n, Function f); // C++17 473 474template <class InputIterator, class T> 475 constexpr InputIterator // constexpr in C++20 476 find(InputIterator first, InputIterator last, const T& value); 477 478template <class InputIterator, class Predicate> 479 constexpr InputIterator // constexpr in C++20 480 find_if(InputIterator first, InputIterator last, Predicate pred); 481 482template<class InputIterator, class Predicate> 483 constexpr InputIterator // constexpr in C++20 484 find_if_not(InputIterator first, InputIterator last, Predicate pred); 485 486template <class ForwardIterator1, class ForwardIterator2> 487 constexpr ForwardIterator1 // constexpr in C++20 488 find_end(ForwardIterator1 first1, ForwardIterator1 last1, 489 ForwardIterator2 first2, ForwardIterator2 last2); 490 491template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> 492 constexpr ForwardIterator1 // constexpr in C++20 493 find_end(ForwardIterator1 first1, ForwardIterator1 last1, 494 ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred); 495 496template <class ForwardIterator1, class ForwardIterator2> 497 constexpr ForwardIterator1 // constexpr in C++20 498 find_first_of(ForwardIterator1 first1, ForwardIterator1 last1, 499 ForwardIterator2 first2, ForwardIterator2 last2); 500 501template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> 502 constexpr ForwardIterator1 // constexpr in C++20 503 find_first_of(ForwardIterator1 first1, ForwardIterator1 last1, 504 ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred); 505 506template <class ForwardIterator> 507 constexpr ForwardIterator // constexpr in C++20 508 adjacent_find(ForwardIterator first, ForwardIterator last); 509 510template <class ForwardIterator, class BinaryPredicate> 511 constexpr ForwardIterator // constexpr in C++20 512 adjacent_find(ForwardIterator first, ForwardIterator last, BinaryPredicate pred); 513 514template <class InputIterator, class T> 515 constexpr typename iterator_traits<InputIterator>::difference_type // constexpr in C++20 516 count(InputIterator first, InputIterator last, const T& value); 517 518template <class InputIterator, class Predicate> 519 constexpr typename iterator_traits<InputIterator>::difference_type // constexpr in C++20 520 count_if(InputIterator first, InputIterator last, Predicate pred); 521 522template <class InputIterator1, class InputIterator2> 523 constexpr pair<InputIterator1, InputIterator2> // constexpr in C++20 524 mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2); 525 526template <class InputIterator1, class InputIterator2> 527 constexpr pair<InputIterator1, InputIterator2> // constexpr in C++20 528 mismatch(InputIterator1 first1, InputIterator1 last1, 529 InputIterator2 first2, InputIterator2 last2); // **C++14** 530 531template <class InputIterator1, class InputIterator2, class BinaryPredicate> 532 constexpr pair<InputIterator1, InputIterator2> // constexpr in C++20 533 mismatch(InputIterator1 first1, InputIterator1 last1, 534 InputIterator2 first2, BinaryPredicate pred); 535 536template <class InputIterator1, class InputIterator2, class BinaryPredicate> 537 constexpr pair<InputIterator1, InputIterator2> // constexpr in C++20 538 mismatch(InputIterator1 first1, InputIterator1 last1, 539 InputIterator2 first2, InputIterator2 last2, 540 BinaryPredicate pred); // **C++14** 541 542template <class InputIterator1, class InputIterator2> 543 constexpr bool // constexpr in C++20 544 equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2); 545 546template <class InputIterator1, class InputIterator2> 547 constexpr bool // constexpr in C++20 548 equal(InputIterator1 first1, InputIterator1 last1, 549 InputIterator2 first2, InputIterator2 last2); // **C++14** 550 551template <class InputIterator1, class InputIterator2, class BinaryPredicate> 552 constexpr bool // constexpr in C++20 553 equal(InputIterator1 first1, InputIterator1 last1, 554 InputIterator2 first2, BinaryPredicate pred); 555 556template <class InputIterator1, class InputIterator2, class BinaryPredicate> 557 constexpr bool // constexpr in C++20 558 equal(InputIterator1 first1, InputIterator1 last1, 559 InputIterator2 first2, InputIterator2 last2, 560 BinaryPredicate pred); // **C++14** 561 562template<class ForwardIterator1, class ForwardIterator2> 563 constexpr bool // constexpr in C++20 564 is_permutation(ForwardIterator1 first1, ForwardIterator1 last1, 565 ForwardIterator2 first2); 566 567template<class ForwardIterator1, class ForwardIterator2> 568 constexpr bool // constexpr in C++20 569 is_permutation(ForwardIterator1 first1, ForwardIterator1 last1, 570 ForwardIterator2 first2, ForwardIterator2 last2); // **C++14** 571 572template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> 573 constexpr bool // constexpr in C++20 574 is_permutation(ForwardIterator1 first1, ForwardIterator1 last1, 575 ForwardIterator2 first2, BinaryPredicate pred); 576 577template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> 578 constexpr bool // constexpr in C++20 579 is_permutation(ForwardIterator1 first1, ForwardIterator1 last1, 580 ForwardIterator2 first2, ForwardIterator2 last2, 581 BinaryPredicate pred); // **C++14** 582 583template <class ForwardIterator1, class ForwardIterator2> 584 constexpr ForwardIterator1 // constexpr in C++20 585 search(ForwardIterator1 first1, ForwardIterator1 last1, 586 ForwardIterator2 first2, ForwardIterator2 last2); 587 588template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> 589 constexpr ForwardIterator1 // constexpr in C++20 590 search(ForwardIterator1 first1, ForwardIterator1 last1, 591 ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred); 592 593template <class ForwardIterator, class Size, class T> 594 constexpr ForwardIterator // constexpr in C++20 595 search_n(ForwardIterator first, ForwardIterator last, Size count, const T& value); 596 597template <class ForwardIterator, class Size, class T, class BinaryPredicate> 598 constexpr ForwardIterator // constexpr in C++20 599 search_n(ForwardIterator first, ForwardIterator last, 600 Size count, const T& value, BinaryPredicate pred); 601 602template <class InputIterator, class OutputIterator> 603 constexpr OutputIterator // constexpr in C++20 604 copy(InputIterator first, InputIterator last, OutputIterator result); 605 606template<class InputIterator, class OutputIterator, class Predicate> 607 constexpr OutputIterator // constexpr in C++20 608 copy_if(InputIterator first, InputIterator last, 609 OutputIterator result, Predicate pred); 610 611template<class InputIterator, class Size, class OutputIterator> 612 constexpr OutputIterator // constexpr in C++20 613 copy_n(InputIterator first, Size n, OutputIterator result); 614 615template <class BidirectionalIterator1, class BidirectionalIterator2> 616 constexpr BidirectionalIterator2 // constexpr in C++20 617 copy_backward(BidirectionalIterator1 first, BidirectionalIterator1 last, 618 BidirectionalIterator2 result); 619 620template <class ForwardIterator1, class ForwardIterator2> 621 constexpr ForwardIterator2 // constexpr in C++20 622 swap_ranges(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2); 623 624template<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2> 625 requires indirectly_swappable<I1, I2> 626 constexpr ranges::swap_ranges_result<I1, I2> 627 ranges::swap_ranges(I1 first1, S1 last1, I2 first2, S2 last2); 628 629template<input_range R1, input_range R2> 630 requires indirectly_swappable<iterator_t<R1>, iterator_t<R2>> 631 constexpr ranges::swap_ranges_result<borrowed_iterator_t<R1>, borrowed_iterator_t<R2>> 632 ranges::swap_ranges(R1&& r1, R2&& r2); 633 634template <class ForwardIterator1, class ForwardIterator2> 635 constexpr void // constexpr in C++20 636 iter_swap(ForwardIterator1 a, ForwardIterator2 b); 637 638template <class InputIterator, class OutputIterator, class UnaryOperation> 639 constexpr OutputIterator // constexpr in C++20 640 transform(InputIterator first, InputIterator last, OutputIterator result, UnaryOperation op); 641 642template <class InputIterator1, class InputIterator2, class OutputIterator, class BinaryOperation> 643 constexpr OutputIterator // constexpr in C++20 644 transform(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, 645 OutputIterator result, BinaryOperation binary_op); 646 647template <class ForwardIterator, class T> 648 constexpr void // constexpr in C++20 649 replace(ForwardIterator first, ForwardIterator last, const T& old_value, const T& new_value); 650 651template <class ForwardIterator, class Predicate, class T> 652 constexpr void // constexpr in C++20 653 replace_if(ForwardIterator first, ForwardIterator last, Predicate pred, const T& new_value); 654 655template <class InputIterator, class OutputIterator, class T> 656 constexpr OutputIterator // constexpr in C++20 657 replace_copy(InputIterator first, InputIterator last, OutputIterator result, 658 const T& old_value, const T& new_value); 659 660template <class InputIterator, class OutputIterator, class Predicate, class T> 661 constexpr OutputIterator // constexpr in C++20 662 replace_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred, const T& new_value); 663 664template <class ForwardIterator, class T> 665 constexpr void // constexpr in C++20 666 fill(ForwardIterator first, ForwardIterator last, const T& value); 667 668template <class OutputIterator, class Size, class T> 669 constexpr OutputIterator // constexpr in C++20 670 fill_n(OutputIterator first, Size n, const T& value); 671 672template <class ForwardIterator, class Generator> 673 constexpr void // constexpr in C++20 674 generate(ForwardIterator first, ForwardIterator last, Generator gen); 675 676template <class OutputIterator, class Size, class Generator> 677 constexpr OutputIterator // constexpr in C++20 678 generate_n(OutputIterator first, Size n, Generator gen); 679 680template <class ForwardIterator, class T> 681 constexpr ForwardIterator // constexpr in C++20 682 remove(ForwardIterator first, ForwardIterator last, const T& value); 683 684template <class ForwardIterator, class Predicate> 685 constexpr ForwardIterator // constexpr in C++20 686 remove_if(ForwardIterator first, ForwardIterator last, Predicate pred); 687 688template <class InputIterator, class OutputIterator, class T> 689 constexpr OutputIterator // constexpr in C++20 690 remove_copy(InputIterator first, InputIterator last, OutputIterator result, const T& value); 691 692template <class InputIterator, class OutputIterator, class Predicate> 693 constexpr OutputIterator // constexpr in C++20 694 remove_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred); 695 696template <class ForwardIterator> 697 constexpr ForwardIterator // constexpr in C++20 698 unique(ForwardIterator first, ForwardIterator last); 699 700template <class ForwardIterator, class BinaryPredicate> 701 constexpr ForwardIterator // constexpr in C++20 702 unique(ForwardIterator first, ForwardIterator last, BinaryPredicate pred); 703 704template <class InputIterator, class OutputIterator> 705 constexpr OutputIterator // constexpr in C++20 706 unique_copy(InputIterator first, InputIterator last, OutputIterator result); 707 708template <class InputIterator, class OutputIterator, class BinaryPredicate> 709 constexpr OutputIterator // constexpr in C++20 710 unique_copy(InputIterator first, InputIterator last, OutputIterator result, BinaryPredicate pred); 711 712template <class BidirectionalIterator> 713 constexpr void // constexpr in C++20 714 reverse(BidirectionalIterator first, BidirectionalIterator last); 715 716template <class BidirectionalIterator, class OutputIterator> 717 constexpr OutputIterator // constexpr in C++20 718 reverse_copy(BidirectionalIterator first, BidirectionalIterator last, OutputIterator result); 719 720template <class ForwardIterator> 721 constexpr ForwardIterator // constexpr in C++20 722 rotate(ForwardIterator first, ForwardIterator middle, ForwardIterator last); 723 724template <class ForwardIterator, class OutputIterator> 725 constexpr OutputIterator // constexpr in C++20 726 rotate_copy(ForwardIterator first, ForwardIterator middle, ForwardIterator last, OutputIterator result); 727 728template <class RandomAccessIterator> 729 void 730 random_shuffle(RandomAccessIterator first, RandomAccessIterator last); // deprecated in C++14, removed in C++17 731 732template <class RandomAccessIterator, class RandomNumberGenerator> 733 void 734 random_shuffle(RandomAccessIterator first, RandomAccessIterator last, 735 RandomNumberGenerator& rand); // deprecated in C++14, removed in C++17 736 737template<class PopulationIterator, class SampleIterator, 738 class Distance, class UniformRandomBitGenerator> 739 SampleIterator sample(PopulationIterator first, PopulationIterator last, 740 SampleIterator out, Distance n, 741 UniformRandomBitGenerator&& g); // C++17 742 743template<class RandomAccessIterator, class UniformRandomNumberGenerator> 744 void shuffle(RandomAccessIterator first, RandomAccessIterator last, 745 UniformRandomNumberGenerator&& g); 746 747template<class ForwardIterator> 748 constexpr ForwardIterator 749 shift_left(ForwardIterator first, ForwardIterator last, 750 typename iterator_traits<ForwardIterator>::difference_type n); // C++20 751 752template<class ForwardIterator> 753 constexpr ForwardIterator 754 shift_right(ForwardIterator first, ForwardIterator last, 755 typename iterator_traits<ForwardIterator>::difference_type n); // C++20 756 757template <class InputIterator, class Predicate> 758 constexpr bool // constexpr in C++20 759 is_partitioned(InputIterator first, InputIterator last, Predicate pred); 760 761template <class ForwardIterator, class Predicate> 762 constexpr ForwardIterator // constexpr in C++20 763 partition(ForwardIterator first, ForwardIterator last, Predicate pred); 764 765template <class InputIterator, class OutputIterator1, 766 class OutputIterator2, class Predicate> 767 constexpr pair<OutputIterator1, OutputIterator2> // constexpr in C++20 768 partition_copy(InputIterator first, InputIterator last, 769 OutputIterator1 out_true, OutputIterator2 out_false, 770 Predicate pred); 771 772template <class ForwardIterator, class Predicate> 773 ForwardIterator 774 stable_partition(ForwardIterator first, ForwardIterator last, Predicate pred); 775 776template<class ForwardIterator, class Predicate> 777 constexpr ForwardIterator // constexpr in C++20 778 partition_point(ForwardIterator first, ForwardIterator last, Predicate pred); 779 780template <class ForwardIterator> 781 constexpr bool // constexpr in C++20 782 is_sorted(ForwardIterator first, ForwardIterator last); 783 784template <class ForwardIterator, class Compare> 785 constexpr bool // constexpr in C++20 786 is_sorted(ForwardIterator first, ForwardIterator last, Compare comp); 787 788template<class ForwardIterator> 789 constexpr ForwardIterator // constexpr in C++20 790 is_sorted_until(ForwardIterator first, ForwardIterator last); 791 792template <class ForwardIterator, class Compare> 793 constexpr ForwardIterator // constexpr in C++20 794 is_sorted_until(ForwardIterator first, ForwardIterator last, Compare comp); 795 796template <class RandomAccessIterator> 797 constexpr void // constexpr in C++20 798 sort(RandomAccessIterator first, RandomAccessIterator last); 799 800template <class RandomAccessIterator, class Compare> 801 constexpr void // constexpr in C++20 802 sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp); 803 804template <class RandomAccessIterator> 805 void 806 stable_sort(RandomAccessIterator first, RandomAccessIterator last); 807 808template <class RandomAccessIterator, class Compare> 809 void 810 stable_sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp); 811 812template <class RandomAccessIterator> 813 constexpr void // constexpr in C++20 814 partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last); 815 816template <class RandomAccessIterator, class Compare> 817 constexpr void // constexpr in C++20 818 partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, Compare comp); 819 820template <class InputIterator, class RandomAccessIterator> 821 constexpr RandomAccessIterator // constexpr in C++20 822 partial_sort_copy(InputIterator first, InputIterator last, 823 RandomAccessIterator result_first, RandomAccessIterator result_last); 824 825template <class InputIterator, class RandomAccessIterator, class Compare> 826 constexpr RandomAccessIterator // constexpr in C++20 827 partial_sort_copy(InputIterator first, InputIterator last, 828 RandomAccessIterator result_first, RandomAccessIterator result_last, Compare comp); 829 830template <class RandomAccessIterator> 831 constexpr void // constexpr in C++20 832 nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last); 833 834template <class RandomAccessIterator, class Compare> 835 constexpr void // constexpr in C++20 836 nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last, Compare comp); 837 838template <class ForwardIterator, class T> 839 constexpr ForwardIterator // constexpr in C++20 840 lower_bound(ForwardIterator first, ForwardIterator last, const T& value); 841 842template <class ForwardIterator, class T, class Compare> 843 constexpr ForwardIterator // constexpr in C++20 844 lower_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp); 845 846template <class ForwardIterator, class T> 847 constexpr ForwardIterator // constexpr in C++20 848 upper_bound(ForwardIterator first, ForwardIterator last, const T& value); 849 850template <class ForwardIterator, class T, class Compare> 851 constexpr ForwardIterator // constexpr in C++20 852 upper_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp); 853 854template <class ForwardIterator, class T> 855 constexpr pair<ForwardIterator, ForwardIterator> // constexpr in C++20 856 equal_range(ForwardIterator first, ForwardIterator last, const T& value); 857 858template <class ForwardIterator, class T, class Compare> 859 constexpr pair<ForwardIterator, ForwardIterator> // constexpr in C++20 860 equal_range(ForwardIterator first, ForwardIterator last, const T& value, Compare comp); 861 862template <class ForwardIterator, class T> 863 constexpr bool // constexpr in C++20 864 binary_search(ForwardIterator first, ForwardIterator last, const T& value); 865 866template <class ForwardIterator, class T, class Compare> 867 constexpr bool // constexpr in C++20 868 binary_search(ForwardIterator first, ForwardIterator last, const T& value, Compare comp); 869 870template <class InputIterator1, class InputIterator2, class OutputIterator> 871 constexpr OutputIterator // constexpr in C++20 872 merge(InputIterator1 first1, InputIterator1 last1, 873 InputIterator2 first2, InputIterator2 last2, OutputIterator result); 874 875template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare> 876 constexpr OutputIterator // constexpr in C++20 877 merge(InputIterator1 first1, InputIterator1 last1, 878 InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp); 879 880template <class BidirectionalIterator> 881 void 882 inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last); 883 884template <class BidirectionalIterator, class Compare> 885 void 886 inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last, Compare comp); 887 888template <class InputIterator1, class InputIterator2> 889 constexpr bool // constexpr in C++20 890 includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2); 891 892template <class InputIterator1, class InputIterator2, class Compare> 893 constexpr bool // constexpr in C++20 894 includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, Compare comp); 895 896template <class InputIterator1, class InputIterator2, class OutputIterator> 897 constexpr OutputIterator // constexpr in C++20 898 set_union(InputIterator1 first1, InputIterator1 last1, 899 InputIterator2 first2, InputIterator2 last2, OutputIterator result); 900 901template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare> 902 constexpr OutputIterator // constexpr in C++20 903 set_union(InputIterator1 first1, InputIterator1 last1, 904 InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp); 905 906template <class InputIterator1, class InputIterator2, class OutputIterator> 907 constexpr OutputIterator // constexpr in C++20 908 set_intersection(InputIterator1 first1, InputIterator1 last1, 909 InputIterator2 first2, InputIterator2 last2, OutputIterator result); 910 911template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare> 912 constexpr OutputIterator // constexpr in C++20 913 set_intersection(InputIterator1 first1, InputIterator1 last1, 914 InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp); 915 916template <class InputIterator1, class InputIterator2, class OutputIterator> 917 constexpr OutputIterator // constexpr in C++20 918 set_difference(InputIterator1 first1, InputIterator1 last1, 919 InputIterator2 first2, InputIterator2 last2, OutputIterator result); 920 921template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare> 922 constexpr OutputIterator // constexpr in C++20 923 set_difference(InputIterator1 first1, InputIterator1 last1, 924 InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp); 925 926template <class InputIterator1, class InputIterator2, class OutputIterator> 927 constexpr OutputIterator // constexpr in C++20 928 set_symmetric_difference(InputIterator1 first1, InputIterator1 last1, 929 InputIterator2 first2, InputIterator2 last2, OutputIterator result); 930 931template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare> 932 constexpr OutputIterator // constexpr in C++20 933 set_symmetric_difference(InputIterator1 first1, InputIterator1 last1, 934 InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp); 935 936template <class RandomAccessIterator> 937 constexpr void // constexpr in C++20 938 push_heap(RandomAccessIterator first, RandomAccessIterator last); 939 940template <class RandomAccessIterator, class Compare> 941 constexpr void // constexpr in C++20 942 push_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp); 943 944template <class RandomAccessIterator> 945 constexpr void // constexpr in C++20 946 pop_heap(RandomAccessIterator first, RandomAccessIterator last); 947 948template <class RandomAccessIterator, class Compare> 949 constexpr void // constexpr in C++20 950 pop_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp); 951 952template <class RandomAccessIterator> 953 constexpr void // constexpr in C++20 954 make_heap(RandomAccessIterator first, RandomAccessIterator last); 955 956template <class RandomAccessIterator, class Compare> 957 constexpr void // constexpr in C++20 958 make_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp); 959 960template <class RandomAccessIterator> 961 constexpr void // constexpr in C++20 962 sort_heap(RandomAccessIterator first, RandomAccessIterator last); 963 964template <class RandomAccessIterator, class Compare> 965 constexpr void // constexpr in C++20 966 sort_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp); 967 968template <class RandomAccessIterator> 969 constexpr bool // constexpr in C++20 970 is_heap(RandomAccessIterator first, RandomAccessiterator last); 971 972template <class RandomAccessIterator, class Compare> 973 constexpr bool // constexpr in C++20 974 is_heap(RandomAccessIterator first, RandomAccessiterator last, Compare comp); 975 976template <class RandomAccessIterator> 977 constexpr RandomAccessIterator // constexpr in C++20 978 is_heap_until(RandomAccessIterator first, RandomAccessiterator last); 979 980template <class RandomAccessIterator, class Compare> 981 constexpr RandomAccessIterator // constexpr in C++20 982 is_heap_until(RandomAccessIterator first, RandomAccessiterator last, Compare comp); 983 984template <class ForwardIterator> 985 constexpr ForwardIterator // constexpr in C++14 986 min_element(ForwardIterator first, ForwardIterator last); 987 988template <class ForwardIterator, class Compare> 989 constexpr ForwardIterator // constexpr in C++14 990 min_element(ForwardIterator first, ForwardIterator last, Compare comp); 991 992template <class T> 993 constexpr const T& // constexpr in C++14 994 min(const T& a, const T& b); 995 996template <class T, class Compare> 997 constexpr const T& // constexpr in C++14 998 min(const T& a, const T& b, Compare comp); 999 1000template<class T> 1001 constexpr T // constexpr in C++14 1002 min(initializer_list<T> t); 1003 1004template<class T, class Compare> 1005 constexpr T // constexpr in C++14 1006 min(initializer_list<T> t, Compare comp); 1007 1008template<class T> 1009 constexpr const T& clamp(const T& v, const T& lo, const T& hi); // C++17 1010 1011template<class T, class Compare> 1012 constexpr const T& clamp(const T& v, const T& lo, const T& hi, Compare comp); // C++17 1013 1014template <class ForwardIterator> 1015 constexpr ForwardIterator // constexpr in C++14 1016 max_element(ForwardIterator first, ForwardIterator last); 1017 1018template <class ForwardIterator, class Compare> 1019 constexpr ForwardIterator // constexpr in C++14 1020 max_element(ForwardIterator first, ForwardIterator last, Compare comp); 1021 1022template <class T> 1023 constexpr const T& // constexpr in C++14 1024 max(const T& a, const T& b); 1025 1026template <class T, class Compare> 1027 constexpr const T& // constexpr in C++14 1028 max(const T& a, const T& b, Compare comp); 1029 1030template<class T> 1031 constexpr T // constexpr in C++14 1032 max(initializer_list<T> t); 1033 1034template<class T, class Compare> 1035 constexpr T // constexpr in C++14 1036 max(initializer_list<T> t, Compare comp); 1037 1038template<class ForwardIterator> 1039 constexpr pair<ForwardIterator, ForwardIterator> // constexpr in C++14 1040 minmax_element(ForwardIterator first, ForwardIterator last); 1041 1042template<class ForwardIterator, class Compare> 1043 constexpr pair<ForwardIterator, ForwardIterator> // constexpr in C++14 1044 minmax_element(ForwardIterator first, ForwardIterator last, Compare comp); 1045 1046template<class T> 1047 constexpr pair<const T&, const T&> // constexpr in C++14 1048 minmax(const T& a, const T& b); 1049 1050template<class T, class Compare> 1051 constexpr pair<const T&, const T&> // constexpr in C++14 1052 minmax(const T& a, const T& b, Compare comp); 1053 1054template<class T> 1055 constexpr pair<T, T> // constexpr in C++14 1056 minmax(initializer_list<T> t); 1057 1058template<class T, class Compare> 1059 constexpr pair<T, T> // constexpr in C++14 1060 minmax(initializer_list<T> t, Compare comp); 1061 1062template <class InputIterator1, class InputIterator2> 1063 constexpr bool // constexpr in C++20 1064 lexicographical_compare(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2); 1065 1066template <class InputIterator1, class InputIterator2, class Compare> 1067 constexpr bool // constexpr in C++20 1068 lexicographical_compare(InputIterator1 first1, InputIterator1 last1, 1069 InputIterator2 first2, InputIterator2 last2, Compare comp); 1070 1071template <class BidirectionalIterator> 1072 constexpr bool // constexpr in C++20 1073 next_permutation(BidirectionalIterator first, BidirectionalIterator last); 1074 1075template <class BidirectionalIterator, class Compare> 1076 constexpr bool // constexpr in C++20 1077 next_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp); 1078 1079template <class BidirectionalIterator> 1080 constexpr bool // constexpr in C++20 1081 prev_permutation(BidirectionalIterator first, BidirectionalIterator last); 1082 1083template <class BidirectionalIterator, class Compare> 1084 constexpr bool // constexpr in C++20 1085 prev_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp); 1086} // std 1087 1088*/ 1089 1090#include <__assert> // all public C++ headers provide the assertion handler 1091#include <__bits> 1092#include <__config> 1093#include <__debug> 1094#include <cstddef> 1095#include <cstring> 1096#include <memory> 1097#include <type_traits> 1098#include <version> 1099 1100#include <__algorithm/adjacent_find.h> 1101#include <__algorithm/all_of.h> 1102#include <__algorithm/any_of.h> 1103#include <__algorithm/binary_search.h> 1104#include <__algorithm/clamp.h> 1105#include <__algorithm/comp.h> 1106#include <__algorithm/comp_ref_type.h> 1107#include <__algorithm/copy.h> 1108#include <__algorithm/copy_backward.h> 1109#include <__algorithm/copy_if.h> 1110#include <__algorithm/copy_n.h> 1111#include <__algorithm/count.h> 1112#include <__algorithm/count_if.h> 1113#include <__algorithm/equal.h> 1114#include <__algorithm/equal_range.h> 1115#include <__algorithm/fill.h> 1116#include <__algorithm/fill_n.h> 1117#include <__algorithm/find.h> 1118#include <__algorithm/find_end.h> 1119#include <__algorithm/find_first_of.h> 1120#include <__algorithm/find_if.h> 1121#include <__algorithm/find_if_not.h> 1122#include <__algorithm/for_each.h> 1123#include <__algorithm/for_each_n.h> 1124#include <__algorithm/generate.h> 1125#include <__algorithm/generate_n.h> 1126#include <__algorithm/half_positive.h> 1127#include <__algorithm/in_found_result.h> 1128#include <__algorithm/in_fun_result.h> 1129#include <__algorithm/in_in_out_result.h> 1130#include <__algorithm/in_in_result.h> 1131#include <__algorithm/in_out_out_result.h> 1132#include <__algorithm/in_out_result.h> 1133#include <__algorithm/includes.h> 1134#include <__algorithm/inplace_merge.h> 1135#include <__algorithm/is_heap.h> 1136#include <__algorithm/is_heap_until.h> 1137#include <__algorithm/is_partitioned.h> 1138#include <__algorithm/is_permutation.h> 1139#include <__algorithm/is_sorted.h> 1140#include <__algorithm/is_sorted_until.h> 1141#include <__algorithm/iter_swap.h> 1142#include <__algorithm/lexicographical_compare.h> 1143#include <__algorithm/lower_bound.h> 1144#include <__algorithm/make_heap.h> 1145#include <__algorithm/max.h> 1146#include <__algorithm/max_element.h> 1147#include <__algorithm/merge.h> 1148#include <__algorithm/min.h> 1149#include <__algorithm/min_element.h> 1150#include <__algorithm/min_max_result.h> 1151#include <__algorithm/minmax.h> 1152#include <__algorithm/minmax_element.h> 1153#include <__algorithm/mismatch.h> 1154#include <__algorithm/move.h> 1155#include <__algorithm/move_backward.h> 1156#include <__algorithm/next_permutation.h> 1157#include <__algorithm/none_of.h> 1158#include <__algorithm/nth_element.h> 1159#include <__algorithm/partial_sort.h> 1160#include <__algorithm/partial_sort_copy.h> 1161#include <__algorithm/partition.h> 1162#include <__algorithm/partition_copy.h> 1163#include <__algorithm/partition_point.h> 1164#include <__algorithm/pop_heap.h> 1165#include <__algorithm/prev_permutation.h> 1166#include <__algorithm/push_heap.h> 1167#include <__algorithm/ranges_adjacent_find.h> 1168#include <__algorithm/ranges_all_of.h> 1169#include <__algorithm/ranges_any_of.h> 1170#include <__algorithm/ranges_binary_search.h> 1171#include <__algorithm/ranges_copy.h> 1172#include <__algorithm/ranges_copy_backward.h> 1173#include <__algorithm/ranges_copy_if.h> 1174#include <__algorithm/ranges_copy_n.h> 1175#include <__algorithm/ranges_count.h> 1176#include <__algorithm/ranges_count_if.h> 1177#include <__algorithm/ranges_equal.h> 1178#include <__algorithm/ranges_fill.h> 1179#include <__algorithm/ranges_fill_n.h> 1180#include <__algorithm/ranges_find.h> 1181#include <__algorithm/ranges_find_first_of.h> 1182#include <__algorithm/ranges_find_if.h> 1183#include <__algorithm/ranges_find_if_not.h> 1184#include <__algorithm/ranges_for_each.h> 1185#include <__algorithm/ranges_for_each_n.h> 1186#include <__algorithm/ranges_is_partitioned.h> 1187#include <__algorithm/ranges_is_sorted.h> 1188#include <__algorithm/ranges_is_sorted_until.h> 1189#include <__algorithm/ranges_lexicographical_compare.h> 1190#include <__algorithm/ranges_lower_bound.h> 1191#include <__algorithm/ranges_max.h> 1192#include <__algorithm/ranges_max_element.h> 1193#include <__algorithm/ranges_min.h> 1194#include <__algorithm/ranges_min_element.h> 1195#include <__algorithm/ranges_minmax.h> 1196#include <__algorithm/ranges_minmax_element.h> 1197#include <__algorithm/ranges_mismatch.h> 1198#include <__algorithm/ranges_none_of.h> 1199#include <__algorithm/ranges_replace.h> 1200#include <__algorithm/ranges_replace_if.h> 1201#include <__algorithm/ranges_reverse.h> 1202#include <__algorithm/ranges_sort.h> 1203#include <__algorithm/ranges_swap_ranges.h> 1204#include <__algorithm/ranges_transform.h> 1205#include <__algorithm/ranges_upper_bound.h> 1206#include <__algorithm/remove.h> 1207#include <__algorithm/remove_copy.h> 1208#include <__algorithm/remove_copy_if.h> 1209#include <__algorithm/remove_if.h> 1210#include <__algorithm/replace.h> 1211#include <__algorithm/replace_copy.h> 1212#include <__algorithm/replace_copy_if.h> 1213#include <__algorithm/replace_if.h> 1214#include <__algorithm/reverse.h> 1215#include <__algorithm/reverse_copy.h> 1216#include <__algorithm/rotate.h> 1217#include <__algorithm/rotate_copy.h> 1218#include <__algorithm/sample.h> 1219#include <__algorithm/search.h> 1220#include <__algorithm/search_n.h> 1221#include <__algorithm/set_difference.h> 1222#include <__algorithm/set_intersection.h> 1223#include <__algorithm/set_symmetric_difference.h> 1224#include <__algorithm/set_union.h> 1225#include <__algorithm/shift_left.h> 1226#include <__algorithm/shift_right.h> 1227#include <__algorithm/shuffle.h> 1228#include <__algorithm/sift_down.h> 1229#include <__algorithm/sort.h> 1230#include <__algorithm/sort_heap.h> 1231#include <__algorithm/stable_partition.h> 1232#include <__algorithm/stable_sort.h> 1233#include <__algorithm/swap_ranges.h> 1234#include <__algorithm/transform.h> 1235#include <__algorithm/unique.h> 1236#include <__algorithm/unique_copy.h> 1237#include <__algorithm/unwrap_iter.h> 1238#include <__algorithm/upper_bound.h> 1239 1240// standard-mandated includes 1241#include <initializer_list> 1242 1243#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 1244# pragma GCC system_header 1245#endif 1246 1247#if defined(_LIBCPP_HAS_PARALLEL_ALGORITHMS) && _LIBCPP_STD_VER >= 17 1248# include <__pstl_algorithm> 1249#endif 1250 1251#endif // _LIBCPP_ALGORITHM 1252