64#if __cplusplus >= 201103L
70# if (__cplusplus <= 201103L || _GLIBCXX_USE_DEPRECATED)
75#pragma GCC diagnostic push
76#pragma GCC diagnostic ignored "-Wc++11-extensions"
80namespace std _GLIBCXX_VISIBILITY(default)
82_GLIBCXX_BEGIN_NAMESPACE_VERSION
85 template<
typename _Iterator,
typename _Compare>
89 _Iterator __c, _Compare __comp)
91 if (__comp(*__a, *__b))
93 if (__comp(*__b, *__c))
94 std::iter_swap(__result, __b);
95 else if (__comp(*__a, *__c))
96 std::iter_swap(__result, __c);
98 std::iter_swap(__result, __a);
100 else if (__comp(*__a, *__c))
101 std::iter_swap(__result, __a);
102 else if (__comp(*__b, *__c))
103 std::iter_swap(__result, __c);
105 std::iter_swap(__result, __b);
109 template<
typename _InputIterator,
typename _Predicate>
111 inline _InputIterator
115 return std::__find_if(__first, __last,
116 __gnu_cxx::__ops::not1(__pred));
122 template<
typename _InputIterator,
typename _Predicate,
typename _Distance>
127 for (; __len; --__len, (void) ++__first)
128 if (!__pred(*__first))
150 template<
typename _ForwardIterator,
typename _Integer,
151 typename _UnaryPredicate>
155 _Integer __count, _UnaryPredicate __unary_pred,
158 __first = std::__find_if(__first, __last, __unary_pred);
159 while (__first != __last)
163 _ForwardIterator __i = __first;
165 while (__i != __last && __n != 1 && __unary_pred(*__i))
174 __first = std::__find_if(++__i, __last, __unary_pred);
183 template<
typename _RandomAccessIter,
typename _Integer,
184 typename _UnaryPredicate>
188 _Integer __count, _UnaryPredicate __unary_pred,
194 _DistanceType __tailSize = __last - __first;
195 _DistanceType __remainder = __count;
197 while (__remainder <= __tailSize)
199 __first += __remainder;
200 __tailSize -= __remainder;
203 _RandomAccessIter __backTrack = __first;
204 while (__unary_pred(*--__backTrack))
206 if (--__remainder == 0)
207 return __first - _DistanceType(__count);
209 __remainder = __count + 1 - (__first - __backTrack);
214 template<
typename _ForwardIterator,
typename _Integer,
215 typename _UnaryPredicate>
218 __search_n(_ForwardIterator __first, _ForwardIterator __last,
220 _UnaryPredicate __unary_pred)
226 return std::__find_if(__first, __last, __unary_pred);
229 std::__iter_concept_or_category(__first));
233 template<
typename _ForwardIterator1,
typename _ForwardIterator2,
234 typename _BinaryPredicate>
237 __find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
238 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
240 _BinaryPredicate __comp)
242 if (__first2 == __last2)
245 _ForwardIterator1 __result = __last1;
248 _ForwardIterator1 __new_result
249 = std::__search(__first1, __last1, __first2, __last2, __comp);
250 if (__new_result == __last1)
254 __result = __new_result;
255 __first1 = __new_result;
262 template<
typename _BidirectionalIterator1,
typename _BidirectionalIterator2,
263 typename _BinaryPredicate>
265 _BidirectionalIterator1
266 __find_end(_BidirectionalIterator1 __first1,
267 _BidirectionalIterator1 __last1,
268 _BidirectionalIterator2 __first2,
269 _BidirectionalIterator2 __last2,
271 _BinaryPredicate __comp)
274 __glibcxx_function_requires(_BidirectionalIteratorConcept<
275 _BidirectionalIterator1>)
276 __glibcxx_function_requires(_BidirectionalIteratorConcept<
277 _BidirectionalIterator2>)
282 _RevIterator1 __rlast1(__first1);
283 _RevIterator2 __rlast2(__first2);
284 _RevIterator1 __rresult = std::__search(_RevIterator1(__last1), __rlast1,
285 _RevIterator2(__last2), __rlast2,
288 if (__rresult == __rlast1)
292 _BidirectionalIterator1 __result = __rresult.
base();
324 template<
typename _ForwardIterator1,
typename _ForwardIterator2>
325 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
326 inline _ForwardIterator1
327 find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
328 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
331 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
332 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
333 __glibcxx_function_requires(_EqualOpConcept<
336 __glibcxx_requires_valid_range(__first1, __last1);
337 __glibcxx_requires_valid_range(__first2, __last2);
339 return std::__find_end(__first1, __last1, __first2, __last2,
340 std::__iter_concept_or_category(__first1),
341 std::__iter_concept_or_category(__first2),
342 __gnu_cxx::__ops::equal_to());
373 template<
typename _ForwardIterator1,
typename _ForwardIterator2,
374 typename _BinaryPredicate>
375 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
376 inline _ForwardIterator1
377 find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
378 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
379 _BinaryPredicate __comp)
382 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
383 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
384 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
387 __glibcxx_requires_valid_range(__first1, __last1);
388 __glibcxx_requires_valid_range(__first2, __last2);
390 return std::__find_end(__first1, __last1, __first2, __last2,
391 std::__iter_concept_or_category(__first1),
392 std::__iter_concept_or_category(__first2),
396#if __cplusplus >= 201103L
409 template<
typename _InputIterator,
typename _Predicate>
410 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
412 all_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
413 {
return __last == std::find_if_not(__first, __last, __pred); }
427 template<
typename _InputIterator,
typename _Predicate>
428 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
430 none_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
431 {
return __last == _GLIBCXX_STD_A::find_if(__first, __last, __pred); }
446 template<
typename _InputIterator,
typename _Predicate>
447 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
449 any_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
450 {
return !std::none_of(__first, __last, __pred); }
462 template<
typename _InputIterator,
typename _Predicate>
463 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
464 inline _InputIterator
465 find_if_not(_InputIterator __first, _InputIterator __last,
469 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
470 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
472 __glibcxx_requires_valid_range(__first, __last);
486 template<
typename _InputIterator,
typename _Predicate>
487 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
489 is_partitioned(_InputIterator __first, _InputIterator __last,
492 __first = std::find_if_not(__first, __last, __pred);
493 if (__first == __last)
496 return std::none_of(__first, __last, __pred);
508 template<
typename _ForwardIterator,
typename _Predicate>
509 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
511 partition_point(_ForwardIterator __first, _ForwardIterator __last,
515 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
516 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
520 __glibcxx_requires_valid_range(__first, __last);
529 _DistanceType __half = __len >> 1;
530 _ForwardIterator __middle = __first;
532 if (__pred(*__middle))
536 __len = __len - __half - 1;
545 template<
typename _InputIterator,
typename _OutputIterator,
549 __remove_copy_if(_InputIterator __first, _InputIterator __last,
550 _OutputIterator __result, _Predicate __pred)
552 for (; __first != __last; ++__first)
553 if (!__pred(*__first))
555 *__result = *__first;
575 template<
typename _InputIterator,
typename _OutputIterator,
typename _Tp>
577 inline _OutputIterator
578 remove_copy(_InputIterator __first, _InputIterator __last,
579 _OutputIterator __result,
const _Tp& __value)
582 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
583 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
585 __glibcxx_function_requires(_EqualOpConcept<
587 __glibcxx_requires_valid_range(__first, __last);
589 return std::__remove_copy_if(__first, __last, __result,
590 __gnu_cxx::__ops::__equal_to(__value));
608 template<
typename _InputIterator,
typename _OutputIterator,
611 inline _OutputIterator
612 remove_copy_if(_InputIterator __first, _InputIterator __last,
613 _OutputIterator __result, _Predicate __pred)
616 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
617 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
619 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
621 __glibcxx_requires_valid_range(__first, __last);
623 return std::__remove_copy_if(__first, __last, __result, __pred);
626#if __cplusplus >= 201103L
642 template<
typename _InputIterator,
typename _OutputIterator,
646 copy_if(_InputIterator __first, _InputIterator __last,
647 _OutputIterator __result, _Predicate __pred)
650 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
651 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
653 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
655 __glibcxx_requires_valid_range(__first, __last);
657 for (; __first != __last; ++__first)
658 if (__pred(*__first))
660 *__result = *__first;
679 template<
typename _InputIterator,
typename _Size,
typename _OutputIterator>
681 inline _OutputIterator
682 copy_n(_InputIterator __first, _Size __n, _OutputIterator __result)
685 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
686 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
689 const auto __n2 = std::__size_to_integer(__n);
693 __glibcxx_requires_can_increment(__first, __n2);
694 __glibcxx_requires_can_increment(__result, __n2);
696 auto __res = std::__copy_n_a(std::__niter_base(__first), __n2,
697 std::__niter_base(__result),
true);
698 return std::__niter_wrap(__result,
std::move(__res));
716 template<
typename _InputIterator,
typename _OutputIterator1,
717 typename _OutputIterator2,
typename _Predicate>
720 partition_copy(_InputIterator __first, _InputIterator __last,
721 _OutputIterator1 __out_true, _OutputIterator2 __out_false,
725 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
726 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator1,
728 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator2,
730 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
732 __glibcxx_requires_valid_range(__first, __last);
734 for (; __first != __last; ++__first)
735 if (__pred(*__first))
737 *__out_true = *__first;
742 *__out_false = *__first;
767 template<
typename _ForwardIterator,
typename _Tp>
768 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
769 inline _ForwardIterator
770 remove(_ForwardIterator __first, _ForwardIterator __last,
774 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
776 __glibcxx_function_requires(_EqualOpConcept<
778 __glibcxx_requires_valid_range(__first, __last);
780 return std::__remove_if(__first, __last,
781 __gnu_cxx::__ops::__equal_to(__value));
801 template<
typename _ForwardIterator,
typename _Predicate>
802 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
803 inline _ForwardIterator
804 remove_if(_ForwardIterator __first, _ForwardIterator __last,
808 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
810 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
812 __glibcxx_requires_valid_range(__first, __last);
814 return std::__remove_if(__first, __last, __pred);
817 template<
typename _ForwardIterator,
typename _BinaryPredicate>
820 __adjacent_find(_ForwardIterator __first, _ForwardIterator __last,
821 _BinaryPredicate __binary_pred)
823 if (__first == __last)
825 _ForwardIterator __next = __first;
826 while (++__next != __last)
828 if (__binary_pred(*__first, *__next))
835 template<
typename _ForwardIterator,
typename _BinaryPredicate>
838 __unique(_ForwardIterator __first, _ForwardIterator __last,
839 _BinaryPredicate __binary_pred)
842 __first = std::__adjacent_find(__first, __last, __binary_pred);
843 if (__first == __last)
847 _ForwardIterator __dest = __first;
849 while (++__first != __last)
850 if (!__binary_pred(*__dest, *__first))
851 *++__dest = _GLIBCXX_MOVE(*__first);
869 template<
typename _ForwardIterator>
870 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
871 inline _ForwardIterator
872 unique(_ForwardIterator __first, _ForwardIterator __last)
875 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
877 __glibcxx_function_requires(_EqualityComparableConcept<
879 __glibcxx_requires_valid_range(__first, __last);
881 return std::__unique(__first, __last, __gnu_cxx::__ops::equal_to());
899 template<
typename _ForwardIterator,
typename _BinaryPredicate>
900 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
901 inline _ForwardIterator
902 unique(_ForwardIterator __first, _ForwardIterator __last,
903 _BinaryPredicate __binary_pred)
906 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
908 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
911 __glibcxx_requires_valid_range(__first, __last);
913 return std::__unique(__first, __last, __binary_pred);
921 template<
typename _ForwardIterator,
typename _OutputIterator,
922 typename _BinaryPredicate>
925 __unique_copy(_ForwardIterator __first, _ForwardIterator __last,
926 _OutputIterator __result, _BinaryPredicate __binary_pred,
927 forward_iterator_tag)
929 _ForwardIterator __prev = __first;
930 *__result = *__first;
931 while (++__first != __last)
932 if (!__binary_pred(*__prev, *__first))
934 *++__result = *__first;
942 template<
typename _InputIterator,
typename _OutputIterator,
943 typename _BinaryPredicate>
946 __unique_copy_1(_InputIterator __first, _InputIterator __last,
947 _OutputIterator __result, _BinaryPredicate __binary_pred,
951 _Val __value = *__first;
953 while (++__first != __last)
954 if (!__binary_pred(__value, *__first))
957 *++__result = __value;
964 template<
typename _InputIterator,
typename _ForwardIterator,
965 typename _BinaryPredicate>
967 __unique_copy_1(_InputIterator __first, _InputIterator __last,
968 _ForwardIterator __result, _BinaryPredicate __binary_pred,
971 *__result = *__first;
972 while (++__first != __last)
973 if (!__binary_pred(*__result, *__first))
974 *++__result = *__first;
981 template<
typename _InputIterator,
typename _OutputIterator,
982 typename _BinaryPredicate>
985 __unique_copy(_InputIterator __first, _InputIterator __last,
986 _OutputIterator __result, _BinaryPredicate __binary_pred,
993 typedef typename _OutItTraits::iterator_category _Cat;
995 const bool __same_type = __is_same(
typename _OutItTraits::value_type,
996 typename _InItTraits::value_type);
997 typedef __truth_type<__output_is_fwd && __same_type> __cmp_with_output;
998 return std::__unique_copy_1(__first, __last, __result, __binary_pred,
999 typename __cmp_with_output::__type());
1008 template<
typename _B
idirectionalIterator>
1009 _GLIBCXX20_CONSTEXPR
1011 __reverse(_BidirectionalIterator __first, _BidirectionalIterator __last,
1015 if (__first == __last || __first == --__last)
1019 std::iter_swap(__first, __last);
1029 template<
typename _RandomAccessIterator>
1030 _GLIBCXX20_CONSTEXPR
1032 __reverse(_RandomAccessIterator __first, _RandomAccessIterator __last,
1035 if (__first == __last)
1038 while (__first < __last)
1040 std::iter_swap(__first, __last);
1058 template<
typename _B
idirectionalIterator>
1059 _GLIBCXX20_CONSTEXPR
1061 reverse(_BidirectionalIterator __first, _BidirectionalIterator __last)
1064 __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
1065 _BidirectionalIterator>)
1066 __glibcxx_requires_valid_range(__first, __last);
1086 template<
typename _B
idirectionalIterator,
typename _OutputIterator>
1087 _GLIBCXX20_CONSTEXPR
1089 reverse_copy(_BidirectionalIterator __first, _BidirectionalIterator __last,
1090 _OutputIterator __result)
1093 __glibcxx_function_requires(_BidirectionalIteratorConcept<
1094 _BidirectionalIterator>)
1095 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
1097 __glibcxx_requires_valid_range(__first, __last);
1099 while (__first != __last)
1102 *__result = *__last;
1112 template<
typename _Eucl
ideanRingElement>
1113 _GLIBCXX20_CONSTEXPR
1114 _EuclideanRingElement
1115 __gcd(_EuclideanRingElement __m, _EuclideanRingElement __n)
1119 _EuclideanRingElement __t = __m % __n;
1126_GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE(_V2)
1129 template<
typename _ForwardIterator>
1130 _GLIBCXX20_CONSTEXPR
1133 _ForwardIterator __middle,
1134 _ForwardIterator __last,
1137 if (__first == __middle)
1139 else if (__last == __middle)
1142 _ForwardIterator __first2 = __middle;
1145 std::iter_swap(__first, __first2);
1148 if (__first == __middle)
1149 __middle = __first2;
1151 while (__first2 != __last);
1153 _ForwardIterator __ret = __first;
1155 __first2 = __middle;
1157 while (__first2 != __last)
1159 std::iter_swap(__first, __first2);
1162 if (__first == __middle)
1163 __middle = __first2;
1164 else if (__first2 == __last)
1165 __first2 = __middle;
1171 template<
typename _B
idirectionalIterator>
1172 _GLIBCXX20_CONSTEXPR
1173 _BidirectionalIterator
1175 _BidirectionalIterator __middle,
1176 _BidirectionalIterator __last,
1180 __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
1181 _BidirectionalIterator>)
1183 if (__first == __middle)
1185 else if (__last == __middle)
1191 while (__first != __middle && __middle != __last)
1193 std::iter_swap(__first, --__last);
1197 if (__first == __middle)
1210 template<
typename _RandomAccessIterator>
1211 _GLIBCXX20_CONSTEXPR
1212 _RandomAccessIterator
1214 _RandomAccessIterator __middle,
1215 _RandomAccessIterator __last,
1219 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
1220 _RandomAccessIterator>)
1222 if (__first == __middle)
1224 else if (__last == __middle)
1232#if __cplusplus >= 201103L
1233 typedef typename make_unsigned<_Distance>::type _UDistance;
1235 typedef _Distance _UDistance;
1238 _Distance __n = __last - __first;
1239 _Distance __k = __middle - __first;
1241 if (__k == __n - __k)
1243 std::swap_ranges(__first, __middle, __middle);
1247 _RandomAccessIterator __p = __first;
1248 _RandomAccessIterator __ret = __first + (__last - __middle);
1252 if (__k < __n - __k)
1254 if (__is_pod(_ValueType) && __k == 1)
1256 _RandomAccessIterator __mid = __p + _Distance(__n - 1);
1257 _RandomAccessIterator __end = __mid;
1259 _ValueType __t = _GLIBCXX_MOVE(*__p);
1260 _GLIBCXX_MOVE3(__p + _Distance(1), __end, __p);
1261 *__mid = _GLIBCXX_MOVE(__t);
1264 _RandomAccessIterator __q = __p + __k;
1265 for (_Distance __i = 0; __i < __n - __k; ++ __i)
1267 std::iter_swap(__p, __q);
1271 __n =
static_cast<_UDistance
>(__n) %
static_cast<_UDistance
>(__k);
1274 std::swap(__n, __k);
1280 if (__is_pod(_ValueType) && __k == 1)
1282 _RandomAccessIterator __mid = __p + _Distance(__n - 1);
1283 _RandomAccessIterator __end = __mid;
1285 _ValueType __t = _GLIBCXX_MOVE(*__mid);
1286 _GLIBCXX_MOVE_BACKWARD3(__p, __mid, __end);
1287 *__p = _GLIBCXX_MOVE(__t);
1290 _RandomAccessIterator __q = __p + __n;
1292 for (_Distance __i = 0; __i < __n - __k; ++ __i)
1296 std::iter_swap(__p, __q);
1298 __n =
static_cast<_UDistance
>(__n) %
static_cast<_UDistance
>(__k);
1301 std::swap(__n, __k);
1329 template<
typename _ForwardIterator>
1330 _GLIBCXX20_CONSTEXPR
1331 inline _ForwardIterator
1332 rotate(_ForwardIterator __first, _ForwardIterator __middle,
1333 _ForwardIterator __last)
1336 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
1338 __glibcxx_requires_valid_range(__first, __middle);
1339 __glibcxx_requires_valid_range(__middle, __last);
1345_GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)
1367 template<
typename _ForwardIterator,
typename _OutputIterator>
1368 _GLIBCXX20_CONSTEXPR
1369 inline _OutputIterator
1370 rotate_copy(_ForwardIterator __first, _ForwardIterator __middle,
1371 _ForwardIterator __last, _OutputIterator __result)
1374 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
1375 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
1377 __glibcxx_requires_valid_range(__first, __middle);
1378 __glibcxx_requires_valid_range(__middle, __last);
1380 return std::copy(__first, __middle,
1381 std::copy(__middle, __last, __result));
1385 template<
typename _ForwardIterator,
typename _Predicate>
1386 _GLIBCXX20_CONSTEXPR
1391 if (__first == __last)
1394 while (__pred(*__first))
1395 if (++__first == __last)
1398 _ForwardIterator __next = __first;
1400 while (++__next != __last)
1401 if (__pred(*__next))
1403 std::iter_swap(__first, __next);
1411 template<
typename _B
idirectionalIterator,
typename _Predicate>
1412 _GLIBCXX20_CONSTEXPR
1413 _BidirectionalIterator
1414 __partition(_BidirectionalIterator __first, _BidirectionalIterator __last,
1420 if (__first == __last)
1422 else if (__pred(*__first))
1428 if (__first == __last)
1430 else if (!
bool(__pred(*__last)))
1434 std::iter_swap(__first, __last);
1448 template<
typename _ForwardIterator,
typename _Pointer,
typename _Predicate,
1450 _GLIBCXX26_CONSTEXPR
1453 _ForwardIterator __last,
1454 _Predicate __pred, _Distance __len,
1456 _Distance __buffer_size)
1461 if (__len <= __buffer_size)
1463 _ForwardIterator __result1 = __first;
1464 _Pointer __result2 = __buffer;
1469 *__result2 = _GLIBCXX_MOVE(*__first);
1472 for (; __first != __last; ++__first)
1473 if (__pred(*__first))
1475 *__result1 = _GLIBCXX_MOVE(*__first);
1480 *__result2 = _GLIBCXX_MOVE(*__first);
1484 _GLIBCXX_MOVE3(__buffer, __result2, __result1);
1488 _ForwardIterator __middle = __first;
1490 _ForwardIterator __left_split =
1492 __len / 2, __buffer,
1497 _Distance __right_len = __len - __len / 2;
1498 _ForwardIterator __right_split =
1505 __buffer, __buffer_size);
1507 return std::rotate(__left_split, __middle, __right_split);
1510 template<
typename _ForwardIterator,
typename _Predicate>
1511 _GLIBCXX26_CONSTEXPR
1513 __stable_partition(_ForwardIterator __first, _ForwardIterator __last,
1518 if (__first == __last)
1521 typedef typename iterator_traits<_ForwardIterator>::value_type
1523 typedef typename iterator_traits<_ForwardIterator>::difference_type
1528#if __glibcxx_constexpr_algorithms >= 202306L
1541 __buf(__first, __len);
1546 _DistanceType(__buf.size()));
1566 template<
typename _ForwardIterator,
typename _Predicate>
1567 _GLIBCXX26_CONSTEXPR
1568 inline _ForwardIterator
1569 stable_partition(_ForwardIterator __first, _ForwardIterator __last,
1573 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
1575 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
1577 __glibcxx_requires_valid_range(__first, __last);
1579 return std::__stable_partition(__first, __last, __pred);
1586 template<
typename _RandomAccessIterator,
typename _Compare>
1587 _GLIBCXX20_CONSTEXPR
1589 __heap_select(_RandomAccessIterator __first,
1590 _RandomAccessIterator __middle,
1591 _RandomAccessIterator __last, _Compare __comp)
1593 std::__make_heap(__first, __middle, __comp);
1594 for (_RandomAccessIterator __i = __middle; __i < __last; ++__i)
1595 if (__comp(*__i, *__first))
1596 std::__pop_heap(__first, __middle, __i, __comp);
1601 template<
typename _InputIterator,
typename _RandomAccessIterator,
1603 _GLIBCXX20_CONSTEXPR
1604 _RandomAccessIterator
1605 __partial_sort_copy(_InputIterator __first, _InputIterator __last,
1606 _RandomAccessIterator __result_first,
1607 _RandomAccessIterator __result_last,
1613 typedef typename _RItTraits::difference_type _DistanceType;
1615 if (__result_first == __result_last)
1616 return __result_last;
1617 _RandomAccessIterator __result_real_last = __result_first;
1618 while (__first != __last && __result_real_last != __result_last)
1620 *__result_real_last = *__first;
1621 ++__result_real_last;
1625 std::__make_heap(__result_first, __result_real_last, __comp);
1626 while (__first != __last)
1628 if (__comp(*__first, *__result_first))
1629 std::__adjust_heap(__result_first, _DistanceType(0),
1630 _DistanceType(__result_real_last
1632 _InputValueType(*__first), __comp);
1635 std::__sort_heap(__result_first, __result_real_last, __comp);
1636 return __result_real_last;
1659 template<
typename _InputIterator,
typename _RandomAccessIterator>
1660 _GLIBCXX20_CONSTEXPR
1661 inline _RandomAccessIterator
1662 partial_sort_copy(_InputIterator __first, _InputIterator __last,
1663 _RandomAccessIterator __result_first,
1664 _RandomAccessIterator __result_last)
1666#ifdef _GLIBCXX_CONCEPT_CHECKS
1674 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
1675 __glibcxx_function_requires(_ConvertibleConcept<_InputValueType,
1677 __glibcxx_function_requires(_LessThanOpConcept<_InputValueType,
1679 __glibcxx_function_requires(_LessThanComparableConcept<_OutputValueType>)
1680 __glibcxx_requires_valid_range(__first, __last);
1681 __glibcxx_requires_irreflexive(__first, __last);
1682 __glibcxx_requires_valid_range(__result_first, __result_last);
1684 return std::__partial_sort_copy(__first, __last,
1685 __result_first, __result_last,
1686 __gnu_cxx::__ops::less());
1709 template<
typename _InputIterator,
typename _RandomAccessIterator,
1711 _GLIBCXX20_CONSTEXPR
1712 inline _RandomAccessIterator
1713 partial_sort_copy(_InputIterator __first, _InputIterator __last,
1714 _RandomAccessIterator __result_first,
1715 _RandomAccessIterator __result_last,
1718#ifdef _GLIBCXX_CONCEPT_CHECKS
1726 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
1727 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
1728 _RandomAccessIterator>)
1729 __glibcxx_function_requires(_ConvertibleConcept<_InputValueType,
1731 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
1732 _InputValueType, _OutputValueType>)
1733 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
1734 _OutputValueType, _OutputValueType>)
1735 __glibcxx_requires_valid_range(__first, __last);
1736 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
1737 __glibcxx_requires_valid_range(__result_first, __result_last);
1739 return std::__partial_sort_copy(__first, __last,
1740 __result_first, __result_last,
1747 template<
typename _RandomAccessIterator,
typename _Compare>
1748 _GLIBCXX20_CONSTEXPR
1750 __unguarded_linear_insert(_RandomAccessIterator __last,
1753 typename iterator_traits<_RandomAccessIterator>::value_type
1754 __val = _GLIBCXX_MOVE(*__last);
1755 _RandomAccessIterator __next = __last;
1757 while (__comp(__val, *__next))
1759 *__last = _GLIBCXX_MOVE(*__next);
1763 *__last = _GLIBCXX_MOVE(__val);
1767 template<
typename _RandomAccessIterator,
typename _Compare>
1768 _GLIBCXX20_CONSTEXPR
1770 __insertion_sort(_RandomAccessIterator __first,
1771 _RandomAccessIterator __last, _Compare __comp)
1773 if (__first == __last)
1777 typedef typename _IterTraits::difference_type _Dist;
1779 for (_RandomAccessIterator __i = __first + _Dist(1); __i != __last; ++__i)
1781 if (__comp(*__i, *__first))
1783 typename _IterTraits::value_type __val = _GLIBCXX_MOVE(*__i);
1784 _GLIBCXX_MOVE_BACKWARD3(__first, __i, __i + _Dist(1));
1785 *__first = _GLIBCXX_MOVE(__val);
1788 std::__unguarded_linear_insert(__i, __comp);
1793 template<
typename _RandomAccessIterator,
typename _Compare>
1794 _GLIBCXX20_CONSTEXPR
1796 __unguarded_insertion_sort(_RandomAccessIterator __first,
1797 _RandomAccessIterator __last, _Compare __comp)
1799 for (_RandomAccessIterator __i = __first; __i != __last; ++__i)
1800 std::__unguarded_linear_insert(__i, __comp);
1807 enum { _S_threshold = 16 };
1810 template<
typename _RandomAccessIterator,
typename _Compare>
1811 _GLIBCXX20_CONSTEXPR
1813 __final_insertion_sort(_RandomAccessIterator __first,
1814 _RandomAccessIterator __last, _Compare __comp)
1817 __threshold = _S_threshold;
1819 if (__last - __first > __threshold)
1821 std::__insertion_sort(__first, __first + __threshold, __comp);
1822 std::__unguarded_insertion_sort(__first + __threshold, __last,
1826 std::__insertion_sort(__first, __last, __comp);
1830 template<
typename _RandomAccessIterator,
typename _Compare>
1831 _GLIBCXX20_CONSTEXPR
1832 _RandomAccessIterator
1833 __unguarded_partition(_RandomAccessIterator __first,
1834 _RandomAccessIterator __last,
1835 _RandomAccessIterator __pivot, _Compare __comp)
1839 while (__comp(*__first, *__pivot))
1842 while (__comp(*__pivot, *__last))
1844 if (!(__first < __last))
1846 std::iter_swap(__first, __last);
1852 template<
typename _RandomAccessIterator,
typename _Compare>
1853 _GLIBCXX20_CONSTEXPR
1854 inline _RandomAccessIterator
1855 __unguarded_partition_pivot(_RandomAccessIterator __first,
1856 _RandomAccessIterator __last, _Compare __comp)
1859 typedef typename _IterTraits::difference_type _Dist;
1861 _RandomAccessIterator __mid = __first + _Dist((__last - __first) / 2);
1862 _RandomAccessIterator __second = __first + _Dist(1);
1865 return std::__unguarded_partition(__second, __last, __first, __comp);
1868 template<
typename _RandomAccessIterator,
typename _Compare>
1869 _GLIBCXX20_CONSTEXPR
1871 __partial_sort(_RandomAccessIterator __first,
1872 _RandomAccessIterator __middle,
1873 _RandomAccessIterator __last,
1876 std::__heap_select(__first, __middle, __last, __comp);
1877 std::__sort_heap(__first, __middle, __comp);
1881 template<
typename _RandomAccessIterator,
typename _Size,
typename _Compare>
1882 _GLIBCXX20_CONSTEXPR
1884 __introsort_loop(_RandomAccessIterator __first,
1885 _RandomAccessIterator __last,
1886 _Size __depth_limit, _Compare __comp)
1888 while (__last - __first >
int(_S_threshold))
1890 if (__depth_limit == 0)
1892 std::__partial_sort(__first, __last, __last, __comp);
1896 _RandomAccessIterator __cut =
1897 std::__unguarded_partition_pivot(__first, __last, __comp);
1898 std::__introsort_loop(__cut, __last, __depth_limit, __comp);
1905 template<
typename _RandomAccessIterator,
typename _Compare>
1906 _GLIBCXX20_CONSTEXPR
1908 __sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
1911 if (__first != __last)
1913 std::__introsort_loop(__first, __last,
1916 std::__final_insertion_sort(__first, __last, __comp);
1920 template<
typename _RandomAccessIterator,
typename _Size,
typename _Compare>
1921 _GLIBCXX20_CONSTEXPR
1923 __introselect(_RandomAccessIterator __first, _RandomAccessIterator __nth,
1924 _RandomAccessIterator __last, _Size __depth_limit,
1927 _RandomAccessIterator __after_nth = __nth;
1930 while (__last - __first > 3)
1932 if (__depth_limit == 0)
1934 std::__heap_select(__first, __after_nth, __last, __comp);
1936 std::iter_swap(__first, __nth);
1940 _RandomAccessIterator __cut =
1941 std::__unguarded_partition_pivot(__first, __last, __comp);
1947 std::__insertion_sort(__first, __last, __comp);
1971 template<
typename _ForwardIterator,
typename _Tp,
typename _Compare>
1972 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1973 inline _ForwardIterator
1974 lower_bound(_ForwardIterator __first, _ForwardIterator __last,
1975 const _Tp& __val, _Compare __comp)
1978 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
1979 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
1981 __glibcxx_requires_partitioned_lower_pred(__first, __last,
1984 return std::__lower_bound(__first, __last, __val, __comp);
1987 template<
typename _ForwardIterator,
typename _Tp,
typename _Compare>
1988 _GLIBCXX20_CONSTEXPR
1990 __upper_bound(_ForwardIterator __first, _ForwardIterator __last,
1991 const _Tp& __val, _Compare __comp)
1993 typedef typename iterator_traits<_ForwardIterator>::difference_type
2000 _DistanceType __half = __len >> 1;
2001 _ForwardIterator __middle = __first;
2003 if (__comp(__val, *__middle))
2009 __len = __len - __half - 1;
2026 template<
typename _ForwardIterator,
typename _Tp>
2027 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
2028 inline _ForwardIterator
2029 upper_bound(_ForwardIterator __first, _ForwardIterator __last,
2033 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2034 __glibcxx_function_requires(_LessThanOpConcept<
2036 __glibcxx_requires_partitioned_upper(__first, __last, __val);
2038 return std::__upper_bound(__first, __last, __val,
2039 __gnu_cxx::__ops::less());
2057 template<
typename _ForwardIterator,
typename _Tp,
typename _Compare>
2058 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
2059 inline _ForwardIterator
2060 upper_bound(_ForwardIterator __first, _ForwardIterator __last,
2061 const _Tp& __val, _Compare __comp)
2064 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2065 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2067 __glibcxx_requires_partitioned_upper_pred(__first, __last,
2070 return std::__upper_bound(__first, __last, __val, __comp);
2073 template<
typename _ForwardIterator,
typename _Tp,
typename _Compare>
2074 _GLIBCXX20_CONSTEXPR
2076 __equal_range(_ForwardIterator __first, _ForwardIterator __last,
2077 const _Tp& __val, _Compare __comp)
2079 typedef typename iterator_traits<_ForwardIterator>::difference_type
2086 _DistanceType __half = __len >> 1;
2087 _ForwardIterator __middle = __first;
2089 if (__comp(*__middle, __val))
2093 __len = __len - __half - 1;
2095 else if (__comp(__val, *__middle))
2099 _ForwardIterator __left
2100 = std::__lower_bound(__first, __middle, __val, __comp);
2102 _ForwardIterator __right
2103 = std::__upper_bound(++__middle, __first, __val, __comp);
2127 template<
typename _ForwardIterator,
typename _Tp>
2128 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
2130 equal_range(_ForwardIterator __first, _ForwardIterator __last,
2134 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2135 __glibcxx_function_requires(_LessThanOpConcept<
2137 __glibcxx_function_requires(_LessThanOpConcept<
2139 __glibcxx_requires_partitioned_lower(__first, __last, __val);
2140 __glibcxx_requires_partitioned_upper(__first, __last, __val);
2142 return std::__equal_range(__first, __last, __val,
2143 __gnu_cxx::__ops::less());
2163 template<
typename _ForwardIterator,
typename _Tp,
typename _Compare>
2164 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
2166 equal_range(_ForwardIterator __first, _ForwardIterator __last,
2167 const _Tp& __val, _Compare __comp)
2170 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2171 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2173 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2175 __glibcxx_requires_partitioned_lower_pred(__first, __last,
2177 __glibcxx_requires_partitioned_upper_pred(__first, __last,
2180 return std::__equal_range(__first, __last, __val, __comp);
2195 template<
typename _ForwardIterator,
typename _Tp>
2196 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
2198 binary_search(_ForwardIterator __first, _ForwardIterator __last,
2202 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2203 __glibcxx_function_requires(_LessThanOpConcept<
2205 __glibcxx_requires_partitioned_lower(__first, __last, __val);
2206 __glibcxx_requires_partitioned_upper(__first, __last, __val);
2208 _ForwardIterator __i
2209 = std::__lower_bound(__first, __last, __val, __gnu_cxx::__ops::less());
2210 return __i != __last && !(__val < *__i);
2228 template<
typename _ForwardIterator,
typename _Tp,
typename _Compare>
2229 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
2231 binary_search(_ForwardIterator __first, _ForwardIterator __last,
2232 const _Tp& __val, _Compare __comp)
2235 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2236 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2238 __glibcxx_requires_partitioned_lower_pred(__first, __last,
2240 __glibcxx_requires_partitioned_upper_pred(__first, __last,
2243 _ForwardIterator __i
2244 = std::__lower_bound(__first, __last, __val, __comp);
2245 return __i != __last && !bool(__comp(__val, *__i));
2251 template<
typename _InputIterator1,
typename _InputIterator2,
2252 typename _OutputIterator,
typename _Compare>
2255 _InputIterator2 __first2, _InputIterator2 __last2,
2256 _OutputIterator __result, _Compare __comp)
2258 while (__first1 != __last1 && __first2 != __last2)
2260 if (__comp(*__first2, *__first1))
2262 *__result = _GLIBCXX_MOVE(*__first2);
2267 *__result = _GLIBCXX_MOVE(*__first1);
2272 if (__first1 != __last1)
2273 _GLIBCXX_MOVE3(__first1, __last1, __result);
2277 template<
typename _BidirectionalIterator1,
typename _BidirectionalIterator2,
2278 typename _BidirectionalIterator3,
typename _Compare>
2281 _BidirectionalIterator1 __last1,
2282 _BidirectionalIterator2 __first2,
2283 _BidirectionalIterator2 __last2,
2284 _BidirectionalIterator3 __result,
2287 if (__first1 == __last1)
2289 _GLIBCXX_MOVE_BACKWARD3(__first2, __last2, __result);
2292 else if (__first2 == __last2)
2299 if (__comp(*__last2, *__last1))
2301 *--__result = _GLIBCXX_MOVE(*__last1);
2302 if (__first1 == __last1)
2304 _GLIBCXX_MOVE_BACKWARD3(__first2, ++__last2, __result);
2311 *--__result = _GLIBCXX_MOVE(*__last2);
2312 if (__first2 == __last2)
2320 template<
typename _BidirectionalIterator1,
typename _BidirectionalIterator2,
2322 _BidirectionalIterator1
2324 _BidirectionalIterator1 __middle,
2325 _BidirectionalIterator1 __last,
2326 _Distance __len1, _Distance __len2,
2327 _BidirectionalIterator2 __buffer,
2328 _Distance __buffer_size)
2330 _BidirectionalIterator2 __buffer_end;
2331 if (__len1 > __len2 && __len2 <= __buffer_size)
2335 __buffer_end = _GLIBCXX_MOVE3(__middle, __last, __buffer);
2336 _GLIBCXX_MOVE_BACKWARD3(__first, __middle, __last);
2337 return _GLIBCXX_MOVE3(__buffer, __buffer_end, __first);
2342 else if (__len1 <= __buffer_size)
2346 __buffer_end = _GLIBCXX_MOVE3(__first, __middle, __buffer);
2347 _GLIBCXX_MOVE3(__middle, __last, __first);
2348 return _GLIBCXX_MOVE_BACKWARD3(__buffer, __buffer_end, __last);
2354 return std::rotate(__first, __middle, __last);
2358 template<
typename _BidirectionalIterator,
typename _Distance,
2359 typename _Pointer,
typename _Compare>
2362 _BidirectionalIterator __middle,
2363 _BidirectionalIterator __last,
2364 _Distance __len1, _Distance __len2,
2365 _Pointer __buffer, _Compare __comp)
2367 if (__len1 <= __len2)
2369 _Pointer __buffer_end = _GLIBCXX_MOVE3(__first, __middle, __buffer);
2375 _Pointer __buffer_end = _GLIBCXX_MOVE3(__middle, __last, __buffer);
2377 __buffer_end, __last, __comp);
2381 template<
typename _BidirectionalIterator,
typename _Distance,
2382 typename _Pointer,
typename _Compare>
2384 __merge_adaptive_resize(_BidirectionalIterator __first,
2385 _BidirectionalIterator __middle,
2386 _BidirectionalIterator __last,
2387 _Distance __len1, _Distance __len2,
2388 _Pointer __buffer, _Distance __buffer_size,
2391 if (__len1 <= __buffer_size || __len2 <= __buffer_size)
2393 __len1, __len2, __buffer, __comp);
2396 _BidirectionalIterator __first_cut = __first;
2397 _BidirectionalIterator __second_cut = __middle;
2398 _Distance __len11 = 0;
2399 _Distance __len22 = 0;
2400 if (__len1 > __len2)
2402 __len11 = __len1 / 2;
2405 = std::__lower_bound(__middle, __last, *__first_cut, __comp);
2410 __len22 = __len2 / 2;
2413 = std::__upper_bound(__first, __middle, *__second_cut, __comp);
2417 _BidirectionalIterator __new_middle
2419 _Distance(__len1 - __len11), __len22,
2420 __buffer, __buffer_size);
2421 std::__merge_adaptive_resize(__first, __first_cut, __new_middle,
2423 __buffer, __buffer_size, __comp);
2424 std::__merge_adaptive_resize(__new_middle, __second_cut, __last,
2425 _Distance(__len1 - __len11),
2426 _Distance(__len2 - __len22),
2427 __buffer, __buffer_size, __comp);
2432 template<
typename _BidirectionalIterator,
typename _Distance,
2434 _GLIBCXX26_CONSTEXPR
2437 _BidirectionalIterator __middle,
2438 _BidirectionalIterator __last,
2439 _Distance __len1, _Distance __len2,
2442 if (__len1 == 0 || __len2 == 0)
2445 if (__len1 + __len2 == 2)
2447 if (__comp(*__middle, *__first))
2448 std::iter_swap(__first, __middle);
2452 _BidirectionalIterator __first_cut = __first;
2453 _BidirectionalIterator __second_cut = __middle;
2454 _Distance __len11 = 0;
2455 _Distance __len22 = 0;
2456 if (__len1 > __len2)
2458 __len11 = __len1 / 2;
2461 = std::__lower_bound(__middle, __last, *__first_cut, __comp);
2466 __len22 = __len2 / 2;
2469 = std::__upper_bound(__first, __middle, *__second_cut, __comp);
2473 _BidirectionalIterator __new_middle
2474 = std::rotate(__first_cut, __middle, __second_cut);
2476 __len11, __len22, __comp);
2478 __len1 - __len11, __len2 - __len22, __comp);
2481 template<
typename _B
idirectionalIterator,
typename _Compare>
2482 _GLIBCXX26_CONSTEXPR
2484 __inplace_merge(_BidirectionalIterator __first,
2485 _BidirectionalIterator __middle,
2486 _BidirectionalIterator __last,
2489 typedef typename iterator_traits<_BidirectionalIterator>::value_type
2491 typedef typename iterator_traits<_BidirectionalIterator>::difference_type
2494 if (__first == __middle || __middle == __last)
2497 const _DistanceType __len1 =
std::distance(__first, __middle);
2498 const _DistanceType __len2 =
std::distance(__middle, __last);
2501# if __glibcxx_constexpr_algorithms >= 202306L
2504 (__first, __middle, __last, __len1, __len2, __comp);
2510 _TmpBuf __buf(__first,
std::min(__len1, __len2));
2512 if (__builtin_expect(__buf.size() == __buf._M_requested_size(),
true))
2514 (__first, __middle, __last, __len1, __len2, __buf.begin(), __comp);
2515 else if (__builtin_expect(__buf.begin() == 0,
false))
2517 (__first, __middle, __last, __len1, __len2, __comp);
2519 std::__merge_adaptive_resize
2520 (__first, __middle, __last, __len1, __len2, __buf.begin(),
2521 _DistanceType(__buf.size()), __comp);
2524 (__first, __middle, __last, __len1, __len2, __comp);
2545 template<
typename _B
idirectionalIterator>
2546 _GLIBCXX26_CONSTEXPR
2548 inplace_merge(_BidirectionalIterator __first,
2549 _BidirectionalIterator __middle,
2550 _BidirectionalIterator __last)
2553 __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
2554 _BidirectionalIterator>)
2555 __glibcxx_function_requires(_LessThanComparableConcept<
2557 __glibcxx_requires_sorted(__first, __middle);
2558 __glibcxx_requires_sorted(__middle, __last);
2559 __glibcxx_requires_irreflexive(__first, __last);
2561 std::__inplace_merge(__first, __middle, __last,
2562 __gnu_cxx::__ops::less());
2586 template<
typename _B
idirectionalIterator,
typename _Compare>
2587 _GLIBCXX26_CONSTEXPR
2589 inplace_merge(_BidirectionalIterator __first,
2590 _BidirectionalIterator __middle,
2591 _BidirectionalIterator __last,
2595 __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
2596 _BidirectionalIterator>)
2597 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2600 __glibcxx_requires_sorted_pred(__first, __middle, __comp);
2601 __glibcxx_requires_sorted_pred(__middle, __last, __comp);
2602 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
2604 std::__inplace_merge(__first, __middle, __last, __comp);
2609 template<
typename _InputIterator,
typename _OutputIterator,
2613 _InputIterator __first2, _InputIterator __last2,
2614 _OutputIterator __result, _Compare __comp)
2616 while (__first1 != __last1 && __first2 != __last2)
2618 if (__comp(*__first2, *__first1))
2620 *__result = _GLIBCXX_MOVE(*__first2);
2625 *__result = _GLIBCXX_MOVE(*__first1);
2630 return _GLIBCXX_MOVE3(__first2, __last2,
2631 _GLIBCXX_MOVE3(__first1, __last1,
2635 template<
typename _RandomAccessIterator1,
typename _RandomAccessIterator2,
2636 typename _Distance,
typename _Compare>
2638 __merge_sort_loop(_RandomAccessIterator1 __first,
2639 _RandomAccessIterator1 __last,
2640 _RandomAccessIterator2 __result, _Distance __step_size,
2643 const _Distance __two_step = 2 * __step_size;
2645 while (__last - __first >= __two_step)
2648 __first + __step_size,
2649 __first + __two_step,
2651 __first += __two_step;
2653 __step_size =
std::min(_Distance(__last - __first), __step_size);
2656 __first + __step_size, __last, __result, __comp);
2659 template<
typename _RandomAccessIterator,
typename _Distance,
2661 _GLIBCXX20_CONSTEXPR
2663 __chunk_insertion_sort(_RandomAccessIterator __first,
2664 _RandomAccessIterator __last,
2665 _Distance __chunk_size, _Compare __comp)
2667 while (__last - __first >= __chunk_size)
2669 std::__insertion_sort(__first, __first + __chunk_size, __comp);
2670 __first += __chunk_size;
2672 std::__insertion_sort(__first, __last, __comp);
2675 enum { _S_chunk_size = 7 };
2677 template<
typename _RandomAccessIterator,
typename _Po
inter,
typename _Compare>
2679 __merge_sort_with_buffer(_RandomAccessIterator __first,
2680 _RandomAccessIterator __last,
2681 _Pointer __buffer, _Compare __comp)
2686 const _Distance __len = __last - __first;
2687 const _Pointer __buffer_last = __buffer + __len;
2689 _Distance __step_size = _S_chunk_size;
2690 std::__chunk_insertion_sort(__first, __last, __step_size, __comp);
2692 while (__step_size < __len)
2694 std::__merge_sort_loop(__first, __last, __buffer,
2695 __step_size, __comp);
2697 std::__merge_sort_loop(__buffer, __buffer_last, __first,
2698 __step_size, __comp);
2703 template<
typename _RandomAccessIterator,
typename _Po
inter,
typename _Compare>
2705 __stable_sort_adaptive(_RandomAccessIterator __first,
2706 _RandomAccessIterator __middle,
2707 _RandomAccessIterator __last,
2708 _Pointer __buffer, _Compare __comp)
2710 std::__merge_sort_with_buffer(__first, __middle, __buffer, __comp);
2711 std::__merge_sort_with_buffer(__middle, __last, __buffer, __comp);
2714 __middle - __first, __last - __middle,
2718 template<
typename _RandomAccessIterator,
typename _Pointer,
2719 typename _Distance,
typename _Compare>
2721 __stable_sort_adaptive_resize(_RandomAccessIterator __first,
2722 _RandomAccessIterator __last,
2723 _Pointer __buffer, _Distance __buffer_size,
2726 const _Distance __len = (__last - __first + 1) / 2;
2727 const _RandomAccessIterator __middle = __first + __len;
2728 if (__len > __buffer_size)
2730 std::__stable_sort_adaptive_resize(__first, __middle, __buffer,
2731 __buffer_size, __comp);
2732 std::__stable_sort_adaptive_resize(__middle, __last, __buffer,
2733 __buffer_size, __comp);
2734 std::__merge_adaptive_resize(__first, __middle, __last,
2735 _Distance(__middle - __first),
2736 _Distance(__last - __middle),
2737 __buffer, __buffer_size,
2741 std::__stable_sort_adaptive(__first, __middle, __last,
2746 template<
typename _RandomAccessIterator,
typename _Compare>
2747 _GLIBCXX26_CONSTEXPR
2750 _RandomAccessIterator __last, _Compare __comp)
2752 if (__last - __first < 15)
2754 std::__insertion_sort(__first, __last, __comp);
2757 _RandomAccessIterator __middle = __first + (__last - __first) / 2;
2773 template<
typename _InputIterator1,
typename _InputIterator2,
2775 _GLIBCXX20_CONSTEXPR
2777 __includes(_InputIterator1 __first1, _InputIterator1 __last1,
2778 _InputIterator2 __first2, _InputIterator2 __last2,
2781 while (__first1 != __last1 && __first2 != __last2)
2783 if (__comp(*__first2, *__first1))
2785 if (!__comp(*__first1, *__first2))
2790 return __first2 == __last2;
2811 template<
typename _InputIterator1,
typename _InputIterator2>
2812 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
2814 includes(_InputIterator1 __first1, _InputIterator1 __last1,
2815 _InputIterator2 __first2, _InputIterator2 __last2)
2818 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
2819 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
2820 __glibcxx_function_requires(_LessThanOpConcept<
2823 __glibcxx_function_requires(_LessThanOpConcept<
2826 __glibcxx_requires_sorted_set(__first1, __last1, __first2);
2827 __glibcxx_requires_sorted_set(__first2, __last2, __first1);
2828 __glibcxx_requires_irreflexive2(__first1, __last1);
2829 __glibcxx_requires_irreflexive2(__first2, __last2);
2831 return std::__includes(__first1, __last1, __first2, __last2,
2832 __gnu_cxx::__ops::less());
2856 template<
typename _InputIterator1,
typename _InputIterator2,
2858 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
2860 includes(_InputIterator1 __first1, _InputIterator1 __last1,
2861 _InputIterator2 __first2, _InputIterator2 __last2,
2865 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
2866 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
2867 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2870 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2873 __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
2874 __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
2875 __glibcxx_requires_irreflexive_pred2(__first1, __last1, __comp);
2876 __glibcxx_requires_irreflexive_pred2(__first2, __last2, __comp);
2878 return std::__includes(__first1, __last1, __first2, __last2, __comp);
2891 template<
typename _B
idirectionalIterator,
typename _Compare>
2892 _GLIBCXX20_CONSTEXPR
2894 __next_permutation(_BidirectionalIterator __first,
2895 _BidirectionalIterator __last, _Compare __comp)
2897 if (__first == __last)
2899 _BidirectionalIterator __i = __first;
2908 _BidirectionalIterator __ii = __i;
2910 if (__comp(*__i, *__ii))
2912 _BidirectionalIterator __j = __last;
2913 while (!__comp(*__i, *--__j))
2915 std::iter_swap(__i, __j);
2941 template<
typename _B
idirectionalIterator>
2942 _GLIBCXX20_CONSTEXPR
2944 next_permutation(_BidirectionalIterator __first,
2945 _BidirectionalIterator __last)
2948 __glibcxx_function_requires(_BidirectionalIteratorConcept<
2949 _BidirectionalIterator>)
2950 __glibcxx_function_requires(_LessThanComparableConcept<
2952 __glibcxx_requires_valid_range(__first, __last);
2953 __glibcxx_requires_irreflexive(__first, __last);
2955 return std::__next_permutation(__first, __last, __gnu_cxx::__ops::less());
2973 template<
typename _B
idirectionalIterator,
typename _Compare>
2974 _GLIBCXX20_CONSTEXPR
2976 next_permutation(_BidirectionalIterator __first,
2977 _BidirectionalIterator __last, _Compare __comp)
2980 __glibcxx_function_requires(_BidirectionalIteratorConcept<
2981 _BidirectionalIterator>)
2982 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2985 __glibcxx_requires_valid_range(__first, __last);
2986 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
2988 return std::__next_permutation(__first, __last, __comp);
2991 template<
typename _B
idirectionalIterator,
typename _Compare>
2992 _GLIBCXX20_CONSTEXPR
2994 __prev_permutation(_BidirectionalIterator __first,
2995 _BidirectionalIterator __last, _Compare __comp)
2997 if (__first == __last)
2999 _BidirectionalIterator __i = __first;
3008 _BidirectionalIterator __ii = __i;
3010 if (__comp(*__ii, *__i))
3012 _BidirectionalIterator __j = __last;
3013 while (!__comp(*--__j, *__i))
3015 std::iter_swap(__i, __j);
3042 template<
typename _B
idirectionalIterator>
3043 _GLIBCXX20_CONSTEXPR
3045 prev_permutation(_BidirectionalIterator __first,
3046 _BidirectionalIterator __last)
3049 __glibcxx_function_requires(_BidirectionalIteratorConcept<
3050 _BidirectionalIterator>)
3051 __glibcxx_function_requires(_LessThanComparableConcept<
3053 __glibcxx_requires_valid_range(__first, __last);
3054 __glibcxx_requires_irreflexive(__first, __last);
3056 return std::__prev_permutation(__first, __last, __gnu_cxx::__ops::less());
3074 template<
typename _B
idirectionalIterator,
typename _Compare>
3075 _GLIBCXX20_CONSTEXPR
3077 prev_permutation(_BidirectionalIterator __first,
3078 _BidirectionalIterator __last, _Compare __comp)
3081 __glibcxx_function_requires(_BidirectionalIteratorConcept<
3082 _BidirectionalIterator>)
3083 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
3086 __glibcxx_requires_valid_range(__first, __last);
3087 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
3089 return std::__prev_permutation(__first, __last, __comp);
3095 template<
typename _InputIterator,
typename _OutputIterator,
3096 typename _Predicate,
typename _Tp>
3097 _GLIBCXX20_CONSTEXPR
3099 __replace_copy_if(_InputIterator __first, _InputIterator __last,
3100 _OutputIterator __result,
3101 _Predicate __pred,
const _Tp& __new_value)
3103 for (; __first != __last; ++__first, (void)++__result)
3104 if (__pred(*__first))
3105 *__result = __new_value;
3107 *__result = *__first;
3125 template<
typename _InputIterator,
typename _OutputIterator,
typename _Tp>
3126 _GLIBCXX20_CONSTEXPR
3127 inline _OutputIterator
3128 replace_copy(_InputIterator __first, _InputIterator __last,
3129 _OutputIterator __result,
3130 const _Tp& __old_value,
const _Tp& __new_value)
3133 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3134 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
3136 __glibcxx_function_requires(_EqualOpConcept<
3138 __glibcxx_requires_valid_range(__first, __last);
3140 return std::__replace_copy_if(__first, __last, __result,
3141 __gnu_cxx::__ops::__equal_to(__old_value),
3160 template<
typename _InputIterator,
typename _OutputIterator,
3161 typename _Predicate,
typename _Tp>
3162 _GLIBCXX20_CONSTEXPR
3163 inline _OutputIterator
3164 replace_copy_if(_InputIterator __first, _InputIterator __last,
3165 _OutputIterator __result,
3166 _Predicate __pred,
const _Tp& __new_value)
3169 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3170 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
3172 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
3174 __glibcxx_requires_valid_range(__first, __last);
3176 return std::__replace_copy_if(__first, __last, __result, __pred,
3180#if __cplusplus >= 201103L
3188 template<
typename _ForwardIterator>
3189 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
3191 is_sorted(_ForwardIterator __first, _ForwardIterator __last)
3192 {
return std::is_sorted_until(__first, __last) == __last; }
3203 template<
typename _ForwardIterator,
typename _Compare>
3204 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
3206 is_sorted(_ForwardIterator __first, _ForwardIterator __last,
3208 {
return std::is_sorted_until(__first, __last, __comp) == __last; }
3210 template<
typename _ForwardIterator,
typename _Compare>
3211 _GLIBCXX20_CONSTEXPR
3213 __is_sorted_until(_ForwardIterator __first, _ForwardIterator __last,
3216 if (__first == __last)
3219 _ForwardIterator __next = __first;
3220 for (++__next; __next != __last; __first = __next, (void)++__next)
3221 if (__comp(*__next, *__first))
3234 template<
typename _ForwardIterator>
3235 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
3236 inline _ForwardIterator
3237 is_sorted_until(_ForwardIterator __first, _ForwardIterator __last)
3240 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
3241 __glibcxx_function_requires(_LessThanComparableConcept<
3243 __glibcxx_requires_valid_range(__first, __last);
3244 __glibcxx_requires_irreflexive(__first, __last);
3246 return std::__is_sorted_until(__first, __last,
3247 __gnu_cxx::__ops::less());
3259 template<
typename _ForwardIterator,
typename _Compare>
3260 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
3261 inline _ForwardIterator
3262 is_sorted_until(_ForwardIterator __first, _ForwardIterator __last,
3266 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
3267 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
3270 __glibcxx_requires_valid_range(__first, __last);
3271 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
3273 return std::__is_sorted_until(__first, __last, __comp);
3284 template<
typename _Tp>
3285 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
3290 __glibcxx_function_requires(_LessThanComparableConcept<_Tp>)
3292 return __b < __a ? pair<const _Tp&, const _Tp&>(__b, __a)
3305 template<
typename _Tp,
typename _Compare>
3306 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
3308 minmax(
const _Tp& __a,
const _Tp& __b, _Compare __comp)
3314 template<
typename _ForwardIterator,
typename _Compare>
3315 _GLIBCXX14_CONSTEXPR
3317 __minmax_element(_ForwardIterator __first, _ForwardIterator __last,
3320 _ForwardIterator __next = __first;
3321 if (__first == __last
3322 || ++__next == __last)
3325 _ForwardIterator __min{}, __max{};
3326 if (__comp(*__next, *__first))
3340 while (__first != __last)
3343 if (++__next == __last)
3345 if (__comp(*__first, *__min))
3347 else if (!__comp(*__first, *__max))
3352 if (__comp(*__next, *__first))
3354 if (__comp(*__next, *__min))
3356 if (!__comp(*__first, *__max))
3361 if (__comp(*__first, *__min))
3363 if (!__comp(*__next, *__max))
3385 template<
typename _ForwardIterator>
3386 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
3388 minmax_element(_ForwardIterator __first, _ForwardIterator __last)
3391 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
3392 __glibcxx_function_requires(_LessThanComparableConcept<
3394 __glibcxx_requires_valid_range(__first, __last);
3395 __glibcxx_requires_irreflexive(__first, __last);
3397 return std::__minmax_element(__first, __last, __gnu_cxx::__ops::less());
3412 template<
typename _ForwardIterator,
typename _Compare>
3413 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
3415 minmax_element(_ForwardIterator __first, _ForwardIterator __last,
3419 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
3420 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
3423 __glibcxx_requires_valid_range(__first, __last);
3424 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
3426 return std::__minmax_element(__first, __last, __comp);
3429 template<
typename _Tp>
3430 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
3431 inline pair<_Tp, _Tp>
3432 minmax(initializer_list<_Tp> __l)
3434 __glibcxx_requires_irreflexive(__l.begin(), __l.end());
3436 std::__minmax_element(__l.begin(), __l.end(),
3437 __gnu_cxx::__ops::less());
3441 template<
typename _Tp,
typename _Compare>
3442 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
3446 __glibcxx_requires_irreflexive_pred(__l.begin(), __l.end(), __comp);
3448 std::__minmax_element(__l.begin(), __l.end(), __comp);
3466 template<
typename _ForwardIterator1,
typename _ForwardIterator2,
3467 typename _BinaryPredicate>
3468 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
3470 is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
3471 _ForwardIterator2 __first2, _BinaryPredicate __pred)
3474 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
3475 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
3476 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
3479 __glibcxx_requires_valid_range(__first1, __last1);
3481 return std::__is_permutation(__first1, __last1, __first2, __pred);
3484#if __glibcxx_robust_nonmodifying_seq_ops
3485#pragma GCC diagnostic push
3486#pragma GCC diagnostic ignored "-Wc++17-extensions"
3487 template<
typename _ForwardIterator1,
typename _ForwardIterator2,
3488 typename _BinaryPredicate>
3489 _GLIBCXX20_CONSTEXPR
3491 __is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
3492 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
3493 _BinaryPredicate __pred)
3495 using _Cat1 =
decltype(std::__iter_concept_or_category<_ForwardIterator1>());
3496 using _Cat2 =
decltype(std::__iter_concept_or_category<_ForwardIterator2>());
3497 using _It1_is_RA = is_same<_Cat1, random_access_iterator_tag>;
3498 using _It2_is_RA = is_same<_Cat2, random_access_iterator_tag>;
3499 constexpr bool __ra_iters = __and_<_It1_is_RA, _It2_is_RA>::value;
3500 if constexpr (__ra_iters)
3502 if ((__last1 - __first1) != (__last2 - __first2))
3508 for (; __first1 != __last1 && __first2 != __last2;
3509 ++__first1, (void)++__first2)
3510 if (!__pred(*__first1, *__first2))
3513 if constexpr (__ra_iters)
3515 if (__first1 == __last1)
3522 if (__d1 == 0 && __d2 == 0)
3528 for (_ForwardIterator1 __scan = __first1; __scan != __last1; ++__scan)
3530 auto&& __scan_val = *__scan;
3531 auto __scaneq = __gnu_cxx::__ops::bind1st(__pred, __scan_val);
3532 if (__scan != std::__find_if(__first1, __scan, __scaneq))
3535 auto __matches = std::__count_if(__first2, __last2, __scaneq);
3537 || std::__count_if(__scan, __last1, __scaneq) != __matches)
3542#pragma GCC diagnostic pop
3557 template<
typename _ForwardIterator1,
typename _ForwardIterator2>
3558 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
3560 is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
3561 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
3563 __glibcxx_requires_valid_range(__first1, __last1);
3564 __glibcxx_requires_valid_range(__first2, __last2);
3566 return std::__is_permutation(__first1, __last1, __first2, __last2,
3567 __gnu_cxx::__ops::equal_to());
3584 template<
typename _ForwardIterator1,
typename _ForwardIterator2,
3585 typename _BinaryPredicate>
3586 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
3588 is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
3589 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
3590 _BinaryPredicate __pred)
3592 __glibcxx_requires_valid_range(__first1, __last1);
3593 __glibcxx_requires_valid_range(__first2, __last2);
3595 return std::__is_permutation(__first1, __last1, __first2, __last2,
3600#ifdef __glibcxx_clamp
3612 template<
typename _Tp>
3613 [[nodiscard]]
constexpr const _Tp&
3614 clamp(
const _Tp& __val,
const _Tp& __lo,
const _Tp& __hi)
3616 __glibcxx_assert(!(__hi < __lo));
3632 template<
typename _Tp,
typename _Compare>
3633 [[nodiscard]]
constexpr const _Tp&
3634 clamp(
const _Tp& __val,
const _Tp& __lo,
const _Tp& __hi, _Compare __comp)
3636 __glibcxx_assert(!__comp(__hi, __lo));
3662 template<
typename _IntType,
typename _UniformRandomBitGenerator>
3665 _UniformRandomBitGenerator&& __g)
3683 template<
typename _RandomAccessIterator,
3684 typename _UniformRandomNumberGenerator>
3686 shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
3687 _UniformRandomNumberGenerator&& __g)
3690 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
3691 _RandomAccessIterator>)
3692 __glibcxx_requires_valid_range(__first, __last);
3694 if (__first == __last)
3700 typedef typename std::make_unsigned<_DistanceType>::type __ud_type;
3702 typedef typename __distr_type::param_type __p_type;
3704 typedef typename remove_reference<_UniformRandomNumberGenerator>::type
3709 const __uc_type __urngrange = __g.max() - __g.min();
3710 const __uc_type __urange = __uc_type(__last - __first);
3712 if (__urngrange / __urange >= __urange)
3715 _RandomAccessIterator __i = __first + 1;
3721 if ((__urange % 2) == 0)
3723 __distr_type __d{0, 1};
3724 std::iter_swap(__i++, __first + __d(__g));
3731 while (__i != __last)
3733 const __uc_type __swap_range = __uc_type(__i - __first) + 1;
3738 std::iter_swap(__i++, __first + __pospos.
first);
3739 std::iter_swap(__i++, __first + __pospos.
second);
3747 for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
3748 std::iter_swap(__i, __first + __d(__g, __p_type(0, __i - __first)));
3752_GLIBCXX_BEGIN_NAMESPACE_ALGO
3766 template<
typename _InputIterator,
typename _Function>
3767 _GLIBCXX20_CONSTEXPR
3769 for_each(_InputIterator __first, _InputIterator __last, _Function __f)
3772 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3773 __glibcxx_requires_valid_range(__first, __last);
3774 for (; __first != __last; ++__first)
3779#if __cplusplus >= 201703L
3792 template<
typename _InputIterator,
typename _Size,
typename _Function>
3793 _GLIBCXX20_CONSTEXPR
3797 auto __n2 = std::__size_to_integer(__n);
3798 using _Cat =
decltype(std::__iter_concept_or_category<_InputIterator>());
3799 if constexpr (is_base_of_v<random_access_iterator_tag, _Cat>)
3804 auto __last = __first + __d;
3805 std::for_each(__first, __last,
std::move(__f));
3829 template<
typename _InputIterator,
typename _Tp>
3830 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
3831 inline _InputIterator
3832 find(_InputIterator __first, _InputIterator __last,
const _Tp& __val)
3835 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3836 __glibcxx_function_requires(_EqualOpConcept<
3838 __glibcxx_requires_valid_range(__first, __last);
3840#if __cpp_if_constexpr && __glibcxx_type_trait_variable_templates
3842 if constexpr (__can_use_memchr_for_find<_ValT, _Tp>)
3843 if constexpr (is_pointer_v<
decltype(std::__niter_base(__first))>
3844#
if __glibcxx_concepts && __glibcxx_to_address
3845 || contiguous_iterator<_InputIterator>
3853 if (!(
static_cast<_ValT
>(__val) == __val))
3855 else if (!__is_constant_evaluated())
3857 const int __ival =
static_cast<int>(__val);
3858 if (
auto __n = __last - __first; __n > 0)
3860#if __glibcxx_concepts && __glibcxx_to_address
3863 const void* __p0 = std::__niter_base(__first);
3865 if (
auto __p1 = __builtin_memchr(__p0, __ival, __n))
3866 return __first + ((
const char*)__p1 - (
const char*)__p0);
3873 return std::__find_if(__first, __last,
3874 __gnu_cxx::__ops::__equal_to(__val));
3887 template<
typename _InputIterator,
typename _Predicate>
3888 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
3889 inline _InputIterator
3890 find_if(_InputIterator __first, _InputIterator __last,
3894 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3895 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
3897 __glibcxx_requires_valid_range(__first, __last);
3899 return std::__find_if(__first, __last, __pred);
3918 template<
typename _InputIterator,
typename _ForwardIterator>
3919 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
3921 find_first_of(_InputIterator __first1, _InputIterator __last1,
3922 _ForwardIterator __first2, _ForwardIterator __last2)
3925 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3926 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
3927 __glibcxx_function_requires(_EqualOpConcept<
3930 __glibcxx_requires_valid_range(__first1, __last1);
3931 __glibcxx_requires_valid_range(__first2, __last2);
3933 for (; __first1 != __last1; ++__first1)
3934 for (_ForwardIterator __iter = __first2; __iter != __last2; ++__iter)
3935 if (*__first1 == *__iter)
3959 template<
typename _InputIterator,
typename _ForwardIterator,
3960 typename _BinaryPredicate>
3961 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
3963 find_first_of(_InputIterator __first1, _InputIterator __last1,
3964 _ForwardIterator __first2, _ForwardIterator __last2,
3965 _BinaryPredicate __comp)
3968 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3969 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
3970 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
3973 __glibcxx_requires_valid_range(__first1, __last1);
3974 __glibcxx_requires_valid_range(__first2, __last2);
3976 for (; __first1 != __last1; ++__first1)
3977 for (_ForwardIterator __iter = __first2; __iter != __last2; ++__iter)
3978 if (__comp(*__first1, *__iter))
3992 template<
typename _ForwardIterator>
3993 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
3994 inline _ForwardIterator
3995 adjacent_find(_ForwardIterator __first, _ForwardIterator __last)
3998 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
3999 __glibcxx_function_requires(_EqualityComparableConcept<
4001 __glibcxx_requires_valid_range(__first, __last);
4003 return std::__adjacent_find(__first, __last,
4004 __gnu_cxx::__ops::equal_to());
4018 template<
typename _ForwardIterator,
typename _BinaryPredicate>
4019 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
4020 inline _ForwardIterator
4021 adjacent_find(_ForwardIterator __first, _ForwardIterator __last,
4022 _BinaryPredicate __binary_pred)
4025 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
4026 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
4029 __glibcxx_requires_valid_range(__first, __last);
4031 return std::__adjacent_find(__first, __last, __binary_pred);
4043 template<
typename _InputIterator,
typename _Tp>
4044 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
4045 inline typename iterator_traits<_InputIterator>::difference_type
4046 count(_InputIterator __first, _InputIterator __last,
const _Tp& __value)
4049 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
4050 __glibcxx_function_requires(_EqualOpConcept<
4052 __glibcxx_requires_valid_range(__first, __last);
4054 return std::__count_if(__first, __last,
4055 __gnu_cxx::__ops::__equal_to(__value));
4067 template<
typename _InputIterator,
typename _Predicate>
4068 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
4069 inline typename iterator_traits<_InputIterator>::difference_type
4070 count_if(_InputIterator __first, _InputIterator __last, _Predicate __pred)
4073 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
4074 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
4076 __glibcxx_requires_valid_range(__first, __last);
4078 return std::__count_if(__first, __last, __pred);
4107 template<
typename _ForwardIterator1,
typename _ForwardIterator2>
4108 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
4109 inline _ForwardIterator1
4110 search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
4111 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
4114 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
4115 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
4116 __glibcxx_function_requires(_EqualOpConcept<
4119 __glibcxx_requires_valid_range(__first1, __last1);
4120 __glibcxx_requires_valid_range(__first2, __last2);
4122 return std::__search(__first1, __last1, __first2, __last2,
4123 __gnu_cxx::__ops::equal_to());
4141 template<
typename _ForwardIterator,
typename _Integer,
typename _Tp>
4142 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
4143 inline _ForwardIterator
4144 search_n(_ForwardIterator __first, _ForwardIterator __last,
4145 _Integer __count,
const _Tp& __val)
4148 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
4149 __glibcxx_function_requires(_EqualOpConcept<
4151 __glibcxx_requires_valid_range(__first, __last);
4153 return std::__search_n(__first, __last, __count,
4154 __gnu_cxx::__ops::__equal_to(__val));
4175 template<
typename _ForwardIterator,
typename _Integer,
typename _Tp,
4176 typename _BinaryPredicate>
4177 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
4178 inline _ForwardIterator
4179 search_n(_ForwardIterator __first, _ForwardIterator __last,
4180 _Integer __count,
const _Tp& __val,
4181 _BinaryPredicate __binary_pred)
4184 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
4185 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
4187 __glibcxx_requires_valid_range(__first, __last);
4189 return std::__search_n(__first, __last, __count,
4190 __gnu_cxx::__ops::bind2nd(__binary_pred, __val));
4193#if __cplusplus >= 201703L
4201 template<
typename _ForwardIterator,
typename _Searcher>
4202 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
4203 inline _ForwardIterator
4204 search(_ForwardIterator __first, _ForwardIterator __last,
4205 const _Searcher& __searcher)
4206 {
return __searcher(__first, __last).first; }
4225 template<
typename _InputIterator,
typename _OutputIterator,
4226 typename _UnaryOperation>
4227 _GLIBCXX20_CONSTEXPR
4229 transform(_InputIterator __first, _InputIterator __last,
4230 _OutputIterator __result, _UnaryOperation __unary_op)
4233 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
4234 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4236 __typeof__(__unary_op(*__first))>)
4237 __glibcxx_requires_valid_range(__first, __last);
4239 for (; __first != __last; ++__first, (void)++__result)
4240 *__result = __unary_op(*__first);
4263 template<
typename _InputIterator1,
typename _InputIterator2,
4264 typename _OutputIterator,
typename _BinaryOperation>
4265 _GLIBCXX20_CONSTEXPR
4267 transform(_InputIterator1 __first1, _InputIterator1 __last1,
4268 _InputIterator2 __first2, _OutputIterator __result,
4269 _BinaryOperation __binary_op)
4272 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
4273 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
4274 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4276 __typeof__(__binary_op(*__first1,*__first2))>)
4277 __glibcxx_requires_valid_range(__first1, __last1);
4279 for (; __first1 != __last1; ++__first1, (void)++__first2, ++__result)
4280 *__result = __binary_op(*__first1, *__first2);
4297 template<
typename _ForwardIterator,
typename _Tp>
4298 _GLIBCXX20_CONSTEXPR
4300 replace(_ForwardIterator __first, _ForwardIterator __last,
4301 const _Tp& __old_value,
const _Tp& __new_value)
4304 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
4306 __glibcxx_function_requires(_EqualOpConcept<
4308 __glibcxx_function_requires(_ConvertibleConcept<_Tp,
4310 __glibcxx_requires_valid_range(__first, __last);
4312 for (; __first != __last; ++__first)
4313 if (*__first == __old_value)
4314 *__first = __new_value;
4330 template<
typename _ForwardIterator,
typename _Predicate,
typename _Tp>
4331 _GLIBCXX20_CONSTEXPR
4333 replace_if(_ForwardIterator __first, _ForwardIterator __last,
4334 _Predicate __pred,
const _Tp& __new_value)
4337 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
4339 __glibcxx_function_requires(_ConvertibleConcept<_Tp,
4341 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
4343 __glibcxx_requires_valid_range(__first, __last);
4345 for (; __first != __last; ++__first)
4346 if (__pred(*__first))
4347 *__first = __new_value;
4362 template<
typename _ForwardIterator,
typename _Generator>
4363 _GLIBCXX20_CONSTEXPR
4365 generate(_ForwardIterator __first, _ForwardIterator __last,
4369 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
4370 __glibcxx_function_requires(_GeneratorConcept<_Generator,
4372 __glibcxx_requires_valid_range(__first, __last);
4374 for (; __first != __last; ++__first)
4395 template<
typename _OutputIterator,
typename _Size,
typename _Generator>
4396 _GLIBCXX20_CONSTEXPR
4398 generate_n(_OutputIterator __first, _Size __n, _Generator __gen)
4401 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4403 __typeof__(__gen())>)
4405 typedef __decltype(std::__size_to_integer(__n)) _IntSize;
4406 for (_IntSize __niter = std::__size_to_integer(__n);
4407 __niter > 0; --__niter, (void) ++__first)
4430 template<
typename _InputIterator,
typename _OutputIterator>
4431 _GLIBCXX20_CONSTEXPR
4432 inline _OutputIterator
4433 unique_copy(_InputIterator __first, _InputIterator __last,
4434 _OutputIterator __result)
4437 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
4438 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4440 __glibcxx_function_requires(_EqualityComparableConcept<
4442 __glibcxx_requires_valid_range(__first, __last);
4444 if (__first == __last)
4446 return std::__unique_copy(__first, __last, __result,
4447 __gnu_cxx::__ops::equal_to(),
4448 std::__iter_concept_or_category(__first));
4469 template<
typename _InputIterator,
typename _OutputIterator,
4470 typename _BinaryPredicate>
4471 _GLIBCXX20_CONSTEXPR
4472 inline _OutputIterator
4473 unique_copy(_InputIterator __first, _InputIterator __last,
4474 _OutputIterator __result,
4475 _BinaryPredicate __binary_pred)
4478 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
4479 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4481 __glibcxx_requires_valid_range(__first, __last);
4482 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
4486 if (__first == __last)
4488 return std::__unique_copy(__first, __last, __result, __binary_pred,
4489 std::__iter_concept_or_category(__first));
4492#if __cplusplus <= 201103L || _GLIBCXX_USE_DEPRECATED
4508 template<
typename _RandomAccessIterator>
4509 _GLIBCXX14_DEPRECATED_SUGGEST(
"std::shuffle")
4511 random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last)
4514 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4515 _RandomAccessIterator>)
4516 __glibcxx_requires_valid_range(__first, __last);
4518 if (__first == __last)
4524#if RAND_MAX < __INT_MAX__
4525 if (__builtin_expect((__last - __first) >= RAND_MAX / 4, 0))
4530 = (unsigned)std::rand() ^ ((unsigned)std::rand() << 15);
4531 for (_RandomAccessIterator __i = __first + _Dist(1); __i != __last;
4535 __xss ^= __xss << 13;
4536 __xss ^= __xss >> 17;
4537 __xss ^= __xss << 5;
4538 _RandomAccessIterator __j
4539 = __first + _Dist(__xss % ((__i - __first) + 1));
4541 std::iter_swap(__i, __j);
4547 for (_RandomAccessIterator __i = __first + _Dist(1); __i != __last; ++__i)
4550 _RandomAccessIterator __j
4551 = __first + _Dist(std::rand() % ((__i - __first) + 1));
4553 std::iter_swap(__i, __j);
4574 template<
typename _RandomAccessIterator,
typename _RandomNumberGenerator>
4575 _GLIBCXX14_DEPRECATED_SUGGEST(
"std::shuffle")
4577 random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
4578#if __cplusplus >= 201103L
4579 _RandomNumberGenerator&& __rand)
4581 _RandomNumberGenerator& __rand)
4585 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4586 _RandomAccessIterator>)
4587 __glibcxx_requires_valid_range(__first, __last);
4589 if (__first == __last)
4595 for (_RandomAccessIterator __i = __first + _Dist(1); __i != __last; ++__i)
4597 _RandomAccessIterator __j
4598 = __first + _Dist(__rand((__i - __first) + 1));
4600 std::iter_swap(__i, __j);
4621 template<
typename _ForwardIterator,
typename _Predicate>
4622 _GLIBCXX20_CONSTEXPR
4623 inline _ForwardIterator
4624 partition(_ForwardIterator __first, _ForwardIterator __last,
4628 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
4630 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
4632 __glibcxx_requires_valid_range(__first, __last);
4655 template<
typename _RandomAccessIterator>
4656 _GLIBCXX20_CONSTEXPR
4658 partial_sort(_RandomAccessIterator __first,
4659 _RandomAccessIterator __middle,
4660 _RandomAccessIterator __last)
4663 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4664 _RandomAccessIterator>)
4665 __glibcxx_function_requires(_LessThanComparableConcept<
4667 __glibcxx_requires_valid_range(__first, __middle);
4668 __glibcxx_requires_valid_range(__middle, __last);
4669 __glibcxx_requires_irreflexive(__first, __last);
4671 std::__partial_sort(__first, __middle, __last,
4672 __gnu_cxx::__ops::less());
4693 template<
typename _RandomAccessIterator,
typename _Compare>
4694 _GLIBCXX20_CONSTEXPR
4696 partial_sort(_RandomAccessIterator __first,
4697 _RandomAccessIterator __middle,
4698 _RandomAccessIterator __last,
4702 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4703 _RandomAccessIterator>)
4704 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
4707 __glibcxx_requires_valid_range(__first, __middle);
4708 __glibcxx_requires_valid_range(__middle, __last);
4709 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
4711 std::__partial_sort(__first, __middle, __last, __comp);
4728 template<
typename _RandomAccessIterator>
4729 _GLIBCXX20_CONSTEXPR
4731 nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth,
4732 _RandomAccessIterator __last)
4735 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4736 _RandomAccessIterator>)
4737 __glibcxx_function_requires(_LessThanComparableConcept<
4739 __glibcxx_requires_valid_range(__first, __nth);
4740 __glibcxx_requires_valid_range(__nth, __last);
4741 __glibcxx_requires_irreflexive(__first, __last);
4743 if (__first == __last || __nth == __last)
4746 std::__introselect(__first, __nth, __last,
4748 __gnu_cxx::__ops::less());
4767 template<
typename _RandomAccessIterator,
typename _Compare>
4768 _GLIBCXX20_CONSTEXPR
4770 nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth,
4771 _RandomAccessIterator __last, _Compare __comp)
4774 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4775 _RandomAccessIterator>)
4776 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
4779 __glibcxx_requires_valid_range(__first, __nth);
4780 __glibcxx_requires_valid_range(__nth, __last);
4781 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
4783 if (__first == __last || __nth == __last)
4786 std::__introselect(__first, __nth, __last,
4804 template<
typename _RandomAccessIterator>
4805 _GLIBCXX20_CONSTEXPR
4807 sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
4810 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4811 _RandomAccessIterator>)
4812 __glibcxx_function_requires(_LessThanComparableConcept<
4814 __glibcxx_requires_valid_range(__first, __last);
4815 __glibcxx_requires_irreflexive(__first, __last);
4817 std::__sort(__first, __last, __gnu_cxx::__ops::less());
4834 template<
typename _RandomAccessIterator,
typename _Compare>
4835 _GLIBCXX20_CONSTEXPR
4837 sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
4841 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4842 _RandomAccessIterator>)
4843 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
4846 __glibcxx_requires_valid_range(__first, __last);
4847 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
4849 std::__sort(__first, __last, __comp);
4852 template<
typename _InputIterator1,
typename _InputIterator2,
4853 typename _OutputIterator,
typename _Compare>
4854 _GLIBCXX20_CONSTEXPR
4856 __merge(_InputIterator1 __first1, _InputIterator1 __last1,
4857 _InputIterator2 __first2, _InputIterator2 __last2,
4858 _OutputIterator __result, _Compare __comp)
4860 while (__first1 != __last1 && __first2 != __last2)
4862 if (__comp(*__first2, *__first1))
4864 *__result = *__first2;
4869 *__result = *__first1;
4874 return std::copy(__first2, __last2,
4875 std::copy(__first1, __last1, __result));
4897 template<
typename _InputIterator1,
typename _InputIterator2,
4898 typename _OutputIterator>
4899 _GLIBCXX20_CONSTEXPR
4900 inline _OutputIterator
4901 merge(_InputIterator1 __first1, _InputIterator1 __last1,
4902 _InputIterator2 __first2, _InputIterator2 __last2,
4903 _OutputIterator __result)
4906 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
4907 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
4908 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4910 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4912 __glibcxx_function_requires(_LessThanOpConcept<
4915 __glibcxx_requires_sorted_set(__first1, __last1, __first2);
4916 __glibcxx_requires_sorted_set(__first2, __last2, __first1);
4917 __glibcxx_requires_irreflexive2(__first1, __last1);
4918 __glibcxx_requires_irreflexive2(__first2, __last2);
4920 return _GLIBCXX_STD_A::__merge(__first1, __last1, __first2, __last2,
4921 __result, __gnu_cxx::__ops::less());
4947 template<
typename _InputIterator1,
typename _InputIterator2,
4948 typename _OutputIterator,
typename _Compare>
4949 _GLIBCXX20_CONSTEXPR
4950 inline _OutputIterator
4951 merge(_InputIterator1 __first1, _InputIterator1 __last1,
4952 _InputIterator2 __first2, _InputIterator2 __last2,
4953 _OutputIterator __result, _Compare __comp)
4956 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
4957 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
4958 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4960 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4962 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
4965 __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
4966 __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
4967 __glibcxx_requires_irreflexive_pred2(__first1, __last1, __comp);
4968 __glibcxx_requires_irreflexive_pred2(__first2, __last2, __comp);
4970 return _GLIBCXX_STD_A::__merge(__first1, __last1, __first2, __last2,
4974 template<
typename _RandomAccessIterator,
typename _Compare>
4975 _GLIBCXX26_CONSTEXPR
4977 __stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
4980 typedef typename iterator_traits<_RandomAccessIterator>::value_type
4982 typedef typename iterator_traits<_RandomAccessIterator>::difference_type
4985 if (__first == __last)
4989# if __glibcxx_constexpr_algorithms >= 202306L
4998 _TmpBuf __buf(__first, (__last - __first + 1) / 2);
5000 if (__builtin_expect(__buf._M_requested_size() == __buf.size(),
true))
5001 std::__stable_sort_adaptive(__first,
5002 __first + _DistanceType(__buf.size()),
5003 __last, __buf.begin(), __comp);
5004 else if (__builtin_expect(__buf.begin() == 0,
false))
5007 std::__stable_sort_adaptive_resize(__first, __last, __buf.begin(),
5008 _DistanceType(__buf.size()), __comp);
5030 template<
typename _RandomAccessIterator>
5031 _GLIBCXX26_CONSTEXPR
5033 stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
5036 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
5037 _RandomAccessIterator>)
5038 __glibcxx_function_requires(_LessThanComparableConcept<
5040 __glibcxx_requires_valid_range(__first, __last);
5041 __glibcxx_requires_irreflexive(__first, __last);
5043 _GLIBCXX_STD_A::__stable_sort(__first, __last,
5044 __gnu_cxx::__ops::less());
5064 template<
typename _RandomAccessIterator,
typename _Compare>
5065 _GLIBCXX26_CONSTEXPR
5067 stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
5071 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
5072 _RandomAccessIterator>)
5073 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5076 __glibcxx_requires_valid_range(__first, __last);
5077 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
5079 _GLIBCXX_STD_A::__stable_sort(__first, __last, __comp);
5082 template<
typename _InputIterator1,
typename _InputIterator2,
5083 typename _OutputIterator,
typename _Compare>
5084 _GLIBCXX20_CONSTEXPR
5086 __set_union(_InputIterator1 __first1, _InputIterator1 __last1,
5087 _InputIterator2 __first2, _InputIterator2 __last2,
5088 _OutputIterator __result, _Compare __comp)
5090 while (__first1 != __last1 && __first2 != __last2)
5092 if (__comp(*__first1, *__first2))
5094 *__result = *__first1;
5097 else if (__comp(*__first2, *__first1))
5099 *__result = *__first2;
5104 *__result = *__first1;
5110 return std::copy(__first2, __last2,
5111 std::copy(__first1, __last1, __result));
5133 template<
typename _InputIterator1,
typename _InputIterator2,
5134 typename _OutputIterator>
5135 _GLIBCXX20_CONSTEXPR
5136 inline _OutputIterator
5137 set_union(_InputIterator1 __first1, _InputIterator1 __last1,
5138 _InputIterator2 __first2, _InputIterator2 __last2,
5139 _OutputIterator __result)
5142 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5143 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5144 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5146 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5148 __glibcxx_function_requires(_LessThanOpConcept<
5151 __glibcxx_function_requires(_LessThanOpConcept<
5154 __glibcxx_requires_sorted_set(__first1, __last1, __first2);
5155 __glibcxx_requires_sorted_set(__first2, __last2, __first1);
5156 __glibcxx_requires_irreflexive2(__first1, __last1);
5157 __glibcxx_requires_irreflexive2(__first2, __last2);
5159 return _GLIBCXX_STD_A::__set_union(__first1, __last1, __first2, __last2,
5160 __result, __gnu_cxx::__ops::less());
5183 template<
typename _InputIterator1,
typename _InputIterator2,
5184 typename _OutputIterator,
typename _Compare>
5185 _GLIBCXX20_CONSTEXPR
5186 inline _OutputIterator
5187 set_union(_InputIterator1 __first1, _InputIterator1 __last1,
5188 _InputIterator2 __first2, _InputIterator2 __last2,
5189 _OutputIterator __result, _Compare __comp)
5192 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5193 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5194 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5196 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5198 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5201 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5204 __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
5205 __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
5206 __glibcxx_requires_irreflexive_pred2(__first1, __last1, __comp);
5207 __glibcxx_requires_irreflexive_pred2(__first2, __last2, __comp);
5209 return _GLIBCXX_STD_A::__set_union(__first1, __last1, __first2, __last2,
5213 template<
typename _InputIterator1,
typename _InputIterator2,
5214 typename _OutputIterator,
typename _Compare>
5215 _GLIBCXX20_CONSTEXPR
5217 __set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5218 _InputIterator2 __first2, _InputIterator2 __last2,
5219 _OutputIterator __result, _Compare __comp)
5221 while (__first1 != __last1 && __first2 != __last2)
5222 if (__comp(*__first1, *__first2))
5224 else if (__comp(*__first2, *__first1))
5228 *__result = *__first1;
5254 template<
typename _InputIterator1,
typename _InputIterator2,
5255 typename _OutputIterator>
5256 _GLIBCXX20_CONSTEXPR
5257 inline _OutputIterator
5258 set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5259 _InputIterator2 __first2, _InputIterator2 __last2,
5260 _OutputIterator __result)
5263 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5264 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5265 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5267 __glibcxx_function_requires(_LessThanOpConcept<
5270 __glibcxx_function_requires(_LessThanOpConcept<
5273 __glibcxx_requires_sorted_set(__first1, __last1, __first2);
5274 __glibcxx_requires_sorted_set(__first2, __last2, __first1);
5275 __glibcxx_requires_irreflexive2(__first1, __last1);
5276 __glibcxx_requires_irreflexive2(__first2, __last2);
5278 return _GLIBCXX_STD_A::
5279 __set_intersection(__first1, __last1, __first2, __last2,
5280 __result, __gnu_cxx::__ops::less());
5304 template<
typename _InputIterator1,
typename _InputIterator2,
5305 typename _OutputIterator,
typename _Compare>
5306 _GLIBCXX20_CONSTEXPR
5307 inline _OutputIterator
5308 set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5309 _InputIterator2 __first2, _InputIterator2 __last2,
5310 _OutputIterator __result, _Compare __comp)
5313 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5314 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5315 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5317 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5320 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5323 __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
5324 __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
5325 __glibcxx_requires_irreflexive_pred2(__first1, __last1, __comp);
5326 __glibcxx_requires_irreflexive_pred2(__first2, __last2, __comp);
5328 return _GLIBCXX_STD_A::
5329 __set_intersection(__first1, __last1, __first2, __last2,
5333 template<
typename _InputIterator1,
typename _InputIterator2,
5334 typename _OutputIterator,
typename _Compare>
5335 _GLIBCXX20_CONSTEXPR
5337 __set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5338 _InputIterator2 __first2, _InputIterator2 __last2,
5339 _OutputIterator __result, _Compare __comp)
5341 while (__first1 != __last1 && __first2 != __last2)
5342 if (__comp(*__first1, *__first2))
5344 *__result = *__first1;
5348 else if (__comp(*__first2, *__first1))
5355 return std::copy(__first1, __last1, __result);
5378 template<
typename _InputIterator1,
typename _InputIterator2,
5379 typename _OutputIterator>
5380 _GLIBCXX20_CONSTEXPR
5381 inline _OutputIterator
5382 set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5383 _InputIterator2 __first2, _InputIterator2 __last2,
5384 _OutputIterator __result)
5387 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5388 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5389 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5391 __glibcxx_function_requires(_LessThanOpConcept<
5394 __glibcxx_function_requires(_LessThanOpConcept<
5397 __glibcxx_requires_sorted_set(__first1, __last1, __first2);
5398 __glibcxx_requires_sorted_set(__first2, __last2, __first1);
5399 __glibcxx_requires_irreflexive2(__first1, __last1);
5400 __glibcxx_requires_irreflexive2(__first2, __last2);
5402 return _GLIBCXX_STD_A::
5403 __set_difference(__first1, __last1, __first2, __last2, __result,
5404 __gnu_cxx::__ops::less());
5430 template<
typename _InputIterator1,
typename _InputIterator2,
5431 typename _OutputIterator,
typename _Compare>
5432 _GLIBCXX20_CONSTEXPR
5433 inline _OutputIterator
5434 set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5435 _InputIterator2 __first2, _InputIterator2 __last2,
5436 _OutputIterator __result, _Compare __comp)
5439 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5440 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5441 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5443 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5446 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5449 __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
5450 __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
5451 __glibcxx_requires_irreflexive_pred2(__first1, __last1, __comp);
5452 __glibcxx_requires_irreflexive_pred2(__first2, __last2, __comp);
5454 return _GLIBCXX_STD_A::
5455 __set_difference(__first1, __last1, __first2, __last2, __result,
5459 template<
typename _InputIterator1,
typename _InputIterator2,
5460 typename _OutputIterator,
5462 _GLIBCXX20_CONSTEXPR
5464 __set_symmetric_difference(_InputIterator1 __first1,
5465 _InputIterator1 __last1,
5466 _InputIterator2 __first2,
5467 _InputIterator2 __last2,
5468 _OutputIterator __result,
5471 while (__first1 != __last1 && __first2 != __last2)
5472 if (__comp(*__first1, *__first2))
5474 *__result = *__first1;
5478 else if (__comp(*__first2, *__first1))
5480 *__result = *__first2;
5489 return std::copy(__first2, __last2,
5490 std::copy(__first1, __last1, __result));
5511 template<
typename _InputIterator1,
typename _InputIterator2,
5512 typename _OutputIterator>
5513 _GLIBCXX20_CONSTEXPR
5514 inline _OutputIterator
5515 set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5516 _InputIterator2 __first2, _InputIterator2 __last2,
5517 _OutputIterator __result)
5520 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5521 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5522 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5524 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5526 __glibcxx_function_requires(_LessThanOpConcept<
5529 __glibcxx_function_requires(_LessThanOpConcept<
5532 __glibcxx_requires_sorted_set(__first1, __last1, __first2);
5533 __glibcxx_requires_sorted_set(__first2, __last2, __first1);
5534 __glibcxx_requires_irreflexive2(__first1, __last1);
5535 __glibcxx_requires_irreflexive2(__first2, __last2);
5537 return _GLIBCXX_STD_A::
5538 __set_symmetric_difference(__first1, __last1, __first2, __last2,
5539 __result, __gnu_cxx::__ops::less());
5563 template<
typename _InputIterator1,
typename _InputIterator2,
5564 typename _OutputIterator,
typename _Compare>
5565 _GLIBCXX20_CONSTEXPR
5566 inline _OutputIterator
5567 set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5568 _InputIterator2 __first2, _InputIterator2 __last2,
5569 _OutputIterator __result,
5573 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5574 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5575 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5577 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5579 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5582 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5585 __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
5586 __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
5587 __glibcxx_requires_irreflexive_pred2(__first1, __last1, __comp);
5588 __glibcxx_requires_irreflexive_pred2(__first2, __last2, __comp);
5590 return _GLIBCXX_STD_A::
5591 __set_symmetric_difference(__first1, __last1, __first2, __last2,
5595 template<
typename _ForwardIterator,
typename _Compare>
5596 _GLIBCXX14_CONSTEXPR
5598 __min_element(_ForwardIterator __first, _ForwardIterator __last,
5601 if (__first == __last)
5603 _ForwardIterator __result = __first;
5604 while (++__first != __last)
5605 if (__comp(*__first, *__result))
5617 template<
typename _ForwardIterator>
5618 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
5619 inline _ForwardIterator
5620 min_element(_ForwardIterator __first, _ForwardIterator __last)
5623 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
5624 __glibcxx_function_requires(_LessThanComparableConcept<
5626 __glibcxx_requires_valid_range(__first, __last);
5627 __glibcxx_requires_irreflexive(__first, __last);
5629 return _GLIBCXX_STD_A::__min_element(__first, __last,
5630 __gnu_cxx::__ops::less());
5642 template<
typename _ForwardIterator,
typename _Compare>
5643 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
5644 inline _ForwardIterator
5645 min_element(_ForwardIterator __first, _ForwardIterator __last,
5649 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
5650 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5653 __glibcxx_requires_valid_range(__first, __last);
5654 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
5656 return _GLIBCXX_STD_A::__min_element(__first, __last, __comp);
5659 template<
typename _ForwardIterator,
typename _Compare>
5660 _GLIBCXX14_CONSTEXPR
5662 __max_element(_ForwardIterator __first, _ForwardIterator __last,
5665 if (__first == __last)
return __first;
5666 _ForwardIterator __result = __first;
5667 while (++__first != __last)
5668 if (__comp(*__result, *__first))
5680 template<
typename _ForwardIterator>
5681 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
5682 inline _ForwardIterator
5683 max_element(_ForwardIterator __first, _ForwardIterator __last)
5686 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
5687 __glibcxx_function_requires(_LessThanComparableConcept<
5689 __glibcxx_requires_valid_range(__first, __last);
5690 __glibcxx_requires_irreflexive(__first, __last);
5692 return _GLIBCXX_STD_A::__max_element(__first, __last,
5693 __gnu_cxx::__ops::less());
5705 template<
typename _ForwardIterator,
typename _Compare>
5706 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
5707 inline _ForwardIterator
5708 max_element(_ForwardIterator __first, _ForwardIterator __last,
5712 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
5713 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5716 __glibcxx_requires_valid_range(__first, __last);
5717 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
5719 return _GLIBCXX_STD_A::__max_element(__first, __last, __comp);
5722#if __cplusplus >= 201103L
5724 template<
typename _Tp>
5725 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
5727 min(initializer_list<_Tp> __l)
5729 __glibcxx_requires_irreflexive(__l.begin(), __l.end());
5730 return *_GLIBCXX_STD_A::__min_element(__l.begin(), __l.end(),
5731 __gnu_cxx::__ops::less());
5734 template<
typename _Tp,
typename _Compare>
5735 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
5739 __glibcxx_requires_irreflexive_pred(__l.begin(), __l.end(), __comp);
5740 return *_GLIBCXX_STD_A::__min_element(__l.begin(), __l.end(), __comp);
5743 template<
typename _Tp>
5744 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
5748 __glibcxx_requires_irreflexive(__l.begin(), __l.end());
5749 return *_GLIBCXX_STD_A::__max_element(__l.begin(), __l.end(),
5750 __gnu_cxx::__ops::less());
5753 template<
typename _Tp,
typename _Compare>
5754 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
5758 __glibcxx_requires_irreflexive_pred(__l.begin(), __l.end(), __comp);
5759 return *_GLIBCXX_STD_A::__max_element(__l.begin(), __l.end(), __comp);
5763#if __cplusplus >= 201402L
5765 template<typename _InputIterator, typename _RandomAccessIterator,
5766 typename _Size,
typename _UniformRandomBitGenerator>
5767 _RandomAccessIterator
5770 _Size __n, _UniformRandomBitGenerator&& __g)
5773 using __param_type =
typename __distrib_type::param_type;
5774 __distrib_type __d{};
5775 _Size __sample_sz = 0;
5776 while (__first != __last && __sample_sz != __n)
5778 __out[__sample_sz++] = *__first;
5781 for (
auto __pop_sz = __sample_sz; __first != __last;
5782 ++__first, (void) ++__pop_sz)
5784 const auto __k = __d(__g, __param_type{0, __pop_sz});
5786 __out[__k] = *__first;
5788 return __out + __sample_sz;
5792 template<
typename _ForwardIterator,
typename _OutputIterator,
typename _Cat,
5793 typename _Size,
typename _UniformRandomBitGenerator>
5795 __sample(_ForwardIterator __first, _ForwardIterator __last,
5797 _OutputIterator __out, _Cat,
5798 _Size __n, _UniformRandomBitGenerator&& __g)
5801 using __param_type =
typename __distrib_type::param_type;
5806 if (__first == __last)
5809 __distrib_type __d{};
5811 __n =
std::min(__n, __unsampled_sz);
5816 const __uc_type __urngrange = __g.max() - __g.min();
5817 if (__urngrange / __uc_type(__unsampled_sz) >= __uc_type(__unsampled_sz))
5821 while (__n != 0 && __unsampled_sz >= 2)
5827 if (__p.
first < __n)
5829 *__out++ = *__first;
5835 if (__n == 0)
break;
5840 *__out++ = *__first;
5850 for (; __n != 0; ++__first)
5851 if (__d(__g, __param_type{0, --__unsampled_sz}) < __n)
5853 *__out++ = *__first;
5860#ifdef __glibcxx_sample
5862 template<typename _PopulationIterator, typename _SampleIterator,
5863 typename _Distance,
typename _UniformRandomBitGenerator>
5865 sample(_PopulationIterator __first, _PopulationIterator __last,
5866 _SampleIterator __out, _Distance __n,
5867 _UniformRandomBitGenerator&& __g)
5870 =
decltype(std::__iter_concept_or_category<_PopulationIterator>());
5875 __or_<is_convertible<__pop_cat, forward_iterator_tag>,
5876 is_convertible<__samp_cat, random_access_iterator_tag>>::value,
5877 "output range must use a RandomAccessIterator when input range"
5878 " does not meet the ForwardIterator requirements");
5881 "sample size must be an integer type");
5884 return _GLIBCXX_STD_A::
5885 __sample(__first, __last, __pop_cat{}, __out, __samp_cat{}, __d,
5890_GLIBCXX_END_NAMESPACE_ALGO
5891_GLIBCXX_END_NAMESPACE_VERSION
5894#pragma GCC diagnostic pop
constexpr _Tp * to_address(_Tp *__ptr) noexcept
Obtain address referenced by a pointer to an object.
typename remove_reference< _Tp >::type remove_reference_t
Alias template for remove_reference.
typename common_type< _Tp... >::type common_type_t
Alias template for common_type.
typename make_unsigned< _Tp >::type make_unsigned_t
Alias template for make_unsigned.
pair(_T1, _T2) -> pair< _T1, _T2 >
Two pairs are equal iff their members are equal.
constexpr pair< typename __decay_and_strip< _T1 >::__type, typename __decay_and_strip< _T2 >::__type > make_pair(_T1 &&__x, _T2 &&__y)
A convenience wrapper for creating a pair from two objects.
constexpr std::remove_reference< _Tp >::type && move(_Tp &&__t) noexcept
Convert a value to an rvalue.
constexpr _Tp && forward(typename std::remove_reference< _Tp >::type &__t) noexcept
Forward an lvalue.
constexpr _InputIterator for_each_n(_InputIterator __first, _Size __n, _Function __f)
Apply a function to every element of a sequence.
constexpr const _Tp & clamp(const _Tp &, const _Tp &, const _Tp &)
Returns the value clamped between lo and hi.
constexpr const _Tp & max(const _Tp &, const _Tp &)
This does what you think it does.
constexpr pair< const _Tp &, const _Tp & > minmax(const _Tp &, const _Tp &)
Determines min and max at once as an ordered pair.
constexpr const _Tp & min(const _Tp &, const _Tp &)
This does what you think it does.
constexpr iterator_traits< _Iter >::iterator_category __iterator_category(const _Iter &)
ISO C++ entities toplevel namespace is std.
_BidirectionalIterator1 __rotate_adaptive(_BidirectionalIterator1 __first, _BidirectionalIterator1 __middle, _BidirectionalIterator1 __last, _Distance __len1, _Distance __len2, _BidirectionalIterator2 __buffer, _Distance __buffer_size)
This is a helper function for the merge routines.
_RandomAccessIterator __sample(_InputIterator __first, _InputIterator __last, input_iterator_tag, _RandomAccessIterator __out, random_access_iterator_tag, _Size __n, _UniformRandomBitGenerator &&__g)
Reservoir sampling algorithm.
void __merge_adaptive(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last, _Distance __len1, _Distance __len2, _Pointer __buffer, _Compare __comp)
This is a helper function for the merge routines.
constexpr _InputIterator __find_if_not_n(_InputIterator __first, _Distance &__len, _Predicate __pred)
Like find_if_not(), but uses and updates a count of the remaining range length instead of comparing a...
constexpr void __inplace_stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
This is a helper function for the stable sorting routines.
pair< _IntType, _IntType > __gen_two_uniform_ints(_IntType __b0, _IntType __b1, _UniformRandomBitGenerator &&__g)
Generate two uniformly distributed integers using a single distribution invocation.
constexpr void __merge_without_buffer(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last, _Distance __len1, _Distance __len2, _Compare __comp)
This is a helper function for the merge routines.
constexpr iterator_traits< _InputIterator >::difference_type distance(_InputIterator __first, _InputIterator __last)
A generalization of pointer arithmetic.
constexpr _Tp __lg(_Tp __n)
This is a helper function for the sort routines and for random.tcc.
constexpr _EuclideanRingElement __gcd(_EuclideanRingElement __m, _EuclideanRingElement __n)
constexpr _ForwardIterator __partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, forward_iterator_tag)
This is a helper function...
void __move_merge_adaptive(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
This is a helper function for the __merge_adaptive routines.
constexpr void __reverse(_BidirectionalIterator __first, _BidirectionalIterator __last, bidirectional_iterator_tag)
_SampleIterator sample(_PopulationIterator __first, _PopulationIterator __last, _SampleIterator __out, _Distance __n, _UniformRandomBitGenerator &&__g)
Take a random sample from a population.
constexpr void advance(_InputIterator &__i, _Distance __n)
A generalization of pointer arithmetic.
constexpr _ForwardIterator __rotate(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last, forward_iterator_tag)
This is a helper function for the rotate algorithm.
constexpr void __move_median_to_first(_Iterator __result, _Iterator __a, _Iterator __b, _Iterator __c, _Compare __comp)
Swaps the median value of *__a, *__b and *__c under __comp to *__result.
constexpr _ForwardIterator __search_n_aux(_ForwardIterator __first, _ForwardIterator __last, _Integer __count, _UnaryPredicate __unary_pred, std::forward_iterator_tag)
void __move_merge_adaptive_backward(_BidirectionalIterator1 __first1, _BidirectionalIterator1 __last1, _BidirectionalIterator2 __first2, _BidirectionalIterator2 __last2, _BidirectionalIterator3 __result, _Compare __comp)
This is a helper function for the __merge_adaptive routines.
constexpr _InputIterator __find_if_not(_InputIterator __first, _InputIterator __last, _Predicate __pred)
Provided for stable_partition to use.
_OutputIterator __move_merge(_InputIterator __first1, _InputIterator __last1, _InputIterator __first2, _InputIterator __last2, _OutputIterator __result, _Compare __comp)
This is a helper function for the __merge_sort_loop routines.
constexpr _ForwardIterator __stable_partition_adaptive(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, _Distance __len, _Pointer __buffer, _Distance __buffer_size)
This is a helper function... Requires __first != __last and !__pred(*__first) and __len == distance(_...
Traits class for iterators.
constexpr iterator_type base() const noexcept(/*conditional */)
Struct holding two objects (or references) of arbitrary type.
_T1 first
The first member.
_T2 second
The second member.
Forward iterators support a superset of input iterator operations.
Bidirectional iterators support a superset of forward iterator operations.
Random-access iterators support a superset of bidirectional iterator operations.
Uniform discrete distribution for random numbers. A discrete random distribution on the range with e...