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 <input_iterator I1, sentinel_for<_I1> S1, input_iterator I2, sentinel_for<_I2> S2, 49 class Pred = ranges::equal_to, class Proj1 = identity, class Proj2 = identity> 50 requires indirectly_comparable<I1, I2, Pred, Proj1, Proj2> 51 constexpr mismatch_result<_I1, _I2> 52 mismatch()(I1 first1, S1 last1, I2 first2, S2 last2, Pred pred = {}, Proj1 proj1 = {}, Proj2 proj2 = {}) // since C++20 53 54 template <input_range R1, input_range R2, 55 class Pred = ranges::equal_to, class Proj1 = identity, class Proj2 = identity> 56 requires indirectly_comparable<iterator_t<R1>, iterator_t<R2>, Pred, Proj1, Proj2> 57 constexpr mismatch_result<borrowed_iterator_t<R1>, borrowed_iterator_t<R2>> 58 mismatch(R1&& r1, R2&& r2, Pred pred = {}, Proj1 proj1 = {}, Proj2 proj2 = {}) // since C++20 59 60 requires indirect_binary_predicate<ranges::equal_to, projected<I, Proj>, const T*> 61 constexpr I find(I first, S last, const T& value, Proj proj = {}); // since C++20 62 63 template<input_range R, class T, class Proj = identity> 64 requires indirect_binary_predicate<ranges::equal_to, projected<iterator_t<R>, Proj>, const T*> 65 constexpr borrowed_iterator_t<R> 66 find(R&& r, const T& value, Proj proj = {}); // since C++20 67 68 template<input_iterator I, sentinel_for<I> S, class Proj = identity, 69 indirect_unary_predicate<projected<I, Proj>> Pred> 70 constexpr I find_if(I first, S last, Pred pred, Proj proj = {}); // since C++20 71 72 template<input_range R, class Proj = identity, 73 indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred> 74 constexpr borrowed_iterator_t<R> 75 find_if(R&& r, Pred pred, Proj proj = {}); // since C++20 76 77 template<input_iterator I, sentinel_for<I> S, class Proj = identity, 78 indirect_unary_predicate<projected<I, Proj>> Pred> 79 constexpr I find_if_not(I first, S last, Pred pred, Proj proj = {}); // since C++20 80 81 template<input_range R, class Proj = identity, 82 indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred> 83 constexpr borrowed_iterator_t<R> 84 find_if_not(R&& r, Pred pred, Proj proj = {}); // since C++20 85 86 template<class T, class Proj = identity, 87 indirect_strict_weak_order<projected<const T*, Proj>> Comp = ranges::less> 88 constexpr const T& min(const T& a, const T& b, Comp comp = {}, Proj proj = {}); // since C++20 89 90 template<copyable T, class Proj = identity, 91 indirect_strict_weak_order<projected<const T*, Proj>> Comp = ranges::less> 92 constexpr T min(initializer_list<T> r, Comp comp = {}, Proj proj = {}); // since C++20 93 94 template<input_range R, class Proj = identity, 95 indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less> 96 requires indirectly_copyable_storable<iterator_t<R>, range_value_t<R>*> 97 constexpr range_value_t<R> 98 min(R&& r, Comp comp = {}, Proj proj = {}); // since C++20 99 100 template<class T, class Proj = identity, 101 indirect_strict_weak_order<projected<const T*, Proj>> Comp = ranges::less> 102 constexpr const T& max(const T& a, const T& b, Comp comp = {}, Proj proj = {}); // since C++20 103 104 template<copyable T, class Proj = identity, 105 indirect_strict_weak_order<projected<const T*, Proj>> Comp = ranges::less> 106 constexpr T max(initializer_list<T> r, Comp comp = {}, Proj proj = {}); // since C++20 107 108 template<input_range R, class Proj = identity, 109 indirect_strict_weak_order<projected<iterator_t<R>, Proj>> Comp = ranges::less> 110 requires indirectly_copyable_storable<iterator_t<R>, range_value_t<R>*> 111 constexpr range_value_t<R> 112 max(R&& r, Comp comp = {}, Proj proj = {}); // since C++20 113 114 template<class I, class O> 115 using unary_transform_result = in_out_result<I, O>; // since C++20 116 117 template<class I1, class I2, class O> 118 using binary_transform_result = in_in_out_result<I1, I2, O>; // since C++20 119 120 template<input_iterator I, sentinel_for<I> S, weakly_incrementable O, 121 copy_constructible F, class Proj = identity> 122 requires indirectly_writable<O, indirect_result_t<F&, projected<I, Proj>>> 123 constexpr ranges::unary_transform_result<I, O> 124 transform(I first1, S last1, O result, F op, Proj proj = {}); // since C++20 125 126 template<input_range R, weakly_incrementable O, copy_constructible F, 127 class Proj = identity> 128 requires indirectly_writable<O, indirect_result_t<F&, projected<iterator_t<R>, Proj>>> 129 constexpr ranges::unary_transform_result<borrowed_iterator_t<R>, O> 130 transform(R&& r, O result, F op, Proj proj = {}); // since C++20 131 132 template<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2, 133 weakly_incrementable O, copy_constructible F, class Proj1 = identity, 134 class Proj2 = identity> 135 requires indirectly_writable<O, indirect_result_t<F&, projected<I1, Proj1>, 136 projected<I2, Proj2>>> 137 constexpr ranges::binary_transform_result<I1, I2, O> 138 transform(I1 first1, S1 last1, I2 first2, S2 last2, O result, 139 F binary_op, Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20 140 141 template<input_range R1, input_range R2, weakly_incrementable O, 142 copy_constructible F, class Proj1 = identity, class Proj2 = identity> 143 requires indirectly_writable<O, indirect_result_t<F&, projected<iterator_t<R1>, Proj1>, 144 projected<iterator_t<R2>, Proj2>>> 145 constexpr ranges::binary_transform_result<borrowed_iterator_t<R1>, borrowed_iterator_t<R2>, O> 146 transform(R1&& r1, R2&& r2, O result, 147 F binary_op, Proj1 proj1 = {}, Proj2 proj2 = {}); // since C++20 148 149 template<input_iterator I, sentinel_for<I> S, class T, class Proj = identity> 150 requires indirect_binary_predicate<ranges::equal_to, projected<I, Proj>, const T*> 151 constexpr iter_difference_t<I> 152 count(I first, S last, const T& value, Proj proj = {}); // since C++20 153 154 template<input_range R, class T, class Proj = identity> 155 requires indirect_binary_predicate<ranges::equal_to, projected<iterator_t<R>, Proj>, const T*> 156 constexpr range_difference_t<R> 157 count(R&& r, const T& value, Proj proj = {}); // since C++20 158 159 template<input_iterator I, sentinel_for<I> S, class Proj = identity, 160 indirect_unary_predicate<projected<I, Proj>> Pred> 161 constexpr iter_difference_t<I> 162 count_if(I first, S last, Pred pred, Proj proj = {}); // since C++20 163 164 template<input_range R, class Proj = identity, 165 indirect_unary_predicate<projected<iterator_t<R>, Proj>> Pred> 166 constexpr range_difference_t<R> 167 count_if(R&& r, Pred pred, Proj proj = {}); // since C++20 168} 169 170 constexpr bool // constexpr in C++20 171 all_of(InputIterator first, InputIterator last, Predicate pred); 172 173template <class InputIterator, class Predicate> 174 constexpr bool // constexpr in C++20 175 any_of(InputIterator first, InputIterator last, Predicate pred); 176 177template <class InputIterator, class Predicate> 178 constexpr bool // constexpr in C++20 179 none_of(InputIterator first, InputIterator last, Predicate pred); 180 181template <class InputIterator, class Function> 182 constexpr Function // constexpr in C++20 183 for_each(InputIterator first, InputIterator last, Function f); 184 185template<class InputIterator, class Size, class Function> 186 constexpr InputIterator // constexpr in C++20 187 for_each_n(InputIterator first, Size n, Function f); // C++17 188 189template <class InputIterator, class T> 190 constexpr InputIterator // constexpr in C++20 191 find(InputIterator first, InputIterator last, const T& value); 192 193template <class InputIterator, class Predicate> 194 constexpr InputIterator // constexpr in C++20 195 find_if(InputIterator first, InputIterator last, Predicate pred); 196 197template<class InputIterator, class Predicate> 198 constexpr InputIterator // constexpr in C++20 199 find_if_not(InputIterator first, InputIterator last, Predicate pred); 200 201template <class ForwardIterator1, class ForwardIterator2> 202 constexpr ForwardIterator1 // constexpr in C++20 203 find_end(ForwardIterator1 first1, ForwardIterator1 last1, 204 ForwardIterator2 first2, ForwardIterator2 last2); 205 206template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> 207 constexpr ForwardIterator1 // constexpr in C++20 208 find_end(ForwardIterator1 first1, ForwardIterator1 last1, 209 ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred); 210 211template <class ForwardIterator1, class ForwardIterator2> 212 constexpr ForwardIterator1 // constexpr in C++20 213 find_first_of(ForwardIterator1 first1, ForwardIterator1 last1, 214 ForwardIterator2 first2, ForwardIterator2 last2); 215 216template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> 217 constexpr ForwardIterator1 // constexpr in C++20 218 find_first_of(ForwardIterator1 first1, ForwardIterator1 last1, 219 ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred); 220 221template <class ForwardIterator> 222 constexpr ForwardIterator // constexpr in C++20 223 adjacent_find(ForwardIterator first, ForwardIterator last); 224 225template <class ForwardIterator, class BinaryPredicate> 226 constexpr ForwardIterator // constexpr in C++20 227 adjacent_find(ForwardIterator first, ForwardIterator last, BinaryPredicate pred); 228 229template <class InputIterator, class T> 230 constexpr typename iterator_traits<InputIterator>::difference_type // constexpr in C++20 231 count(InputIterator first, InputIterator last, const T& value); 232 233template <class InputIterator, class Predicate> 234 constexpr typename iterator_traits<InputIterator>::difference_type // constexpr in C++20 235 count_if(InputIterator first, InputIterator last, Predicate pred); 236 237template <class InputIterator1, class InputIterator2> 238 constexpr pair<InputIterator1, InputIterator2> // constexpr in C++20 239 mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2); 240 241template <class InputIterator1, class InputIterator2> 242 constexpr pair<InputIterator1, InputIterator2> // constexpr in C++20 243 mismatch(InputIterator1 first1, InputIterator1 last1, 244 InputIterator2 first2, InputIterator2 last2); // **C++14** 245 246template <class InputIterator1, class InputIterator2, class BinaryPredicate> 247 constexpr pair<InputIterator1, InputIterator2> // constexpr in C++20 248 mismatch(InputIterator1 first1, InputIterator1 last1, 249 InputIterator2 first2, BinaryPredicate pred); 250 251template <class InputIterator1, class InputIterator2, class BinaryPredicate> 252 constexpr pair<InputIterator1, InputIterator2> // constexpr in C++20 253 mismatch(InputIterator1 first1, InputIterator1 last1, 254 InputIterator2 first2, InputIterator2 last2, 255 BinaryPredicate pred); // **C++14** 256 257template <class InputIterator1, class InputIterator2> 258 constexpr bool // constexpr in C++20 259 equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2); 260 261template <class InputIterator1, class InputIterator2> 262 constexpr bool // constexpr in C++20 263 equal(InputIterator1 first1, InputIterator1 last1, 264 InputIterator2 first2, InputIterator2 last2); // **C++14** 265 266template <class InputIterator1, class InputIterator2, class BinaryPredicate> 267 constexpr bool // constexpr in C++20 268 equal(InputIterator1 first1, InputIterator1 last1, 269 InputIterator2 first2, BinaryPredicate pred); 270 271template <class InputIterator1, class InputIterator2, class BinaryPredicate> 272 constexpr bool // constexpr in C++20 273 equal(InputIterator1 first1, InputIterator1 last1, 274 InputIterator2 first2, InputIterator2 last2, 275 BinaryPredicate pred); // **C++14** 276 277template<class ForwardIterator1, class ForwardIterator2> 278 constexpr bool // constexpr in C++20 279 is_permutation(ForwardIterator1 first1, ForwardIterator1 last1, 280 ForwardIterator2 first2); 281 282template<class ForwardIterator1, class ForwardIterator2> 283 constexpr bool // constexpr in C++20 284 is_permutation(ForwardIterator1 first1, ForwardIterator1 last1, 285 ForwardIterator2 first2, ForwardIterator2 last2); // **C++14** 286 287template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> 288 constexpr bool // constexpr in C++20 289 is_permutation(ForwardIterator1 first1, ForwardIterator1 last1, 290 ForwardIterator2 first2, BinaryPredicate pred); 291 292template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> 293 constexpr bool // constexpr in C++20 294 is_permutation(ForwardIterator1 first1, ForwardIterator1 last1, 295 ForwardIterator2 first2, ForwardIterator2 last2, 296 BinaryPredicate pred); // **C++14** 297 298template <class ForwardIterator1, class ForwardIterator2> 299 constexpr ForwardIterator1 // constexpr in C++20 300 search(ForwardIterator1 first1, ForwardIterator1 last1, 301 ForwardIterator2 first2, ForwardIterator2 last2); 302 303template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> 304 constexpr ForwardIterator1 // constexpr in C++20 305 search(ForwardIterator1 first1, ForwardIterator1 last1, 306 ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred); 307 308template <class ForwardIterator, class Size, class T> 309 constexpr ForwardIterator // constexpr in C++20 310 search_n(ForwardIterator first, ForwardIterator last, Size count, const T& value); 311 312template <class ForwardIterator, class Size, class T, class BinaryPredicate> 313 constexpr ForwardIterator // constexpr in C++20 314 search_n(ForwardIterator first, ForwardIterator last, 315 Size count, const T& value, BinaryPredicate pred); 316 317template <class InputIterator, class OutputIterator> 318 constexpr OutputIterator // constexpr in C++20 319 copy(InputIterator first, InputIterator last, OutputIterator result); 320 321template<class InputIterator, class OutputIterator, class Predicate> 322 constexpr OutputIterator // constexpr in C++20 323 copy_if(InputIterator first, InputIterator last, 324 OutputIterator result, Predicate pred); 325 326template<class InputIterator, class Size, class OutputIterator> 327 constexpr OutputIterator // constexpr in C++20 328 copy_n(InputIterator first, Size n, OutputIterator result); 329 330template <class BidirectionalIterator1, class BidirectionalIterator2> 331 constexpr BidirectionalIterator2 // constexpr in C++20 332 copy_backward(BidirectionalIterator1 first, BidirectionalIterator1 last, 333 BidirectionalIterator2 result); 334 335template <class ForwardIterator1, class ForwardIterator2> 336 constexpr ForwardIterator2 // constexpr in C++20 337 swap_ranges(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2); 338 339template<input_iterator I1, sentinel_for<I1> S1, input_iterator I2, sentinel_for<I2> S2> 340 requires indirectly_swappable<I1, I2> 341 constexpr ranges::swap_ranges_result<I1, I2> 342 ranges::swap_ranges(I1 first1, S1 last1, I2 first2, S2 last2); 343 344template<input_range R1, input_range R2> 345 requires indirectly_swappable<iterator_t<R1>, iterator_t<R2>> 346 constexpr ranges::swap_ranges_result<borrowed_iterator_t<R1>, borrowed_iterator_t<R2>> 347 ranges::swap_ranges(R1&& r1, R2&& r2); 348 349template <class ForwardIterator1, class ForwardIterator2> 350 constexpr void // constexpr in C++20 351 iter_swap(ForwardIterator1 a, ForwardIterator2 b); 352 353template <class InputIterator, class OutputIterator, class UnaryOperation> 354 constexpr OutputIterator // constexpr in C++20 355 transform(InputIterator first, InputIterator last, OutputIterator result, UnaryOperation op); 356 357template <class InputIterator1, class InputIterator2, class OutputIterator, class BinaryOperation> 358 constexpr OutputIterator // constexpr in C++20 359 transform(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, 360 OutputIterator result, BinaryOperation binary_op); 361 362template <class ForwardIterator, class T> 363 constexpr void // constexpr in C++20 364 replace(ForwardIterator first, ForwardIterator last, const T& old_value, const T& new_value); 365 366template <class ForwardIterator, class Predicate, class T> 367 constexpr void // constexpr in C++20 368 replace_if(ForwardIterator first, ForwardIterator last, Predicate pred, const T& new_value); 369 370template <class InputIterator, class OutputIterator, class T> 371 constexpr OutputIterator // constexpr in C++20 372 replace_copy(InputIterator first, InputIterator last, OutputIterator result, 373 const T& old_value, const T& new_value); 374 375template <class InputIterator, class OutputIterator, class Predicate, class T> 376 constexpr OutputIterator // constexpr in C++20 377 replace_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred, const T& new_value); 378 379template <class ForwardIterator, class T> 380 constexpr void // constexpr in C++20 381 fill(ForwardIterator first, ForwardIterator last, const T& value); 382 383template <class OutputIterator, class Size, class T> 384 constexpr OutputIterator // constexpr in C++20 385 fill_n(OutputIterator first, Size n, const T& value); 386 387template <class ForwardIterator, class Generator> 388 constexpr void // constexpr in C++20 389 generate(ForwardIterator first, ForwardIterator last, Generator gen); 390 391template <class OutputIterator, class Size, class Generator> 392 constexpr OutputIterator // constexpr in C++20 393 generate_n(OutputIterator first, Size n, Generator gen); 394 395template <class ForwardIterator, class T> 396 constexpr ForwardIterator // constexpr in C++20 397 remove(ForwardIterator first, ForwardIterator last, const T& value); 398 399template <class ForwardIterator, class Predicate> 400 constexpr ForwardIterator // constexpr in C++20 401 remove_if(ForwardIterator first, ForwardIterator last, Predicate pred); 402 403template <class InputIterator, class OutputIterator, class T> 404 constexpr OutputIterator // constexpr in C++20 405 remove_copy(InputIterator first, InputIterator last, OutputIterator result, const T& value); 406 407template <class InputIterator, class OutputIterator, class Predicate> 408 constexpr OutputIterator // constexpr in C++20 409 remove_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred); 410 411template <class ForwardIterator> 412 constexpr ForwardIterator // constexpr in C++20 413 unique(ForwardIterator first, ForwardIterator last); 414 415template <class ForwardIterator, class BinaryPredicate> 416 constexpr ForwardIterator // constexpr in C++20 417 unique(ForwardIterator first, ForwardIterator last, BinaryPredicate pred); 418 419template <class InputIterator, class OutputIterator> 420 constexpr OutputIterator // constexpr in C++20 421 unique_copy(InputIterator first, InputIterator last, OutputIterator result); 422 423template <class InputIterator, class OutputIterator, class BinaryPredicate> 424 constexpr OutputIterator // constexpr in C++20 425 unique_copy(InputIterator first, InputIterator last, OutputIterator result, BinaryPredicate pred); 426 427template <class BidirectionalIterator> 428 constexpr void // constexpr in C++20 429 reverse(BidirectionalIterator first, BidirectionalIterator last); 430 431template <class BidirectionalIterator, class OutputIterator> 432 constexpr OutputIterator // constexpr in C++20 433 reverse_copy(BidirectionalIterator first, BidirectionalIterator last, OutputIterator result); 434 435template <class ForwardIterator> 436 constexpr ForwardIterator // constexpr in C++20 437 rotate(ForwardIterator first, ForwardIterator middle, ForwardIterator last); 438 439template <class ForwardIterator, class OutputIterator> 440 constexpr OutputIterator // constexpr in C++20 441 rotate_copy(ForwardIterator first, ForwardIterator middle, ForwardIterator last, OutputIterator result); 442 443template <class RandomAccessIterator> 444 void 445 random_shuffle(RandomAccessIterator first, RandomAccessIterator last); // deprecated in C++14, removed in C++17 446 447template <class RandomAccessIterator, class RandomNumberGenerator> 448 void 449 random_shuffle(RandomAccessIterator first, RandomAccessIterator last, 450 RandomNumberGenerator& rand); // deprecated in C++14, removed in C++17 451 452template<class PopulationIterator, class SampleIterator, 453 class Distance, class UniformRandomBitGenerator> 454 SampleIterator sample(PopulationIterator first, PopulationIterator last, 455 SampleIterator out, Distance n, 456 UniformRandomBitGenerator&& g); // C++17 457 458template<class RandomAccessIterator, class UniformRandomNumberGenerator> 459 void shuffle(RandomAccessIterator first, RandomAccessIterator last, 460 UniformRandomNumberGenerator&& g); 461 462template<class ForwardIterator> 463 constexpr ForwardIterator 464 shift_left(ForwardIterator first, ForwardIterator last, 465 typename iterator_traits<ForwardIterator>::difference_type n); // C++20 466 467template<class ForwardIterator> 468 constexpr ForwardIterator 469 shift_right(ForwardIterator first, ForwardIterator last, 470 typename iterator_traits<ForwardIterator>::difference_type n); // C++20 471 472template <class InputIterator, class Predicate> 473 constexpr bool // constexpr in C++20 474 is_partitioned(InputIterator first, InputIterator last, Predicate pred); 475 476template <class ForwardIterator, class Predicate> 477 constexpr ForwardIterator // constexpr in C++20 478 partition(ForwardIterator first, ForwardIterator last, Predicate pred); 479 480template <class InputIterator, class OutputIterator1, 481 class OutputIterator2, class Predicate> 482 constexpr pair<OutputIterator1, OutputIterator2> // constexpr in C++20 483 partition_copy(InputIterator first, InputIterator last, 484 OutputIterator1 out_true, OutputIterator2 out_false, 485 Predicate pred); 486 487template <class ForwardIterator, class Predicate> 488 ForwardIterator 489 stable_partition(ForwardIterator first, ForwardIterator last, Predicate pred); 490 491template<class ForwardIterator, class Predicate> 492 constexpr ForwardIterator // constexpr in C++20 493 partition_point(ForwardIterator first, ForwardIterator last, Predicate pred); 494 495template <class ForwardIterator> 496 constexpr bool // constexpr in C++20 497 is_sorted(ForwardIterator first, ForwardIterator last); 498 499template <class ForwardIterator, class Compare> 500 constexpr bool // constexpr in C++20 501 is_sorted(ForwardIterator first, ForwardIterator last, Compare comp); 502 503template<class ForwardIterator> 504 constexpr ForwardIterator // constexpr in C++20 505 is_sorted_until(ForwardIterator first, ForwardIterator last); 506 507template <class ForwardIterator, class Compare> 508 constexpr ForwardIterator // constexpr in C++20 509 is_sorted_until(ForwardIterator first, ForwardIterator last, Compare comp); 510 511template <class RandomAccessIterator> 512 constexpr void // constexpr in C++20 513 sort(RandomAccessIterator first, RandomAccessIterator last); 514 515template <class RandomAccessIterator, class Compare> 516 constexpr void // constexpr in C++20 517 sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp); 518 519template <class RandomAccessIterator> 520 void 521 stable_sort(RandomAccessIterator first, RandomAccessIterator last); 522 523template <class RandomAccessIterator, class Compare> 524 void 525 stable_sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp); 526 527template <class RandomAccessIterator> 528 constexpr void // constexpr in C++20 529 partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last); 530 531template <class RandomAccessIterator, class Compare> 532 constexpr void // constexpr in C++20 533 partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, Compare comp); 534 535template <class InputIterator, class RandomAccessIterator> 536 constexpr RandomAccessIterator // constexpr in C++20 537 partial_sort_copy(InputIterator first, InputIterator last, 538 RandomAccessIterator result_first, RandomAccessIterator result_last); 539 540template <class InputIterator, class RandomAccessIterator, class Compare> 541 constexpr RandomAccessIterator // constexpr in C++20 542 partial_sort_copy(InputIterator first, InputIterator last, 543 RandomAccessIterator result_first, RandomAccessIterator result_last, Compare comp); 544 545template <class RandomAccessIterator> 546 constexpr void // constexpr in C++20 547 nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last); 548 549template <class RandomAccessIterator, class Compare> 550 constexpr void // constexpr in C++20 551 nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last, Compare comp); 552 553template <class ForwardIterator, class T> 554 constexpr ForwardIterator // constexpr in C++20 555 lower_bound(ForwardIterator first, ForwardIterator last, const T& value); 556 557template <class ForwardIterator, class T, class Compare> 558 constexpr ForwardIterator // constexpr in C++20 559 lower_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp); 560 561template <class ForwardIterator, class T> 562 constexpr ForwardIterator // constexpr in C++20 563 upper_bound(ForwardIterator first, ForwardIterator last, const T& value); 564 565template <class ForwardIterator, class T, class Compare> 566 constexpr ForwardIterator // constexpr in C++20 567 upper_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp); 568 569template <class ForwardIterator, class T> 570 constexpr pair<ForwardIterator, ForwardIterator> // constexpr in C++20 571 equal_range(ForwardIterator first, ForwardIterator last, const T& value); 572 573template <class ForwardIterator, class T, class Compare> 574 constexpr pair<ForwardIterator, ForwardIterator> // constexpr in C++20 575 equal_range(ForwardIterator first, ForwardIterator last, const T& value, Compare comp); 576 577template <class ForwardIterator, class T> 578 constexpr bool // constexpr in C++20 579 binary_search(ForwardIterator first, ForwardIterator last, const T& value); 580 581template <class ForwardIterator, class T, class Compare> 582 constexpr bool // constexpr in C++20 583 binary_search(ForwardIterator first, ForwardIterator last, const T& value, Compare comp); 584 585template <class InputIterator1, class InputIterator2, class OutputIterator> 586 constexpr OutputIterator // constexpr in C++20 587 merge(InputIterator1 first1, InputIterator1 last1, 588 InputIterator2 first2, InputIterator2 last2, OutputIterator result); 589 590template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare> 591 constexpr OutputIterator // constexpr in C++20 592 merge(InputIterator1 first1, InputIterator1 last1, 593 InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp); 594 595template <class BidirectionalIterator> 596 void 597 inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last); 598 599template <class BidirectionalIterator, class Compare> 600 void 601 inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last, Compare comp); 602 603template <class InputIterator1, class InputIterator2> 604 constexpr bool // constexpr in C++20 605 includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2); 606 607template <class InputIterator1, class InputIterator2, class Compare> 608 constexpr bool // constexpr in C++20 609 includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, Compare comp); 610 611template <class InputIterator1, class InputIterator2, class OutputIterator> 612 constexpr OutputIterator // constexpr in C++20 613 set_union(InputIterator1 first1, InputIterator1 last1, 614 InputIterator2 first2, InputIterator2 last2, OutputIterator result); 615 616template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare> 617 constexpr OutputIterator // constexpr in C++20 618 set_union(InputIterator1 first1, InputIterator1 last1, 619 InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp); 620 621template <class InputIterator1, class InputIterator2, class OutputIterator> 622 constexpr OutputIterator // constexpr in C++20 623 set_intersection(InputIterator1 first1, InputIterator1 last1, 624 InputIterator2 first2, InputIterator2 last2, OutputIterator result); 625 626template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare> 627 constexpr OutputIterator // constexpr in C++20 628 set_intersection(InputIterator1 first1, InputIterator1 last1, 629 InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp); 630 631template <class InputIterator1, class InputIterator2, class OutputIterator> 632 constexpr OutputIterator // constexpr in C++20 633 set_difference(InputIterator1 first1, InputIterator1 last1, 634 InputIterator2 first2, InputIterator2 last2, OutputIterator result); 635 636template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare> 637 constexpr OutputIterator // constexpr in C++20 638 set_difference(InputIterator1 first1, InputIterator1 last1, 639 InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp); 640 641template <class InputIterator1, class InputIterator2, class OutputIterator> 642 constexpr OutputIterator // constexpr in C++20 643 set_symmetric_difference(InputIterator1 first1, InputIterator1 last1, 644 InputIterator2 first2, InputIterator2 last2, OutputIterator result); 645 646template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare> 647 constexpr OutputIterator // constexpr in C++20 648 set_symmetric_difference(InputIterator1 first1, InputIterator1 last1, 649 InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp); 650 651template <class RandomAccessIterator> 652 constexpr void // constexpr in C++20 653 push_heap(RandomAccessIterator first, RandomAccessIterator last); 654 655template <class RandomAccessIterator, class Compare> 656 constexpr void // constexpr in C++20 657 push_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp); 658 659template <class RandomAccessIterator> 660 constexpr void // constexpr in C++20 661 pop_heap(RandomAccessIterator first, RandomAccessIterator last); 662 663template <class RandomAccessIterator, class Compare> 664 constexpr void // constexpr in C++20 665 pop_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp); 666 667template <class RandomAccessIterator> 668 constexpr void // constexpr in C++20 669 make_heap(RandomAccessIterator first, RandomAccessIterator last); 670 671template <class RandomAccessIterator, class Compare> 672 constexpr void // constexpr in C++20 673 make_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp); 674 675template <class RandomAccessIterator> 676 constexpr void // constexpr in C++20 677 sort_heap(RandomAccessIterator first, RandomAccessIterator last); 678 679template <class RandomAccessIterator, class Compare> 680 constexpr void // constexpr in C++20 681 sort_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp); 682 683template <class RandomAccessIterator> 684 constexpr bool // constexpr in C++20 685 is_heap(RandomAccessIterator first, RandomAccessiterator last); 686 687template <class RandomAccessIterator, class Compare> 688 constexpr bool // constexpr in C++20 689 is_heap(RandomAccessIterator first, RandomAccessiterator last, Compare comp); 690 691template <class RandomAccessIterator> 692 constexpr RandomAccessIterator // constexpr in C++20 693 is_heap_until(RandomAccessIterator first, RandomAccessiterator last); 694 695template <class RandomAccessIterator, class Compare> 696 constexpr RandomAccessIterator // constexpr in C++20 697 is_heap_until(RandomAccessIterator first, RandomAccessiterator last, Compare comp); 698 699template <class ForwardIterator> 700 constexpr ForwardIterator // constexpr in C++14 701 min_element(ForwardIterator first, ForwardIterator last); 702 703template <class ForwardIterator, class Compare> 704 constexpr ForwardIterator // constexpr in C++14 705 min_element(ForwardIterator first, ForwardIterator last, Compare comp); 706 707template <class T> 708 constexpr const T& // constexpr in C++14 709 min(const T& a, const T& b); 710 711template <class T, class Compare> 712 constexpr const T& // constexpr in C++14 713 min(const T& a, const T& b, Compare comp); 714 715template<class T> 716 constexpr T // constexpr in C++14 717 min(initializer_list<T> t); 718 719template<class T, class Compare> 720 constexpr T // constexpr in C++14 721 min(initializer_list<T> t, Compare comp); 722 723template<class T> 724 constexpr const T& clamp(const T& v, const T& lo, const T& hi); // C++17 725 726template<class T, class Compare> 727 constexpr const T& clamp(const T& v, const T& lo, const T& hi, Compare comp); // C++17 728 729template <class ForwardIterator> 730 constexpr ForwardIterator // constexpr in C++14 731 max_element(ForwardIterator first, ForwardIterator last); 732 733template <class ForwardIterator, class Compare> 734 constexpr ForwardIterator // constexpr in C++14 735 max_element(ForwardIterator first, ForwardIterator last, Compare comp); 736 737template <class T> 738 constexpr const T& // constexpr in C++14 739 max(const T& a, const T& b); 740 741template <class T, class Compare> 742 constexpr const T& // constexpr in C++14 743 max(const T& a, const T& b, Compare comp); 744 745template<class T> 746 constexpr T // constexpr in C++14 747 max(initializer_list<T> t); 748 749template<class T, class Compare> 750 constexpr T // constexpr in C++14 751 max(initializer_list<T> t, Compare comp); 752 753template<class ForwardIterator> 754 constexpr pair<ForwardIterator, ForwardIterator> // constexpr in C++14 755 minmax_element(ForwardIterator first, ForwardIterator last); 756 757template<class ForwardIterator, class Compare> 758 constexpr pair<ForwardIterator, ForwardIterator> // constexpr in C++14 759 minmax_element(ForwardIterator first, ForwardIterator last, Compare comp); 760 761template<class T> 762 constexpr pair<const T&, const T&> // constexpr in C++14 763 minmax(const T& a, const T& b); 764 765template<class T, class Compare> 766 constexpr pair<const T&, const T&> // constexpr in C++14 767 minmax(const T& a, const T& b, Compare comp); 768 769template<class T> 770 constexpr pair<T, T> // constexpr in C++14 771 minmax(initializer_list<T> t); 772 773template<class T, class Compare> 774 constexpr pair<T, T> // constexpr in C++14 775 minmax(initializer_list<T> t, Compare comp); 776 777template <class InputIterator1, class InputIterator2> 778 constexpr bool // constexpr in C++20 779 lexicographical_compare(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2); 780 781template <class InputIterator1, class InputIterator2, class Compare> 782 constexpr bool // constexpr in C++20 783 lexicographical_compare(InputIterator1 first1, InputIterator1 last1, 784 InputIterator2 first2, InputIterator2 last2, Compare comp); 785 786template <class BidirectionalIterator> 787 constexpr bool // constexpr in C++20 788 next_permutation(BidirectionalIterator first, BidirectionalIterator last); 789 790template <class BidirectionalIterator, class Compare> 791 constexpr bool // constexpr in C++20 792 next_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp); 793 794template <class BidirectionalIterator> 795 constexpr bool // constexpr in C++20 796 prev_permutation(BidirectionalIterator first, BidirectionalIterator last); 797 798template <class BidirectionalIterator, class Compare> 799 constexpr bool // constexpr in C++20 800 prev_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp); 801} // std 802 803*/ 804 805#include <__assert> // all public C++ headers provide the assertion handler 806#include <__bits> 807#include <__config> 808#include <__debug> 809#include <cstddef> 810#include <cstring> 811#include <functional> 812#include <initializer_list> 813#include <iterator> 814#include <memory> 815#include <type_traits> 816#include <version> 817 818#include <__algorithm/adjacent_find.h> 819#include <__algorithm/all_of.h> 820#include <__algorithm/any_of.h> 821#include <__algorithm/binary_search.h> 822#include <__algorithm/clamp.h> 823#include <__algorithm/comp.h> 824#include <__algorithm/comp_ref_type.h> 825#include <__algorithm/copy.h> 826#include <__algorithm/copy_backward.h> 827#include <__algorithm/copy_if.h> 828#include <__algorithm/copy_n.h> 829#include <__algorithm/count.h> 830#include <__algorithm/count_if.h> 831#include <__algorithm/equal.h> 832#include <__algorithm/equal_range.h> 833#include <__algorithm/fill.h> 834#include <__algorithm/fill_n.h> 835#include <__algorithm/find.h> 836#include <__algorithm/find_end.h> 837#include <__algorithm/find_first_of.h> 838#include <__algorithm/find_if.h> 839#include <__algorithm/find_if_not.h> 840#include <__algorithm/for_each.h> 841#include <__algorithm/for_each_n.h> 842#include <__algorithm/generate.h> 843#include <__algorithm/generate_n.h> 844#include <__algorithm/half_positive.h> 845#include <__algorithm/in_found_result.h> 846#include <__algorithm/in_fun_result.h> 847#include <__algorithm/in_in_out_result.h> 848#include <__algorithm/in_in_result.h> 849#include <__algorithm/in_out_out_result.h> 850#include <__algorithm/in_out_result.h> 851#include <__algorithm/includes.h> 852#include <__algorithm/inplace_merge.h> 853#include <__algorithm/is_heap.h> 854#include <__algorithm/is_heap_until.h> 855#include <__algorithm/is_partitioned.h> 856#include <__algorithm/is_permutation.h> 857#include <__algorithm/is_sorted.h> 858#include <__algorithm/is_sorted_until.h> 859#include <__algorithm/iter_swap.h> 860#include <__algorithm/lexicographical_compare.h> 861#include <__algorithm/lower_bound.h> 862#include <__algorithm/make_heap.h> 863#include <__algorithm/max.h> 864#include <__algorithm/max_element.h> 865#include <__algorithm/merge.h> 866#include <__algorithm/min.h> 867#include <__algorithm/min_element.h> 868#include <__algorithm/min_max_result.h> 869#include <__algorithm/minmax.h> 870#include <__algorithm/minmax_element.h> 871#include <__algorithm/mismatch.h> 872#include <__algorithm/move.h> 873#include <__algorithm/move_backward.h> 874#include <__algorithm/next_permutation.h> 875#include <__algorithm/none_of.h> 876#include <__algorithm/nth_element.h> 877#include <__algorithm/partial_sort.h> 878#include <__algorithm/partial_sort_copy.h> 879#include <__algorithm/partition.h> 880#include <__algorithm/partition_copy.h> 881#include <__algorithm/partition_point.h> 882#include <__algorithm/pop_heap.h> 883#include <__algorithm/prev_permutation.h> 884#include <__algorithm/push_heap.h> 885#include <__algorithm/ranges_count.h> 886#include <__algorithm/ranges_count_if.h> 887#include <__algorithm/ranges_find.h> 888#include <__algorithm/ranges_find_if.h> 889#include <__algorithm/ranges_find_if_not.h> 890#include <__algorithm/ranges_max.h> 891#include <__algorithm/ranges_max_element.h> 892#include <__algorithm/ranges_min.h> 893#include <__algorithm/ranges_min_element.h> 894#include <__algorithm/ranges_mismatch.h> 895#include <__algorithm/ranges_swap_ranges.h> 896#include <__algorithm/ranges_transform.h> 897#include <__algorithm/remove.h> 898#include <__algorithm/remove_copy.h> 899#include <__algorithm/remove_copy_if.h> 900#include <__algorithm/remove_if.h> 901#include <__algorithm/replace.h> 902#include <__algorithm/replace_copy.h> 903#include <__algorithm/replace_copy_if.h> 904#include <__algorithm/replace_if.h> 905#include <__algorithm/reverse.h> 906#include <__algorithm/reverse_copy.h> 907#include <__algorithm/rotate.h> 908#include <__algorithm/rotate_copy.h> 909#include <__algorithm/sample.h> 910#include <__algorithm/search.h> 911#include <__algorithm/search_n.h> 912#include <__algorithm/set_difference.h> 913#include <__algorithm/set_intersection.h> 914#include <__algorithm/set_symmetric_difference.h> 915#include <__algorithm/set_union.h> 916#include <__algorithm/shift_left.h> 917#include <__algorithm/shift_right.h> 918#include <__algorithm/shuffle.h> 919#include <__algorithm/sift_down.h> 920#include <__algorithm/sort.h> 921#include <__algorithm/sort_heap.h> 922#include <__algorithm/stable_partition.h> 923#include <__algorithm/stable_sort.h> 924#include <__algorithm/swap_ranges.h> 925#include <__algorithm/transform.h> 926#include <__algorithm/unique.h> 927#include <__algorithm/unique_copy.h> 928#include <__algorithm/unwrap_iter.h> 929#include <__algorithm/upper_bound.h> 930 931#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 932# pragma GCC system_header 933#endif 934 935#if defined(_LIBCPP_HAS_PARALLEL_ALGORITHMS) && _LIBCPP_STD_VER >= 17 936# include <__pstl_algorithm> 937#endif 938 939#endif // _LIBCPP_ALGORITHM 940