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
87 template<
typename _Iterator,
typename _Compare>
90 __move_median_to_first(_Iterator __result, _Iterator __a, _Iterator __b,
91 _Iterator __c, _Compare __comp)
93 if (__comp(*__a, *__b))
95 if (__comp(*__b, *__c))
96 std::iter_swap(__result, __b);
97 else if (__comp(*__a, *__c))
98 std::iter_swap(__result, __c);
100 std::iter_swap(__result, __a);
102 else if (__comp(*__a, *__c))
103 std::iter_swap(__result, __a);
104 else if (__comp(*__b, *__c))
105 std::iter_swap(__result, __c);
107 std::iter_swap(__result, __b);
111 template<
typename _InputIterator,
typename _Predicate>
113 inline _InputIterator
114 __find_if_not(_InputIterator __first, _InputIterator __last,
117 return std::__find_if(__first, __last,
118 __gnu_cxx::__ops::not1(__pred));
124 template<
typename _InputIterator,
typename _Predicate,
typename _Distance>
127 __find_if_not_n(_InputIterator __first, _Distance& __len, _Predicate __pred)
129 for (; __len; --__len, (void) ++__first)
130 if (!__pred(*__first))
139#pragma GCC diagnostic push
140#pragma GCC diagnostic ignored "-Wc++17-extensions"
141#pragma GCC diagnostic ignored "-Wc++20-extensions"
142 template<
typename _InputIterator,
typename _Function>
145 __for_each(_InputIterator __first, _InputIterator __last, _Function& __f)
147#if __cplusplus >= 201103L
148 if constexpr (__enable_for_each_segment<_InputIterator>)
150 std::__for_each_segment(__first, __last,
151 [&]<
typename _Iter>(_Iter __lfirst, _Iter __llast)
152 {
return std::__for_each(__lfirst, __llast, __f); });
158 for (; __first != __last; ++__first)
163#pragma GCC diagnostic pop
182 template<
typename _ForwardIterator,
typename _Integer,
183 typename _UnaryPredicate>
186 __search_n_aux(_ForwardIterator __first, _ForwardIterator __last,
187 _Integer __count, _UnaryPredicate __unary_pred,
188 std::forward_iterator_tag)
190 __first = std::__find_if(__first, __last, __unary_pred);
191 while (__first != __last)
195 _ForwardIterator __i = __first;
197 while (__i != __last && __n != 1 && __unary_pred(*__i))
206 __first = std::__find_if(++__i, __last, __unary_pred);
215 template<
typename _RandomAccessIter,
typename _Integer,
216 typename _UnaryPredicate>
219 __search_n_aux(_RandomAccessIter __first, _RandomAccessIter __last,
220 _Integer __count, _UnaryPredicate __unary_pred,
221 std::random_access_iterator_tag)
223 typedef typename std::iterator_traits<_RandomAccessIter>::difference_type
226 _DistanceType __tailSize = __last - __first;
227 _DistanceType __remainder = __count;
229 while (__remainder <= __tailSize)
231 __first += __remainder;
232 __tailSize -= __remainder;
235 _RandomAccessIter __backTrack = __first;
236 while (__unary_pred(*--__backTrack))
238 if (--__remainder == 0)
239 return __first - _DistanceType(__count);
241 __remainder = __count + 1 - (__first - __backTrack);
246 template<
typename _ForwardIterator,
typename _Integer,
247 typename _UnaryPredicate>
250 __search_n(_ForwardIterator __first, _ForwardIterator __last,
252 _UnaryPredicate __unary_pred)
258 return std::__find_if(__first, __last, __unary_pred);
260 return std::__search_n_aux(__first, __last, __count, __unary_pred,
261 std::__iter_concept_or_category(__first));
265 template<
typename _ForwardIterator1,
typename _ForwardIterator2,
266 typename _BinaryPredicate>
269 __find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
270 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
272 _BinaryPredicate __comp)
274 if (__first2 == __last2)
277 _ForwardIterator1 __result = __last1;
280 _ForwardIterator1 __new_result
281 = std::__search(__first1, __last1, __first2, __last2, __comp);
282 if (__new_result == __last1)
286 __result = __new_result;
287 __first1 = __new_result;
294 template<
typename _BidirectionalIterator1,
typename _BidirectionalIterator2,
295 typename _BinaryPredicate>
297 _BidirectionalIterator1
298 __find_end(_BidirectionalIterator1 __first1,
299 _BidirectionalIterator1 __last1,
300 _BidirectionalIterator2 __first2,
301 _BidirectionalIterator2 __last2,
303 _BinaryPredicate __comp)
306 __glibcxx_function_requires(_BidirectionalIteratorConcept<
307 _BidirectionalIterator1>)
308 __glibcxx_function_requires(_BidirectionalIteratorConcept<
309 _BidirectionalIterator2>)
314 _RevIterator1 __rlast1(__first1);
315 _RevIterator2 __rlast2(__first2);
316 _RevIterator1 __rresult = std::__search(_RevIterator1(__last1), __rlast1,
317 _RevIterator2(__last2), __rlast2,
320 if (__rresult == __rlast1)
324 _BidirectionalIterator1 __result = __rresult.
base();
359 template<
typename _ForwardIterator1,
typename _ForwardIterator2>
360 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
361 inline _ForwardIterator1
362 find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
363 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
366 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
367 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
368 __glibcxx_function_requires(_EqualOpConcept<
371 __glibcxx_requires_valid_range(__first1, __last1);
372 __glibcxx_requires_valid_range(__first2, __last2);
374 return std::__find_end(__first1, __last1, __first2, __last2,
375 std::__iter_concept_or_category(__first1),
376 std::__iter_concept_or_category(__first2),
377 __gnu_cxx::__ops::equal_to());
408 template<
typename _ForwardIterator1,
typename _ForwardIterator2,
409 typename _BinaryPredicate>
410 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
411 inline _ForwardIterator1
412 find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
413 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
414 _BinaryPredicate __comp)
417 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
418 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
419 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
422 __glibcxx_requires_valid_range(__first1, __last1);
423 __glibcxx_requires_valid_range(__first2, __last2);
425 return std::__find_end(__first1, __last1, __first2, __last2,
426 std::__iter_concept_or_category(__first1),
427 std::__iter_concept_or_category(__first2),
431#if __cplusplus >= 201103L
444 template<
typename _InputIterator,
typename _Predicate>
445 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
447 all_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
448 {
return __last == std::find_if_not(__first, __last, __pred); }
462 template<
typename _InputIterator,
typename _Predicate>
463 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
465 none_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
466 {
return __last == _GLIBCXX_STD_A::find_if(__first, __last, __pred); }
481 template<
typename _InputIterator,
typename _Predicate>
482 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
484 any_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
485 {
return !std::none_of(__first, __last, __pred); }
497 template<
typename _InputIterator,
typename _Predicate>
498 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
499 inline _InputIterator
500 find_if_not(_InputIterator __first, _InputIterator __last,
504 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
505 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
507 __glibcxx_requires_valid_range(__first, __last);
508 return std::__find_if_not(__first, __last, __pred);
521 template<
typename _InputIterator,
typename _Predicate>
522 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
524 is_partitioned(_InputIterator __first, _InputIterator __last,
527 __first = std::find_if_not(__first, __last, __pred);
528 if (__first == __last)
531 return std::none_of(__first, __last, __pred);
543 template<
typename _ForwardIterator,
typename _Predicate>
544 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
546 partition_point(_ForwardIterator __first, _ForwardIterator __last,
550 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
551 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
555 __glibcxx_requires_valid_range(__first, __last);
564 _DistanceType __half = __len >> 1;
565 _ForwardIterator __middle = __first;
567 if (__pred(*__middle))
571 __len = __len - __half - 1;
580 template<
typename _InputIterator,
typename _OutputIterator,
584 __remove_copy_if(_InputIterator __first, _InputIterator __last,
585 _OutputIterator __result, _Predicate __pred)
587 for (; __first != __last; ++__first)
588 if (!__pred(*__first))
590 *__result = *__first;
610 template<
typename _InputIterator,
typename _OutputIterator,
typename _Tp>
612 inline _OutputIterator
613 remove_copy(_InputIterator __first, _InputIterator __last,
614 _OutputIterator __result,
const _Tp& __value)
617 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
618 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
620 __glibcxx_function_requires(_EqualOpConcept<
622 __glibcxx_requires_valid_range(__first, __last);
624 return std::__remove_copy_if(__first, __last, __result,
625 __gnu_cxx::__ops::__equal_to(__value));
643 template<
typename _InputIterator,
typename _OutputIterator,
646 inline _OutputIterator
647 remove_copy_if(_InputIterator __first, _InputIterator __last,
648 _OutputIterator __result, _Predicate __pred)
651 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
652 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
654 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
656 __glibcxx_requires_valid_range(__first, __last);
658 return std::__remove_copy_if(__first, __last, __result, __pred);
661#if __cplusplus >= 201103L
677 template<
typename _InputIterator,
typename _OutputIterator,
681 copy_if(_InputIterator __first, _InputIterator __last,
682 _OutputIterator __result, _Predicate __pred)
685 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
686 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
688 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
690 __glibcxx_requires_valid_range(__first, __last);
692 for (; __first != __last; ++__first)
693 if (__pred(*__first))
695 *__result = *__first;
714 template<
typename _InputIterator,
typename _Size,
typename _OutputIterator>
716 inline _OutputIterator
717 copy_n(_InputIterator __first, _Size __n, _OutputIterator __result)
720 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
721 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
724 const auto __n2 = std::__size_to_integer(__n);
728 __glibcxx_requires_can_increment(__first, __n2);
729 __glibcxx_requires_can_increment(__result, __n2);
731 auto __res = std::__copy_n_a(std::__niter_base(__first), __n2,
732 std::__niter_base(__result),
true);
733 return std::__niter_wrap(__result,
std::move(__res));
751 template<
typename _InputIterator,
typename _OutputIterator1,
752 typename _OutputIterator2,
typename _Predicate>
755 partition_copy(_InputIterator __first, _InputIterator __last,
756 _OutputIterator1 __out_true, _OutputIterator2 __out_false,
760 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
761 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator1,
763 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator2,
765 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
767 __glibcxx_requires_valid_range(__first, __last);
769 for (; __first != __last; ++__first)
770 if (__pred(*__first))
772 *__out_true = *__first;
777 *__out_false = *__first;
802 template<
typename _ForwardIterator,
typename _Tp>
803 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
804 inline _ForwardIterator
805 remove(_ForwardIterator __first, _ForwardIterator __last,
809 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
811 __glibcxx_function_requires(_EqualOpConcept<
813 __glibcxx_requires_valid_range(__first, __last);
815 return std::__remove_if(__first, __last,
816 __gnu_cxx::__ops::__equal_to(__value));
836 template<
typename _ForwardIterator,
typename _Predicate>
837 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
838 inline _ForwardIterator
839 remove_if(_ForwardIterator __first, _ForwardIterator __last,
843 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
845 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
847 __glibcxx_requires_valid_range(__first, __last);
849 return std::__remove_if(__first, __last, __pred);
852 template<
typename _ForwardIterator,
typename _BinaryPredicate>
855 __adjacent_find(_ForwardIterator __first, _ForwardIterator __last,
856 _BinaryPredicate __binary_pred)
858 if (__first == __last)
860 _ForwardIterator __next = __first;
861 while (++__next != __last)
863 if (__binary_pred(*__first, *__next))
870 template<
typename _ForwardIterator,
typename _BinaryPredicate>
873 __unique(_ForwardIterator __first, _ForwardIterator __last,
874 _BinaryPredicate __binary_pred)
877 __first = std::__adjacent_find(__first, __last, __binary_pred);
878 if (__first == __last)
882 _ForwardIterator __dest = __first;
884 while (++__first != __last)
885 if (!__binary_pred(*__dest, *__first))
886 *++__dest = _GLIBCXX_MOVE(*__first);
904 template<
typename _ForwardIterator>
905 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
906 inline _ForwardIterator
907 unique(_ForwardIterator __first, _ForwardIterator __last)
910 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
912 __glibcxx_function_requires(_EqualityComparableConcept<
914 __glibcxx_requires_valid_range(__first, __last);
916 return std::__unique(__first, __last, __gnu_cxx::__ops::equal_to());
934 template<
typename _ForwardIterator,
typename _BinaryPredicate>
935 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
936 inline _ForwardIterator
937 unique(_ForwardIterator __first, _ForwardIterator __last,
938 _BinaryPredicate __binary_pred)
941 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
943 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
946 __glibcxx_requires_valid_range(__first, __last);
948 return std::__unique(__first, __last, __binary_pred);
958 template<
typename _ForwardIterator,
typename _OutputIterator,
959 typename _BinaryPredicate>
962 __unique_copy(_ForwardIterator __first, _ForwardIterator __last,
963 _OutputIterator __result, _BinaryPredicate __binary_pred,
964 forward_iterator_tag)
966 _ForwardIterator __prev = __first;
967 *__result = *__first;
968 while (++__first != __last)
969 if (!__binary_pred(*__prev, *__first))
971 *++__result = *__first;
979 template<
typename _InputIterator,
typename _OutputIterator,
980 typename _BinaryPredicate>
983 __unique_copy_1(_InputIterator __first, _InputIterator __last,
984 _OutputIterator __result, _BinaryPredicate __binary_pred,
988 _Val __value = *__first;
990 while (++__first != __last)
991 if (!__binary_pred(__value, *__first))
994 *++__result = __value;
1001 template<
typename _InputIterator,
typename _ForwardIterator,
1002 typename _BinaryPredicate>
1004 __unique_copy_1(_InputIterator __first, _InputIterator __last,
1005 _ForwardIterator __result, _BinaryPredicate __binary_pred,
1008 *__result = *__first;
1009 while (++__first != __last)
1010 if (!__binary_pred(*__result, *__first))
1011 *++__result = *__first;
1018 template<
typename _InputIterator,
typename _OutputIterator,
1019 typename _BinaryPredicate>
1020 _GLIBCXX20_CONSTEXPR
1022 __unique_copy(_InputIterator __first, _InputIterator __last,
1023 _OutputIterator __result, _BinaryPredicate __binary_pred,
1030 typedef typename _OutItTraits::iterator_category _Cat;
1032 const bool __same_type = __is_same(
typename _OutItTraits::value_type,
1033 typename _InItTraits::value_type);
1034 typedef __truth_type<__output_is_fwd && __same_type> __cmp_with_output;
1035 return std::__unique_copy_1(__first, __last, __result, __binary_pred,
1036 typename __cmp_with_output::__type());
1045 template<
typename _B
idirectionalIterator>
1046 _GLIBCXX20_CONSTEXPR
1048 __reverse(_BidirectionalIterator __first, _BidirectionalIterator __last,
1052 if (__first == __last || __first == --__last)
1056 std::iter_swap(__first, __last);
1066 template<
typename _RandomAccessIterator>
1067 _GLIBCXX20_CONSTEXPR
1069 __reverse(_RandomAccessIterator __first, _RandomAccessIterator __last,
1072 if (__first == __last)
1075 while (__first < __last)
1077 std::iter_swap(__first, __last);
1096 template<
typename _B
idirectionalIterator>
1097 _GLIBCXX20_CONSTEXPR
1099 reverse(_BidirectionalIterator __first, _BidirectionalIterator __last)
1102 __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
1103 _BidirectionalIterator>)
1104 __glibcxx_requires_valid_range(__first, __last);
1105 std::__reverse(__first, __last, std::__iterator_category(__first));
1124 template<
typename _B
idirectionalIterator,
typename _OutputIterator>
1125 _GLIBCXX20_CONSTEXPR
1127 reverse_copy(_BidirectionalIterator __first, _BidirectionalIterator __last,
1128 _OutputIterator __result)
1131 __glibcxx_function_requires(_BidirectionalIteratorConcept<
1132 _BidirectionalIterator>)
1133 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
1135 __glibcxx_requires_valid_range(__first, __last);
1137 while (__first != __last)
1140 *__result = *__last;
1152 template<
typename _Eucl
ideanRingElement>
1153 _GLIBCXX20_CONSTEXPR
1154 _EuclideanRingElement
1155 __gcd(_EuclideanRingElement __m, _EuclideanRingElement __n)
1159 _EuclideanRingElement __t = __m % __n;
1167_GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE(_V2)
1172 template<
typename _ForwardIterator>
1173 _GLIBCXX20_CONSTEXPR
1175 __rotate(_ForwardIterator __first,
1176 _ForwardIterator __middle,
1177 _ForwardIterator __last,
1180 if (__first == __middle)
1182 else if (__last == __middle)
1185 _ForwardIterator __first2 = __middle;
1188 std::iter_swap(__first, __first2);
1191 if (__first == __middle)
1192 __middle = __first2;
1194 while (__first2 != __last);
1196 _ForwardIterator __ret = __first;
1198 __first2 = __middle;
1200 while (__first2 != __last)
1202 std::iter_swap(__first, __first2);
1205 if (__first == __middle)
1206 __middle = __first2;
1207 else if (__first2 == __last)
1208 __first2 = __middle;
1214 template<
typename _B
idirectionalIterator>
1215 _GLIBCXX20_CONSTEXPR
1216 _BidirectionalIterator
1217 __rotate(_BidirectionalIterator __first,
1218 _BidirectionalIterator __middle,
1219 _BidirectionalIterator __last,
1223 __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
1224 _BidirectionalIterator>)
1226 if (__first == __middle)
1228 else if (__last == __middle)
1234 while (__first != __middle && __middle != __last)
1236 std::iter_swap(__first, --__last);
1240 if (__first == __middle)
1253 template<
typename _RandomAccessIterator>
1254 _GLIBCXX20_CONSTEXPR
1255 _RandomAccessIterator
1256 __rotate(_RandomAccessIterator __first,
1257 _RandomAccessIterator __middle,
1258 _RandomAccessIterator __last,
1262 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
1263 _RandomAccessIterator>)
1265 if (__first == __middle)
1267 else if (__last == __middle)
1275#if __cplusplus >= 201103L
1276 typedef typename make_unsigned<_Distance>::type _UDistance;
1278 typedef _Distance _UDistance;
1281 _Distance __n = __last - __first;
1282 _Distance __k = __middle - __first;
1284 if (__k == __n - __k)
1286 std::swap_ranges(__first, __middle, __middle);
1290 _RandomAccessIterator __p = __first;
1291 _RandomAccessIterator __ret = __first + (__last - __middle);
1295 if (__k < __n - __k)
1297 if (__is_pod(_ValueType) && __k == 1)
1299 _RandomAccessIterator __mid = __p + _Distance(__n - 1);
1300 _RandomAccessIterator __end = __mid;
1302 _ValueType __t = _GLIBCXX_MOVE(*__p);
1303 _GLIBCXX_MOVE3(__p + _Distance(1), __end, __p);
1304 *__mid = _GLIBCXX_MOVE(__t);
1307 _RandomAccessIterator __q = __p + __k;
1308 for (_Distance __i = 0; __i < __n - __k; ++ __i)
1310 std::iter_swap(__p, __q);
1314 __n =
static_cast<_UDistance
>(__n) %
static_cast<_UDistance
>(__k);
1317 std::swap(__n, __k);
1323 if (__is_pod(_ValueType) && __k == 1)
1325 _RandomAccessIterator __mid = __p + _Distance(__n - 1);
1326 _RandomAccessIterator __end = __mid;
1328 _ValueType __t = _GLIBCXX_MOVE(*__mid);
1329 _GLIBCXX_MOVE_BACKWARD3(__p, __mid, __end);
1330 *__p = _GLIBCXX_MOVE(__t);
1333 _RandomAccessIterator __q = __p + __n;
1335 for (_Distance __i = 0; __i < __n - __k; ++ __i)
1339 std::iter_swap(__p, __q);
1341 __n =
static_cast<_UDistance
>(__n) %
static_cast<_UDistance
>(__k);
1344 std::swap(__n, __k);
1374 template<
typename _ForwardIterator>
1375 _GLIBCXX20_CONSTEXPR
1376 inline _ForwardIterator
1377 rotate(_ForwardIterator __first, _ForwardIterator __middle,
1378 _ForwardIterator __last)
1381 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
1383 __glibcxx_requires_valid_range(__first, __middle);
1384 __glibcxx_requires_valid_range(__middle, __last);
1386 return std::__rotate(__first, __middle, __last,
1387 std::__iterator_category(__first));
1390_GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)
1412 template<
typename _ForwardIterator,
typename _OutputIterator>
1413 _GLIBCXX20_CONSTEXPR
1414 inline _OutputIterator
1415 rotate_copy(_ForwardIterator __first, _ForwardIterator __middle,
1416 _ForwardIterator __last, _OutputIterator __result)
1419 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
1420 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
1422 __glibcxx_requires_valid_range(__first, __middle);
1423 __glibcxx_requires_valid_range(__middle, __last);
1425 return std::copy(__first, __middle,
1426 std::copy(__middle, __last, __result));
1432 template<
typename _ForwardIterator,
typename _Predicate>
1433 _GLIBCXX20_CONSTEXPR
1435 __partition(_ForwardIterator __first, _ForwardIterator __last,
1436 _Predicate __pred, forward_iterator_tag)
1438 if (__first == __last)
1441 while (__pred(*__first))
1442 if (++__first == __last)
1445 _ForwardIterator __next = __first;
1447 while (++__next != __last)
1448 if (__pred(*__next))
1450 std::iter_swap(__first, __next);
1458 template<
typename _B
idirectionalIterator,
typename _Predicate>
1459 _GLIBCXX20_CONSTEXPR
1460 _BidirectionalIterator
1461 __partition(_BidirectionalIterator __first, _BidirectionalIterator __last,
1467 if (__first == __last)
1469 else if (__pred(*__first))
1475 if (__first == __last)
1477 else if (!
bool(__pred(*__last)))
1481 std::iter_swap(__first, __last);
1498 template<
typename _ForwardIterator,
typename _Pointer,
typename _Predicate,
1500 _GLIBCXX26_CONSTEXPR
1502 __stable_partition_adaptive(_ForwardIterator __first,
1503 _ForwardIterator __last,
1504 _Predicate __pred, _Distance __len,
1506 _Distance __buffer_size)
1511 if (__len <= __buffer_size)
1513 _ForwardIterator __result1 = __first;
1514 _Pointer __result2 = __buffer;
1519 *__result2 = _GLIBCXX_MOVE(*__first);
1522 for (; __first != __last; ++__first)
1523 if (__pred(*__first))
1525 *__result1 = _GLIBCXX_MOVE(*__first);
1530 *__result2 = _GLIBCXX_MOVE(*__first);
1534 _GLIBCXX_MOVE3(__buffer, __result2, __result1);
1538 _ForwardIterator __middle = __first;
1540 _ForwardIterator __left_split =
1541 std::__stable_partition_adaptive(__first, __middle, __pred,
1542 __len / 2, __buffer,
1547 _Distance __right_len = __len - __len / 2;
1548 _ForwardIterator __right_split =
1549 std::__find_if_not_n(__middle, __right_len, __pred);
1553 std::__stable_partition_adaptive(__right_split, __last, __pred,
1555 __buffer, __buffer_size);
1557 return std::rotate(__left_split, __middle, __right_split);
1560 template<
typename _ForwardIterator,
typename _Predicate>
1561 _GLIBCXX26_CONSTEXPR
1563 __stable_partition(_ForwardIterator __first, _ForwardIterator __last,
1566 __first = std::__find_if_not(__first, __last, __pred);
1568 if (__first == __last)
1578#if __glibcxx_constexpr_algorithms >= 202306L
1583 return std::__stable_partition_adaptive(__first, __last, __pred,
1591 __buf(__first, __len);
1593 std::__stable_partition_adaptive(__first, __last, __pred,
1596 _DistanceType(__buf.size()));
1617 template<
typename _ForwardIterator,
typename _Predicate>
1618 _GLIBCXX26_CONSTEXPR
1619 inline _ForwardIterator
1620 stable_partition(_ForwardIterator __first, _ForwardIterator __last,
1624 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
1626 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
1628 __glibcxx_requires_valid_range(__first, __last);
1630 return std::__stable_partition(__first, __last, __pred);
1637 template<
typename _RandomAccessIterator,
typename _Compare>
1638 _GLIBCXX20_CONSTEXPR
1640 __heap_select(_RandomAccessIterator __first,
1641 _RandomAccessIterator __middle,
1642 _RandomAccessIterator __last, _Compare __comp)
1644 std::__make_heap(__first, __middle, __comp);
1645 for (_RandomAccessIterator __i = __middle; __i < __last; ++__i)
1646 if (__comp(*__i, *__first))
1647 std::__pop_heap(__first, __middle, __i, __comp);
1652 template<
typename _InputIterator,
typename _RandomAccessIterator,
1654 _GLIBCXX20_CONSTEXPR
1655 _RandomAccessIterator
1656 __partial_sort_copy(_InputIterator __first, _InputIterator __last,
1657 _RandomAccessIterator __result_first,
1658 _RandomAccessIterator __result_last,
1664 typedef typename _RItTraits::difference_type _DistanceType;
1666 if (__result_first == __result_last)
1667 return __result_last;
1668 _RandomAccessIterator __result_real_last = __result_first;
1669 while (__first != __last && __result_real_last != __result_last)
1671 *__result_real_last = *__first;
1672 ++__result_real_last;
1676 std::__make_heap(__result_first, __result_real_last, __comp);
1677 while (__first != __last)
1679 if (__comp(*__first, *__result_first))
1680 std::__adjust_heap(__result_first, _DistanceType(0),
1681 _DistanceType(__result_real_last
1683 _InputValueType(*__first), __comp);
1686 std::__sort_heap(__result_first, __result_real_last, __comp);
1687 return __result_real_last;
1710 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)
1717#ifdef _GLIBCXX_CONCEPT_CHECKS
1725 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
1726 __glibcxx_function_requires(_ConvertibleConcept<_InputValueType,
1728 __glibcxx_function_requires(_LessThanOpConcept<_InputValueType,
1730 __glibcxx_function_requires(_LessThanComparableConcept<_OutputValueType>)
1731 __glibcxx_requires_valid_range(__first, __last);
1732 __glibcxx_requires_irreflexive(__first, __last);
1733 __glibcxx_requires_valid_range(__result_first, __result_last);
1735 return std::__partial_sort_copy(__first, __last,
1736 __result_first, __result_last,
1737 __gnu_cxx::__ops::less());
1760 template<
typename _InputIterator,
typename _RandomAccessIterator,
1762 _GLIBCXX20_CONSTEXPR
1763 inline _RandomAccessIterator
1764 partial_sort_copy(_InputIterator __first, _InputIterator __last,
1765 _RandomAccessIterator __result_first,
1766 _RandomAccessIterator __result_last,
1769#ifdef _GLIBCXX_CONCEPT_CHECKS
1777 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
1778 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
1779 _RandomAccessIterator>)
1780 __glibcxx_function_requires(_ConvertibleConcept<_InputValueType,
1782 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
1783 _InputValueType, _OutputValueType>)
1784 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
1785 _OutputValueType, _OutputValueType>)
1786 __glibcxx_requires_valid_range(__first, __last);
1787 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
1788 __glibcxx_requires_valid_range(__result_first, __result_last);
1790 return std::__partial_sort_copy(__first, __last,
1791 __result_first, __result_last,
1798 template<
typename _RandomAccessIterator,
typename _Compare>
1799 _GLIBCXX20_CONSTEXPR
1801 __unguarded_linear_insert(_RandomAccessIterator __last,
1804 typename iterator_traits<_RandomAccessIterator>::value_type
1805 __val = _GLIBCXX_MOVE(*__last);
1806 _RandomAccessIterator __next = __last;
1808 while (__comp(__val, *__next))
1810 *__last = _GLIBCXX_MOVE(*__next);
1814 *__last = _GLIBCXX_MOVE(__val);
1818 template<
typename _RandomAccessIterator,
typename _Compare>
1819 _GLIBCXX20_CONSTEXPR
1821 __insertion_sort(_RandomAccessIterator __first,
1822 _RandomAccessIterator __last, _Compare __comp)
1824 if (__first == __last)
1828 typedef typename _IterTraits::difference_type _Dist;
1830 for (_RandomAccessIterator __i = __first + _Dist(1); __i != __last; ++__i)
1832 if (__comp(*__i, *__first))
1834 typename _IterTraits::value_type __val = _GLIBCXX_MOVE(*__i);
1835 _GLIBCXX_MOVE_BACKWARD3(__first, __i, __i + _Dist(1));
1836 *__first = _GLIBCXX_MOVE(__val);
1839 std::__unguarded_linear_insert(__i, __comp);
1844 template<
typename _RandomAccessIterator,
typename _Compare>
1845 _GLIBCXX20_CONSTEXPR
1847 __unguarded_insertion_sort(_RandomAccessIterator __first,
1848 _RandomAccessIterator __last, _Compare __comp)
1850 for (_RandomAccessIterator __i = __first; __i != __last; ++__i)
1851 std::__unguarded_linear_insert(__i, __comp);
1858 enum { _S_threshold = 16 };
1861 template<
typename _RandomAccessIterator,
typename _Compare>
1862 _GLIBCXX20_CONSTEXPR
1864 __final_insertion_sort(_RandomAccessIterator __first,
1865 _RandomAccessIterator __last, _Compare __comp)
1868 __threshold = _S_threshold;
1870 if (__last - __first > __threshold)
1872 std::__insertion_sort(__first, __first + __threshold, __comp);
1873 std::__unguarded_insertion_sort(__first + __threshold, __last,
1877 std::__insertion_sort(__first, __last, __comp);
1881 template<
typename _RandomAccessIterator,
typename _Compare>
1882 _GLIBCXX20_CONSTEXPR
1883 _RandomAccessIterator
1884 __unguarded_partition(_RandomAccessIterator __first,
1885 _RandomAccessIterator __last,
1886 _RandomAccessIterator __pivot, _Compare __comp)
1890 while (__comp(*__first, *__pivot))
1893 while (__comp(*__pivot, *__last))
1895 if (!(__first < __last))
1897 std::iter_swap(__first, __last);
1903 template<
typename _RandomAccessIterator,
typename _Compare>
1904 _GLIBCXX20_CONSTEXPR
1905 inline _RandomAccessIterator
1906 __unguarded_partition_pivot(_RandomAccessIterator __first,
1907 _RandomAccessIterator __last, _Compare __comp)
1910 typedef typename _IterTraits::difference_type _Dist;
1912 _RandomAccessIterator __mid = __first + _Dist((__last - __first) / 2);
1913 _RandomAccessIterator __second = __first + _Dist(1);
1914 std::__move_median_to_first(__first, __second, __mid, __last - _Dist(1),
1916 return std::__unguarded_partition(__second, __last, __first, __comp);
1919 template<
typename _RandomAccessIterator,
typename _Compare>
1920 _GLIBCXX20_CONSTEXPR
1922 __partial_sort(_RandomAccessIterator __first,
1923 _RandomAccessIterator __middle,
1924 _RandomAccessIterator __last,
1927 std::__heap_select(__first, __middle, __last, __comp);
1928 std::__sort_heap(__first, __middle, __comp);
1932 template<
typename _RandomAccessIterator,
typename _Size,
typename _Compare>
1933 _GLIBCXX20_CONSTEXPR
1935 __introsort_loop(_RandomAccessIterator __first,
1936 _RandomAccessIterator __last,
1937 _Size __depth_limit, _Compare __comp)
1939 while (__last - __first >
int(_S_threshold))
1941 if (__depth_limit == 0)
1943 std::__partial_sort(__first, __last, __last, __comp);
1947 _RandomAccessIterator __cut =
1948 std::__unguarded_partition_pivot(__first, __last, __comp);
1949 std::__introsort_loop(__cut, __last, __depth_limit, __comp);
1956 template<
typename _RandomAccessIterator,
typename _Compare>
1957 _GLIBCXX20_CONSTEXPR
1959 __sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
1962 if (__first != __last)
1964 std::__introsort_loop(__first, __last,
1967 std::__final_insertion_sort(__first, __last, __comp);
1971 template<
typename _RandomAccessIterator,
typename _Size,
typename _Compare>
1972 _GLIBCXX20_CONSTEXPR
1974 __introselect(_RandomAccessIterator __first, _RandomAccessIterator __nth,
1975 _RandomAccessIterator __last, _Size __depth_limit,
1978 _RandomAccessIterator __after_nth = __nth;
1981 while (__last - __first > 3)
1983 if (__depth_limit == 0)
1985 std::__heap_select(__first, __after_nth, __last, __comp);
1987 std::iter_swap(__first, __nth);
1991 _RandomAccessIterator __cut =
1992 std::__unguarded_partition_pivot(__first, __last, __comp);
1998 std::__insertion_sort(__first, __last, __comp);
2022 template<
typename _ForwardIterator,
typename _Tp,
typename _Compare>
2023 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
2024 inline _ForwardIterator
2025 lower_bound(_ForwardIterator __first, _ForwardIterator __last,
2026 const _Tp& __val, _Compare __comp)
2029 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2030 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2032 __glibcxx_requires_partitioned_lower_pred(__first, __last,
2035 return std::__lower_bound(__first, __last, __val, __comp);
2040 template<
typename _ForwardIterator,
typename _Tp,
typename _Compare>
2041 _GLIBCXX20_CONSTEXPR
2043 __upper_bound(_ForwardIterator __first, _ForwardIterator __last,
2044 const _Tp& __val, _Compare __comp)
2046 typedef typename iterator_traits<_ForwardIterator>::difference_type
2053 _DistanceType __half = __len >> 1;
2054 _ForwardIterator __middle = __first;
2056 if (__comp(__val, *__middle))
2062 __len = __len - __half - 1;
2080 template<
typename _ForwardIterator,
typename _Tp>
2081 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
2082 inline _ForwardIterator
2083 upper_bound(_ForwardIterator __first, _ForwardIterator __last,
2087 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2088 __glibcxx_function_requires(_LessThanOpConcept<
2090 __glibcxx_requires_partitioned_upper(__first, __last, __val);
2092 return std::__upper_bound(__first, __last, __val,
2093 __gnu_cxx::__ops::less());
2111 template<
typename _ForwardIterator,
typename _Tp,
typename _Compare>
2112 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
2113 inline _ForwardIterator
2114 upper_bound(_ForwardIterator __first, _ForwardIterator __last,
2115 const _Tp& __val, _Compare __comp)
2118 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2119 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2121 __glibcxx_requires_partitioned_upper_pred(__first, __last,
2124 return std::__upper_bound(__first, __last, __val, __comp);
2128 template<
typename _ForwardIterator,
typename _Tp,
typename _Compare>
2129 _GLIBCXX20_CONSTEXPR
2131 __equal_range(_ForwardIterator __first, _ForwardIterator __last,
2132 const _Tp& __val, _Compare __comp)
2134 typedef typename iterator_traits<_ForwardIterator>::difference_type
2141 _DistanceType __half = __len >> 1;
2142 _ForwardIterator __middle = __first;
2144 if (__comp(*__middle, __val))
2148 __len = __len - __half - 1;
2150 else if (__comp(__val, *__middle))
2154 _ForwardIterator __left
2155 = std::__lower_bound(__first, __middle, __val, __comp);
2157 _ForwardIterator __right
2158 = std::__upper_bound(++__middle, __first, __val, __comp);
2183 template<
typename _ForwardIterator,
typename _Tp>
2184 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
2186 equal_range(_ForwardIterator __first, _ForwardIterator __last,
2190 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2191 __glibcxx_function_requires(_LessThanOpConcept<
2193 __glibcxx_function_requires(_LessThanOpConcept<
2195 __glibcxx_requires_partitioned_lower(__first, __last, __val);
2196 __glibcxx_requires_partitioned_upper(__first, __last, __val);
2198 return std::__equal_range(__first, __last, __val,
2199 __gnu_cxx::__ops::less());
2219 template<
typename _ForwardIterator,
typename _Tp,
typename _Compare>
2220 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
2222 equal_range(_ForwardIterator __first, _ForwardIterator __last,
2223 const _Tp& __val, _Compare __comp)
2226 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2227 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2229 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2231 __glibcxx_requires_partitioned_lower_pred(__first, __last,
2233 __glibcxx_requires_partitioned_upper_pred(__first, __last,
2236 return std::__equal_range(__first, __last, __val, __comp);
2250 template<
typename _ForwardIterator,
typename _Tp>
2251 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
2253 binary_search(_ForwardIterator __first, _ForwardIterator __last,
2257 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2258 __glibcxx_function_requires(_LessThanOpConcept<
2260 __glibcxx_requires_partitioned_lower(__first, __last, __val);
2261 __glibcxx_requires_partitioned_upper(__first, __last, __val);
2263 _ForwardIterator __i
2264 = std::__lower_bound(__first, __last, __val, __gnu_cxx::__ops::less());
2265 return __i != __last && !(__val < *__i);
2283 template<
typename _ForwardIterator,
typename _Tp,
typename _Compare>
2284 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
2286 binary_search(_ForwardIterator __first, _ForwardIterator __last,
2287 const _Tp& __val, _Compare __comp)
2290 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2291 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2293 __glibcxx_requires_partitioned_lower_pred(__first, __last,
2295 __glibcxx_requires_partitioned_upper_pred(__first, __last,
2298 _ForwardIterator __i
2299 = std::__lower_bound(__first, __last, __val, __comp);
2300 return __i != __last && !bool(__comp(__val, *__i));
2308 template<
typename _InputIterator1,
typename _InputIterator2,
2309 typename _OutputIterator,
typename _Compare>
2311 __move_merge_adaptive(_InputIterator1 __first1, _InputIterator1 __last1,
2312 _InputIterator2 __first2, _InputIterator2 __last2,
2313 _OutputIterator __result, _Compare __comp)
2315 while (__first1 != __last1 && __first2 != __last2)
2317 if (__comp(*__first2, *__first1))
2319 *__result = _GLIBCXX_MOVE(*__first2);
2324 *__result = _GLIBCXX_MOVE(*__first1);
2329 if (__first1 != __last1)
2330 _GLIBCXX_MOVE3(__first1, __last1, __result);
2334 template<
typename _BidirectionalIterator1,
typename _BidirectionalIterator2,
2335 typename _BidirectionalIterator3,
typename _Compare>
2337 __move_merge_adaptive_backward(_BidirectionalIterator1 __first1,
2338 _BidirectionalIterator1 __last1,
2339 _BidirectionalIterator2 __first2,
2340 _BidirectionalIterator2 __last2,
2341 _BidirectionalIterator3 __result,
2344 if (__first1 == __last1)
2346 _GLIBCXX_MOVE_BACKWARD3(__first2, __last2, __result);
2349 else if (__first2 == __last2)
2356 if (__comp(*__last2, *__last1))
2358 *--__result = _GLIBCXX_MOVE(*__last1);
2359 if (__first1 == __last1)
2361 _GLIBCXX_MOVE_BACKWARD3(__first2, ++__last2, __result);
2368 *--__result = _GLIBCXX_MOVE(*__last2);
2369 if (__first2 == __last2)
2377 template<
typename _BidirectionalIterator1,
typename _BidirectionalIterator2,
2379 _BidirectionalIterator1
2380 __rotate_adaptive(_BidirectionalIterator1 __first,
2381 _BidirectionalIterator1 __middle,
2382 _BidirectionalIterator1 __last,
2383 _Distance __len1, _Distance __len2,
2384 _BidirectionalIterator2 __buffer,
2385 _Distance __buffer_size)
2387 _BidirectionalIterator2 __buffer_end;
2388 if (__len1 > __len2 && __len2 <= __buffer_size)
2392 __buffer_end = _GLIBCXX_MOVE3(__middle, __last, __buffer);
2393 _GLIBCXX_MOVE_BACKWARD3(__first, __middle, __last);
2394 return _GLIBCXX_MOVE3(__buffer, __buffer_end, __first);
2399 else if (__len1 <= __buffer_size)
2403 __buffer_end = _GLIBCXX_MOVE3(__first, __middle, __buffer);
2404 _GLIBCXX_MOVE3(__middle, __last, __first);
2405 return _GLIBCXX_MOVE_BACKWARD3(__buffer, __buffer_end, __last);
2411 return std::rotate(__first, __middle, __last);
2415 template<
typename _BidirectionalIterator,
typename _Distance,
2416 typename _Pointer,
typename _Compare>
2418 __merge_adaptive(_BidirectionalIterator __first,
2419 _BidirectionalIterator __middle,
2420 _BidirectionalIterator __last,
2421 _Distance __len1, _Distance __len2,
2422 _Pointer __buffer, _Compare __comp)
2424 if (__len1 <= __len2)
2426 _Pointer __buffer_end = _GLIBCXX_MOVE3(__first, __middle, __buffer);
2427 std::__move_merge_adaptive(__buffer, __buffer_end, __middle, __last,
2432 _Pointer __buffer_end = _GLIBCXX_MOVE3(__middle, __last, __buffer);
2433 std::__move_merge_adaptive_backward(__first, __middle, __buffer,
2434 __buffer_end, __last, __comp);
2438 template<
typename _BidirectionalIterator,
typename _Distance,
2439 typename _Pointer,
typename _Compare>
2441 __merge_adaptive_resize(_BidirectionalIterator __first,
2442 _BidirectionalIterator __middle,
2443 _BidirectionalIterator __last,
2444 _Distance __len1, _Distance __len2,
2445 _Pointer __buffer, _Distance __buffer_size,
2448 if (__len1 <= __buffer_size || __len2 <= __buffer_size)
2449 std::__merge_adaptive(__first, __middle, __last,
2450 __len1, __len2, __buffer, __comp);
2453 _BidirectionalIterator __first_cut = __first;
2454 _BidirectionalIterator __second_cut = __middle;
2455 _Distance __len11 = 0;
2456 _Distance __len22 = 0;
2457 if (__len1 > __len2)
2459 __len11 = __len1 / 2;
2462 = std::__lower_bound(__middle, __last, *__first_cut, __comp);
2467 __len22 = __len2 / 2;
2470 = std::__upper_bound(__first, __middle, *__second_cut, __comp);
2474 _BidirectionalIterator __new_middle
2475 = std::__rotate_adaptive(__first_cut, __middle, __second_cut,
2476 _Distance(__len1 - __len11), __len22,
2477 __buffer, __buffer_size);
2478 std::__merge_adaptive_resize(__first, __first_cut, __new_middle,
2480 __buffer, __buffer_size, __comp);
2481 std::__merge_adaptive_resize(__new_middle, __second_cut, __last,
2482 _Distance(__len1 - __len11),
2483 _Distance(__len2 - __len22),
2484 __buffer, __buffer_size, __comp);
2489 template<
typename _BidirectionalIterator,
typename _Distance,
2491 _GLIBCXX26_CONSTEXPR
2493 __merge_without_buffer(_BidirectionalIterator __first,
2494 _BidirectionalIterator __middle,
2495 _BidirectionalIterator __last,
2496 _Distance __len1, _Distance __len2,
2499 if (__len1 == 0 || __len2 == 0)
2502 if (__len1 + __len2 == 2)
2504 if (__comp(*__middle, *__first))
2505 std::iter_swap(__first, __middle);
2509 _BidirectionalIterator __first_cut = __first;
2510 _BidirectionalIterator __second_cut = __middle;
2511 _Distance __len11 = 0;
2512 _Distance __len22 = 0;
2513 if (__len1 > __len2)
2515 __len11 = __len1 / 2;
2518 = std::__lower_bound(__middle, __last, *__first_cut, __comp);
2523 __len22 = __len2 / 2;
2526 = std::__upper_bound(__first, __middle, *__second_cut, __comp);
2530 _BidirectionalIterator __new_middle
2531 = std::rotate(__first_cut, __middle, __second_cut);
2532 std::__merge_without_buffer(__first, __first_cut, __new_middle,
2533 __len11, __len22, __comp);
2534 std::__merge_without_buffer(__new_middle, __second_cut, __last,
2535 __len1 - __len11, __len2 - __len22, __comp);
2538 template<
typename _B
idirectionalIterator,
typename _Compare>
2539 _GLIBCXX26_CONSTEXPR
2541 __inplace_merge(_BidirectionalIterator __first,
2542 _BidirectionalIterator __middle,
2543 _BidirectionalIterator __last,
2551 if (__first == __middle || __middle == __last)
2554 const _DistanceType __len1 =
std::distance(__first, __middle);
2555 const _DistanceType __len2 =
std::distance(__middle, __last);
2558# if __glibcxx_constexpr_algorithms >= 202306L
2560 return std::__merge_without_buffer
2561 (__first, __middle, __last, __len1, __len2, __comp);
2567 _TmpBuf __buf(__first,
std::min(__len1, __len2));
2569 if (__builtin_expect(__buf.size() == __buf._M_requested_size(),
true))
2570 std::__merge_adaptive
2571 (__first, __middle, __last, __len1, __len2, __buf.begin(), __comp);
2572 else if (__builtin_expect(__buf.begin() == 0,
false))
2573 std::__merge_without_buffer
2574 (__first, __middle, __last, __len1, __len2, __comp);
2576 std::__merge_adaptive_resize
2577 (__first, __middle, __last, __len1, __len2, __buf.begin(),
2578 _DistanceType(__buf.size()), __comp);
2580 std::__merge_without_buffer
2581 (__first, __middle, __last, __len1, __len2, __comp);
2603 template<
typename _B
idirectionalIterator>
2604 _GLIBCXX26_CONSTEXPR
2606 inplace_merge(_BidirectionalIterator __first,
2607 _BidirectionalIterator __middle,
2608 _BidirectionalIterator __last)
2611 __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
2612 _BidirectionalIterator>)
2613 __glibcxx_function_requires(_LessThanComparableConcept<
2615 __glibcxx_requires_sorted(__first, __middle);
2616 __glibcxx_requires_sorted(__middle, __last);
2617 __glibcxx_requires_irreflexive(__first, __last);
2619 std::__inplace_merge(__first, __middle, __last,
2620 __gnu_cxx::__ops::less());
2644 template<
typename _B
idirectionalIterator,
typename _Compare>
2645 _GLIBCXX26_CONSTEXPR
2647 inplace_merge(_BidirectionalIterator __first,
2648 _BidirectionalIterator __middle,
2649 _BidirectionalIterator __last,
2653 __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
2654 _BidirectionalIterator>)
2655 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2658 __glibcxx_requires_sorted_pred(__first, __middle, __comp);
2659 __glibcxx_requires_sorted_pred(__middle, __last, __comp);
2660 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
2662 std::__inplace_merge(__first, __middle, __last, __comp);
2668 template<
typename _InputIterator,
typename _OutputIterator,
2671 __move_merge(_InputIterator __first1, _InputIterator __last1,
2672 _InputIterator __first2, _InputIterator __last2,
2673 _OutputIterator __result, _Compare __comp)
2675 while (__first1 != __last1 && __first2 != __last2)
2677 if (__comp(*__first2, *__first1))
2679 *__result = _GLIBCXX_MOVE(*__first2);
2684 *__result = _GLIBCXX_MOVE(*__first1);
2689 return _GLIBCXX_MOVE3(__first2, __last2,
2690 _GLIBCXX_MOVE3(__first1, __last1,
2694 template<
typename _RandomAccessIterator1,
typename _RandomAccessIterator2,
2695 typename _Distance,
typename _Compare>
2697 __merge_sort_loop(_RandomAccessIterator1 __first,
2698 _RandomAccessIterator1 __last,
2699 _RandomAccessIterator2 __result, _Distance __step_size,
2702 const _Distance __two_step = 2 * __step_size;
2704 while (__last - __first >= __two_step)
2706 __result = std::__move_merge(__first, __first + __step_size,
2707 __first + __step_size,
2708 __first + __two_step,
2710 __first += __two_step;
2712 __step_size =
std::min(_Distance(__last - __first), __step_size);
2714 std::__move_merge(__first, __first + __step_size,
2715 __first + __step_size, __last, __result, __comp);
2718 template<
typename _RandomAccessIterator,
typename _Distance,
2720 _GLIBCXX20_CONSTEXPR
2722 __chunk_insertion_sort(_RandomAccessIterator __first,
2723 _RandomAccessIterator __last,
2724 _Distance __chunk_size, _Compare __comp)
2726 while (__last - __first >= __chunk_size)
2728 std::__insertion_sort(__first, __first + __chunk_size, __comp);
2729 __first += __chunk_size;
2731 std::__insertion_sort(__first, __last, __comp);
2734 enum { _S_chunk_size = 7 };
2736 template<
typename _RandomAccessIterator,
typename _Po
inter,
typename _Compare>
2738 __merge_sort_with_buffer(_RandomAccessIterator __first,
2739 _RandomAccessIterator __last,
2740 _Pointer __buffer, _Compare __comp)
2745 const _Distance __len = __last - __first;
2746 const _Pointer __buffer_last = __buffer + __len;
2748 _Distance __step_size = _S_chunk_size;
2749 std::__chunk_insertion_sort(__first, __last, __step_size, __comp);
2751 while (__step_size < __len)
2753 std::__merge_sort_loop(__first, __last, __buffer,
2754 __step_size, __comp);
2756 std::__merge_sort_loop(__buffer, __buffer_last, __first,
2757 __step_size, __comp);
2762 template<
typename _RandomAccessIterator,
typename _Po
inter,
typename _Compare>
2764 __stable_sort_adaptive(_RandomAccessIterator __first,
2765 _RandomAccessIterator __middle,
2766 _RandomAccessIterator __last,
2767 _Pointer __buffer, _Compare __comp)
2769 std::__merge_sort_with_buffer(__first, __middle, __buffer, __comp);
2770 std::__merge_sort_with_buffer(__middle, __last, __buffer, __comp);
2772 std::__merge_adaptive(__first, __middle, __last,
2773 __middle - __first, __last - __middle,
2777 template<
typename _RandomAccessIterator,
typename _Pointer,
2778 typename _Distance,
typename _Compare>
2780 __stable_sort_adaptive_resize(_RandomAccessIterator __first,
2781 _RandomAccessIterator __last,
2782 _Pointer __buffer, _Distance __buffer_size,
2785 const _Distance __len = (__last - __first + 1) / 2;
2786 const _RandomAccessIterator __middle = __first + __len;
2787 if (__len > __buffer_size)
2789 std::__stable_sort_adaptive_resize(__first, __middle, __buffer,
2790 __buffer_size, __comp);
2791 std::__stable_sort_adaptive_resize(__middle, __last, __buffer,
2792 __buffer_size, __comp);
2793 std::__merge_adaptive_resize(__first, __middle, __last,
2794 _Distance(__middle - __first),
2795 _Distance(__last - __middle),
2796 __buffer, __buffer_size,
2800 std::__stable_sort_adaptive(__first, __middle, __last,
2805 template<
typename _RandomAccessIterator,
typename _Compare>
2806 _GLIBCXX26_CONSTEXPR
2808 __inplace_stable_sort(_RandomAccessIterator __first,
2809 _RandomAccessIterator __last, _Compare __comp)
2811 if (__last - __first < 15)
2813 std::__insertion_sort(__first, __last, __comp);
2816 _RandomAccessIterator __middle = __first + (__last - __first) / 2;
2817 std::__inplace_stable_sort(__first, __middle, __comp);
2818 std::__inplace_stable_sort(__middle, __last, __comp);
2819 std::__merge_without_buffer(__first, __middle, __last,
2832 template<
typename _InputIterator1,
typename _InputIterator2,
2834 _GLIBCXX20_CONSTEXPR
2836 __includes(_InputIterator1 __first1, _InputIterator1 __last1,
2837 _InputIterator2 __first2, _InputIterator2 __last2,
2840 while (__first1 != __last1 && __first2 != __last2)
2842 if (__comp(*__first2, *__first1))
2844 if (!__comp(*__first1, *__first2))
2849 return __first2 == __last2;
2871 template<
typename _InputIterator1,
typename _InputIterator2>
2872 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
2874 includes(_InputIterator1 __first1, _InputIterator1 __last1,
2875 _InputIterator2 __first2, _InputIterator2 __last2)
2878 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
2879 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
2880 __glibcxx_function_requires(_LessThanOpConcept<
2883 __glibcxx_function_requires(_LessThanOpConcept<
2886 __glibcxx_requires_sorted_set(__first1, __last1, __first2);
2887 __glibcxx_requires_sorted_set(__first2, __last2, __first1);
2888 __glibcxx_requires_irreflexive2(__first1, __last1);
2889 __glibcxx_requires_irreflexive2(__first2, __last2);
2891 return std::__includes(__first1, __last1, __first2, __last2,
2892 __gnu_cxx::__ops::less());
2916 template<
typename _InputIterator1,
typename _InputIterator2,
2918 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
2920 includes(_InputIterator1 __first1, _InputIterator1 __last1,
2921 _InputIterator2 __first2, _InputIterator2 __last2,
2925 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
2926 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
2927 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2930 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2933 __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
2934 __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
2935 __glibcxx_requires_irreflexive_pred2(__first1, __last1, __comp);
2936 __glibcxx_requires_irreflexive_pred2(__first2, __last2, __comp);
2938 return std::__includes(__first1, __last1, __first2, __last2, __comp);
2952 template<
typename _B
idirectionalIterator,
typename _Compare>
2953 _GLIBCXX20_CONSTEXPR
2955 __next_permutation(_BidirectionalIterator __first,
2956 _BidirectionalIterator __last, _Compare __comp)
2958 if (__first == __last)
2960 _BidirectionalIterator __i = __first;
2969 _BidirectionalIterator __ii = __i;
2971 if (__comp(*__i, *__ii))
2973 _BidirectionalIterator __j = __last;
2974 while (!__comp(*__i, *--__j))
2976 std::iter_swap(__i, __j);
2977 std::__reverse(__ii, __last,
2978 std::__iterator_category(__first));
2983 std::__reverse(__first, __last,
2984 std::__iterator_category(__first));
3003 template<
typename _B
idirectionalIterator>
3004 _GLIBCXX20_CONSTEXPR
3006 next_permutation(_BidirectionalIterator __first,
3007 _BidirectionalIterator __last)
3010 __glibcxx_function_requires(_BidirectionalIteratorConcept<
3011 _BidirectionalIterator>)
3012 __glibcxx_function_requires(_LessThanComparableConcept<
3014 __glibcxx_requires_valid_range(__first, __last);
3015 __glibcxx_requires_irreflexive(__first, __last);
3017 return std::__next_permutation(__first, __last, __gnu_cxx::__ops::less());
3035 template<
typename _B
idirectionalIterator,
typename _Compare>
3036 _GLIBCXX20_CONSTEXPR
3038 next_permutation(_BidirectionalIterator __first,
3039 _BidirectionalIterator __last, _Compare __comp)
3042 __glibcxx_function_requires(_BidirectionalIteratorConcept<
3043 _BidirectionalIterator>)
3044 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
3047 __glibcxx_requires_valid_range(__first, __last);
3048 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
3050 return std::__next_permutation(__first, __last, __comp);
3054 template<
typename _B
idirectionalIterator,
typename _Compare>
3055 _GLIBCXX20_CONSTEXPR
3057 __prev_permutation(_BidirectionalIterator __first,
3058 _BidirectionalIterator __last, _Compare __comp)
3060 if (__first == __last)
3062 _BidirectionalIterator __i = __first;
3071 _BidirectionalIterator __ii = __i;
3073 if (__comp(*__ii, *__i))
3075 _BidirectionalIterator __j = __last;
3076 while (!__comp(*--__j, *__i))
3078 std::iter_swap(__i, __j);
3079 std::__reverse(__ii, __last,
3080 std::__iterator_category(__first));
3085 std::__reverse(__first, __last,
3086 std::__iterator_category(__first));
3106 template<
typename _B
idirectionalIterator>
3107 _GLIBCXX20_CONSTEXPR
3109 prev_permutation(_BidirectionalIterator __first,
3110 _BidirectionalIterator __last)
3113 __glibcxx_function_requires(_BidirectionalIteratorConcept<
3114 _BidirectionalIterator>)
3115 __glibcxx_function_requires(_LessThanComparableConcept<
3117 __glibcxx_requires_valid_range(__first, __last);
3118 __glibcxx_requires_irreflexive(__first, __last);
3120 return std::__prev_permutation(__first, __last, __gnu_cxx::__ops::less());
3138 template<
typename _B
idirectionalIterator,
typename _Compare>
3139 _GLIBCXX20_CONSTEXPR
3141 prev_permutation(_BidirectionalIterator __first,
3142 _BidirectionalIterator __last, _Compare __comp)
3145 __glibcxx_function_requires(_BidirectionalIteratorConcept<
3146 _BidirectionalIterator>)
3147 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
3150 __glibcxx_requires_valid_range(__first, __last);
3151 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
3153 return std::__prev_permutation(__first, __last, __comp);
3160 template<
typename _InputIterator,
typename _OutputIterator,
3161 typename _Predicate,
typename _Tp>
3162 _GLIBCXX20_CONSTEXPR
3164 __replace_copy_if(_InputIterator __first, _InputIterator __last,
3165 _OutputIterator __result,
3166 _Predicate __pred,
const _Tp& __new_value)
3168 for (; __first != __last; ++__first, (void)++__result)
3169 if (__pred(*__first))
3170 *__result = __new_value;
3172 *__result = *__first;
3191 template<
typename _InputIterator,
typename _OutputIterator,
typename _Tp>
3192 _GLIBCXX20_CONSTEXPR
3193 inline _OutputIterator
3194 replace_copy(_InputIterator __first, _InputIterator __last,
3195 _OutputIterator __result,
3196 const _Tp& __old_value,
const _Tp& __new_value)
3199 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3200 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
3202 __glibcxx_function_requires(_EqualOpConcept<
3204 __glibcxx_requires_valid_range(__first, __last);
3206 return std::__replace_copy_if(__first, __last, __result,
3207 __gnu_cxx::__ops::__equal_to(__old_value),
3226 template<
typename _InputIterator,
typename _OutputIterator,
3227 typename _Predicate,
typename _Tp>
3228 _GLIBCXX20_CONSTEXPR
3229 inline _OutputIterator
3230 replace_copy_if(_InputIterator __first, _InputIterator __last,
3231 _OutputIterator __result,
3232 _Predicate __pred,
const _Tp& __new_value)
3235 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3236 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
3238 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
3240 __glibcxx_requires_valid_range(__first, __last);
3242 return std::__replace_copy_if(__first, __last, __result, __pred,
3246#if __cplusplus >= 201103L
3254 template<
typename _ForwardIterator>
3255 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
3257 is_sorted(_ForwardIterator __first, _ForwardIterator __last)
3258 {
return std::is_sorted_until(__first, __last) == __last; }
3269 template<
typename _ForwardIterator,
typename _Compare>
3270 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
3272 is_sorted(_ForwardIterator __first, _ForwardIterator __last,
3274 {
return std::is_sorted_until(__first, __last, __comp) == __last; }
3277 template<
typename _ForwardIterator,
typename _Compare>
3278 _GLIBCXX20_CONSTEXPR
3280 __is_sorted_until(_ForwardIterator __first, _ForwardIterator __last,
3283 if (__first == __last)
3286 _ForwardIterator __next = __first;
3287 for (++__next; __next != __last; __first = __next, (void)++__next)
3288 if (__comp(*__next, *__first))
3302 template<
typename _ForwardIterator>
3303 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
3304 inline _ForwardIterator
3305 is_sorted_until(_ForwardIterator __first, _ForwardIterator __last)
3308 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
3309 __glibcxx_function_requires(_LessThanComparableConcept<
3311 __glibcxx_requires_valid_range(__first, __last);
3312 __glibcxx_requires_irreflexive(__first, __last);
3314 return std::__is_sorted_until(__first, __last,
3315 __gnu_cxx::__ops::less());
3327 template<
typename _ForwardIterator,
typename _Compare>
3328 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
3329 inline _ForwardIterator
3330 is_sorted_until(_ForwardIterator __first, _ForwardIterator __last,
3334 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
3335 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
3338 __glibcxx_requires_valid_range(__first, __last);
3339 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
3341 return std::__is_sorted_until(__first, __last, __comp);
3352 template<
typename _Tp>
3353 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
3358 __glibcxx_function_requires(_LessThanComparableConcept<_Tp>)
3360 return __b < __a ? pair<const _Tp&, const _Tp&>(__b, __a)
3373 template<
typename _Tp,
typename _Compare>
3374 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
3376 minmax(
const _Tp& __a,
const _Tp& __b, _Compare __comp)
3383 template<
typename _ForwardIterator,
typename _Compare>
3384 _GLIBCXX14_CONSTEXPR
3386 __minmax_element(_ForwardIterator __first, _ForwardIterator __last,
3389 _ForwardIterator __next = __first;
3390 if (__first == __last
3391 || ++__next == __last)
3394 _ForwardIterator __min{}, __max{};
3395 if (__comp(*__next, *__first))
3409 while (__first != __last)
3412 if (++__next == __last)
3414 if (__comp(*__first, *__min))
3416 else if (!__comp(*__first, *__max))
3421 if (__comp(*__next, *__first))
3423 if (__comp(*__next, *__min))
3425 if (!__comp(*__first, *__max))
3430 if (__comp(*__first, *__min))
3432 if (!__comp(*__next, *__max))
3455 template<
typename _ForwardIterator>
3456 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
3458 minmax_element(_ForwardIterator __first, _ForwardIterator __last)
3461 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
3462 __glibcxx_function_requires(_LessThanComparableConcept<
3464 __glibcxx_requires_valid_range(__first, __last);
3465 __glibcxx_requires_irreflexive(__first, __last);
3467 return std::__minmax_element(__first, __last, __gnu_cxx::__ops::less());
3482 template<
typename _ForwardIterator,
typename _Compare>
3483 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
3485 minmax_element(_ForwardIterator __first, _ForwardIterator __last,
3489 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
3490 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
3493 __glibcxx_requires_valid_range(__first, __last);
3494 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
3496 return std::__minmax_element(__first, __last, __comp);
3499 template<
typename _Tp>
3500 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
3501 inline pair<_Tp, _Tp>
3502 minmax(initializer_list<_Tp> __l)
3504 __glibcxx_requires_irreflexive(__l.begin(), __l.end());
3506 std::__minmax_element(__l.begin(), __l.end(),
3507 __gnu_cxx::__ops::less());
3511 template<
typename _Tp,
typename _Compare>
3512 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
3516 __glibcxx_requires_irreflexive_pred(__l.begin(), __l.end(), __comp);
3518 std::__minmax_element(__l.begin(), __l.end(), __comp);
3536 template<
typename _ForwardIterator1,
typename _ForwardIterator2,
3537 typename _BinaryPredicate>
3538 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
3540 is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
3541 _ForwardIterator2 __first2, _BinaryPredicate __pred)
3544 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
3545 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
3546 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
3549 __glibcxx_requires_valid_range(__first1, __last1);
3551 return std::__is_permutation(__first1, __last1, __first2, __pred);
3554#if __glibcxx_robust_nonmodifying_seq_ops
3556#pragma GCC diagnostic push
3557#pragma GCC diagnostic ignored "-Wc++17-extensions"
3558 template<
typename _ForwardIterator1,
typename _ForwardIterator2,
3559 typename _BinaryPredicate>
3560 _GLIBCXX20_CONSTEXPR
3562 __is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
3563 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
3564 _BinaryPredicate __pred)
3566 using _Cat1 =
decltype(std::__iter_concept_or_category<_ForwardIterator1>());
3567 using _Cat2 =
decltype(std::__iter_concept_or_category<_ForwardIterator2>());
3568 using _It1_is_RA = is_same<_Cat1, random_access_iterator_tag>;
3569 using _It2_is_RA = is_same<_Cat2, random_access_iterator_tag>;
3570 constexpr bool __ra_iters = __and_<_It1_is_RA, _It2_is_RA>::value;
3571 if constexpr (__ra_iters)
3573 if ((__last1 - __first1) != (__last2 - __first2))
3579 for (; __first1 != __last1 && __first2 != __last2;
3580 ++__first1, (void)++__first2)
3581 if (!__pred(*__first1, *__first2))
3584 if constexpr (__ra_iters)
3586 if (__first1 == __last1)
3593 if (__d1 == 0 && __d2 == 0)
3599 for (_ForwardIterator1 __scan = __first1; __scan != __last1; ++__scan)
3601 auto&& __scan_val = *__scan;
3602 auto __scaneq = __gnu_cxx::__ops::bind1st(__pred, __scan_val);
3603 if (__scan != std::__find_if(__first1, __scan, __scaneq))
3606 auto __matches = std::__count_if(__first2, __last2, __scaneq);
3608 || std::__count_if(__scan, __last1, __scaneq) != __matches)
3613#pragma GCC diagnostic pop
3629 template<
typename _ForwardIterator1,
typename _ForwardIterator2>
3630 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
3632 is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
3633 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
3635 __glibcxx_requires_valid_range(__first1, __last1);
3636 __glibcxx_requires_valid_range(__first2, __last2);
3638 return std::__is_permutation(__first1, __last1, __first2, __last2,
3639 __gnu_cxx::__ops::equal_to());
3656 template<
typename _ForwardIterator1,
typename _ForwardIterator2,
3657 typename _BinaryPredicate>
3658 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
3660 is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
3661 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
3662 _BinaryPredicate __pred)
3664 __glibcxx_requires_valid_range(__first1, __last1);
3665 __glibcxx_requires_valid_range(__first2, __last2);
3667 return std::__is_permutation(__first1, __last1, __first2, __last2,
3672#ifdef __glibcxx_clamp
3684 template<
typename _Tp>
3685 [[nodiscard]]
constexpr const _Tp&
3686 clamp(
const _Tp& __val,
const _Tp& __lo,
const _Tp& __hi)
3688 __glibcxx_assert(!(__hi < __lo));
3704 template<
typename _Tp,
typename _Compare>
3705 [[nodiscard]]
constexpr const _Tp&
3706 clamp(
const _Tp& __val,
const _Tp& __lo,
const _Tp& __hi, _Compare __comp)
3708 __glibcxx_assert(!__comp(__hi, __lo));
3734 template<
typename _IntType,
typename _UniformRandomBitGenerator>
3737 _UniformRandomBitGenerator&& __g)
3755 template<
typename _RandomAccessIterator,
3756 typename _UniformRandomNumberGenerator>
3758 shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
3759 _UniformRandomNumberGenerator&& __g)
3762 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
3763 _RandomAccessIterator>)
3764 __glibcxx_requires_valid_range(__first, __last);
3766 if (__first == __last)
3772 typedef typename std::make_unsigned<_DistanceType>::type __ud_type;
3774 typedef typename __distr_type::param_type __p_type;
3776 typedef typename remove_reference<_UniformRandomNumberGenerator>::type
3781 const __uc_type __urngrange = __g.max() - __g.min();
3782 const __uc_type __urange = __uc_type(__last - __first);
3784 if (__urngrange / __urange >= __urange)
3787 _RandomAccessIterator __i = __first + 1;
3793 if ((__urange % 2) == 0)
3795 __distr_type __d{0, 1};
3796 std::iter_swap(__i++, __first + __d(__g));
3803 while (__i != __last)
3805 const __uc_type __swap_range = __uc_type(__i - __first) + 1;
3810 std::iter_swap(__i++, __first + __pospos.
first);
3811 std::iter_swap(__i++, __first + __pospos.
second);
3819 for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
3820 std::iter_swap(__i, __first + __d(__g, __p_type(0, __i - __first)));
3824_GLIBCXX_BEGIN_NAMESPACE_ALGO
3838 template<
typename _InputIterator,
typename _Function>
3839 _GLIBCXX20_CONSTEXPR
3841 for_each(_InputIterator __first, _InputIterator __last, _Function __f)
3844 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3845 __glibcxx_requires_valid_range(__first, __last);
3846 std::__for_each(__first, __last, __f);
3850#if __cplusplus >= 201703L
3863 template<
typename _InputIterator,
typename _Size,
typename _Function>
3864 _GLIBCXX20_CONSTEXPR
3868 auto __n2 = std::__size_to_integer(__n);
3869 using _Cat =
decltype(std::__iter_concept_or_category<_InputIterator>());
3870 if constexpr (is_base_of_v<random_access_iterator_tag, _Cat>)
3875 auto __last = __first + __d;
3876 std::for_each(__first, __last,
std::move(__f));
3900 template<
typename _InputIterator,
typename _Tp>
3901 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
3902 inline _InputIterator
3903 find(_InputIterator __first, _InputIterator __last,
const _Tp& __val)
3906 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3907 __glibcxx_function_requires(_EqualOpConcept<
3909 __glibcxx_requires_valid_range(__first, __last);
3911#if __cpp_if_constexpr && __glibcxx_type_trait_variable_templates
3913 if constexpr (__can_use_memchr_for_find<_ValT, _Tp>)
3914 if constexpr (is_pointer_v<
decltype(std::__niter_base(__first))>
3915#
if __glibcxx_concepts && __glibcxx_to_address
3916 || contiguous_iterator<_InputIterator>
3924 if (!(
static_cast<_ValT
>(__val) == __val))
3926 else if (!__is_constant_evaluated())
3928 const int __ival =
static_cast<int>(__val);
3929 if (
auto __n = __last - __first; __n > 0)
3931#if __glibcxx_concepts && __glibcxx_to_address
3934 const void* __p0 = std::__niter_base(__first);
3936 if (
auto __p1 = __builtin_memchr(__p0, __ival, __n))
3937 return __first + ((
const char*)__p1 - (
const char*)__p0);
3944 return std::__find_if(__first, __last,
3945 __gnu_cxx::__ops::__equal_to(__val));
3958 template<
typename _InputIterator,
typename _Predicate>
3959 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
3960 inline _InputIterator
3961 find_if(_InputIterator __first, _InputIterator __last,
3965 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3966 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
3968 __glibcxx_requires_valid_range(__first, __last);
3970 return std::__find_if(__first, __last, __pred);
3990 template<
typename _InputIterator,
typename _ForwardIterator>
3991 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
3993 find_first_of(_InputIterator __first1, _InputIterator __last1,
3994 _ForwardIterator __first2, _ForwardIterator __last2)
3997 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3998 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
3999 __glibcxx_function_requires(_EqualOpConcept<
4002 __glibcxx_requires_valid_range(__first1, __last1);
4003 __glibcxx_requires_valid_range(__first2, __last2);
4005 for (; __first1 != __last1; ++__first1)
4006 for (_ForwardIterator __iter = __first2; __iter != __last2; ++__iter)
4007 if (*__first1 == *__iter)
4031 template<
typename _InputIterator,
typename _ForwardIterator,
4032 typename _BinaryPredicate>
4033 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
4035 find_first_of(_InputIterator __first1, _InputIterator __last1,
4036 _ForwardIterator __first2, _ForwardIterator __last2,
4037 _BinaryPredicate __comp)
4040 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
4041 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
4042 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
4045 __glibcxx_requires_valid_range(__first1, __last1);
4046 __glibcxx_requires_valid_range(__first2, __last2);
4048 for (; __first1 != __last1; ++__first1)
4049 for (_ForwardIterator __iter = __first2; __iter != __last2; ++__iter)
4050 if (__comp(*__first1, *__iter))
4064 template<
typename _ForwardIterator>
4065 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
4066 inline _ForwardIterator
4067 adjacent_find(_ForwardIterator __first, _ForwardIterator __last)
4070 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
4071 __glibcxx_function_requires(_EqualityComparableConcept<
4073 __glibcxx_requires_valid_range(__first, __last);
4075 return std::__adjacent_find(__first, __last,
4076 __gnu_cxx::__ops::equal_to());
4090 template<
typename _ForwardIterator,
typename _BinaryPredicate>
4091 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
4092 inline _ForwardIterator
4093 adjacent_find(_ForwardIterator __first, _ForwardIterator __last,
4094 _BinaryPredicate __binary_pred)
4097 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
4098 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
4101 __glibcxx_requires_valid_range(__first, __last);
4103 return std::__adjacent_find(__first, __last, __binary_pred);
4115 template<
typename _InputIterator,
typename _Tp>
4116 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
4117 inline typename iterator_traits<_InputIterator>::difference_type
4118 count(_InputIterator __first, _InputIterator __last,
const _Tp& __value)
4121 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
4122 __glibcxx_function_requires(_EqualOpConcept<
4124 __glibcxx_requires_valid_range(__first, __last);
4126 return std::__count_if(__first, __last,
4127 __gnu_cxx::__ops::__equal_to(__value));
4139 template<
typename _InputIterator,
typename _Predicate>
4140 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
4141 inline typename iterator_traits<_InputIterator>::difference_type
4142 count_if(_InputIterator __first, _InputIterator __last, _Predicate __pred)
4145 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
4146 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
4148 __glibcxx_requires_valid_range(__first, __last);
4150 return std::__count_if(__first, __last, __pred);
4179 template<
typename _ForwardIterator1,
typename _ForwardIterator2>
4180 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
4181 inline _ForwardIterator1
4182 search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
4183 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
4186 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
4187 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
4188 __glibcxx_function_requires(_EqualOpConcept<
4191 __glibcxx_requires_valid_range(__first1, __last1);
4192 __glibcxx_requires_valid_range(__first2, __last2);
4194 return std::__search(__first1, __last1, __first2, __last2,
4195 __gnu_cxx::__ops::equal_to());
4212 template<
typename _ForwardIterator,
typename _Integer,
typename _Tp>
4213 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
4214 inline _ForwardIterator
4215 search_n(_ForwardIterator __first, _ForwardIterator __last,
4216 _Integer __count,
const _Tp& __val)
4219 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
4220 __glibcxx_function_requires(_EqualOpConcept<
4222 __glibcxx_requires_valid_range(__first, __last);
4224 return std::__search_n(__first, __last, __count,
4225 __gnu_cxx::__ops::__equal_to(__val));
4245 template<
typename _ForwardIterator,
typename _Integer,
typename _Tp,
4246 typename _BinaryPredicate>
4247 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
4248 inline _ForwardIterator
4249 search_n(_ForwardIterator __first, _ForwardIterator __last,
4250 _Integer __count,
const _Tp& __val,
4251 _BinaryPredicate __binary_pred)
4254 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
4255 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
4257 __glibcxx_requires_valid_range(__first, __last);
4259 return std::__search_n(__first, __last, __count,
4260 __gnu_cxx::__ops::bind2nd(__binary_pred, __val));
4263#if __cplusplus >= 201703L
4271 template<
typename _ForwardIterator,
typename _Searcher>
4272 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
4273 inline _ForwardIterator
4274 search(_ForwardIterator __first, _ForwardIterator __last,
4275 const _Searcher& __searcher)
4276 {
return __searcher(__first, __last).first; }
4295 template<
typename _InputIterator,
typename _OutputIterator,
4296 typename _UnaryOperation>
4297 _GLIBCXX20_CONSTEXPR
4299 transform(_InputIterator __first, _InputIterator __last,
4300 _OutputIterator __result, _UnaryOperation __unary_op)
4303 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
4304 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4306 __typeof__(__unary_op(*__first))>)
4307 __glibcxx_requires_valid_range(__first, __last);
4309 for (; __first != __last; ++__first, (void)++__result)
4310 *__result = __unary_op(*__first);
4332 template<
typename _InputIterator1,
typename _InputIterator2,
4333 typename _OutputIterator,
typename _BinaryOperation>
4334 _GLIBCXX20_CONSTEXPR
4336 transform(_InputIterator1 __first1, _InputIterator1 __last1,
4337 _InputIterator2 __first2, _OutputIterator __result,
4338 _BinaryOperation __binary_op)
4341 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
4342 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
4343 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4345 __typeof__(__binary_op(*__first1,*__first2))>)
4346 __glibcxx_requires_valid_range(__first1, __last1);
4348 for (; __first1 != __last1; ++__first1, (void)++__first2, ++__result)
4349 *__result = __binary_op(*__first1, *__first2);
4365 template<
typename _ForwardIterator,
typename _Tp>
4366 _GLIBCXX20_CONSTEXPR
4368 replace(_ForwardIterator __first, _ForwardIterator __last,
4369 const _Tp& __old_value,
const _Tp& __new_value)
4372 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
4374 __glibcxx_function_requires(_EqualOpConcept<
4376 __glibcxx_function_requires(_ConvertibleConcept<_Tp,
4378 __glibcxx_requires_valid_range(__first, __last);
4380 for (; __first != __last; ++__first)
4381 if (*__first == __old_value)
4382 *__first = __new_value;
4397 template<
typename _ForwardIterator,
typename _Predicate,
typename _Tp>
4398 _GLIBCXX20_CONSTEXPR
4400 replace_if(_ForwardIterator __first, _ForwardIterator __last,
4401 _Predicate __pred,
const _Tp& __new_value)
4404 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
4406 __glibcxx_function_requires(_ConvertibleConcept<_Tp,
4408 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
4410 __glibcxx_requires_valid_range(__first, __last);
4412 for (; __first != __last; ++__first)
4413 if (__pred(*__first))
4414 *__first = __new_value;
4428 template<
typename _ForwardIterator,
typename _Generator>
4429 _GLIBCXX20_CONSTEXPR
4431 generate(_ForwardIterator __first, _ForwardIterator __last,
4435 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
4436 __glibcxx_function_requires(_GeneratorConcept<_Generator,
4438 __glibcxx_requires_valid_range(__first, __last);
4440 for (; __first != __last; ++__first)
4461 template<
typename _OutputIterator,
typename _Size,
typename _Generator>
4462 _GLIBCXX20_CONSTEXPR
4464 generate_n(_OutputIterator __first, _Size __n, _Generator __gen)
4467 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4469 __typeof__(__gen())>)
4471 typedef __decltype(std::__size_to_integer(__n)) _IntSize;
4472 for (_IntSize __niter = std::__size_to_integer(__n);
4473 __niter > 0; --__niter, (void) ++__first)
4496 template<
typename _InputIterator,
typename _OutputIterator>
4497 _GLIBCXX20_CONSTEXPR
4498 inline _OutputIterator
4499 unique_copy(_InputIterator __first, _InputIterator __last,
4500 _OutputIterator __result)
4503 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
4504 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4506 __glibcxx_function_requires(_EqualityComparableConcept<
4508 __glibcxx_requires_valid_range(__first, __last);
4510 if (__first == __last)
4512 return std::__unique_copy(__first, __last, __result,
4513 __gnu_cxx::__ops::equal_to(),
4514 std::__iter_concept_or_category(__first));
4535 template<
typename _InputIterator,
typename _OutputIterator,
4536 typename _BinaryPredicate>
4537 _GLIBCXX20_CONSTEXPR
4538 inline _OutputIterator
4539 unique_copy(_InputIterator __first, _InputIterator __last,
4540 _OutputIterator __result,
4541 _BinaryPredicate __binary_pred)
4544 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
4545 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4547 __glibcxx_requires_valid_range(__first, __last);
4548 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
4552 if (__first == __last)
4554 return std::__unique_copy(__first, __last, __result, __binary_pred,
4555 std::__iter_concept_or_category(__first));
4558#if __cplusplus <= 201103L || _GLIBCXX_USE_DEPRECATED
4574 template<
typename _RandomAccessIterator>
4575 _GLIBCXX14_DEPRECATED_SUGGEST(
"std::shuffle")
4577 random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last)
4580 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4581 _RandomAccessIterator>)
4582 __glibcxx_requires_valid_range(__first, __last);
4584 if (__first == __last)
4590#if RAND_MAX < __INT_MAX__
4591 if (__builtin_expect((__last - __first) >= RAND_MAX / 4, 0))
4596 = (unsigned)std::rand() ^ ((unsigned)std::rand() << 15);
4597 for (_RandomAccessIterator __i = __first + _Dist(1); __i != __last;
4601 __xss ^= __xss << 13;
4602 __xss ^= __xss >> 17;
4603 __xss ^= __xss << 5;
4604 _RandomAccessIterator __j
4605 = __first + _Dist(__xss % ((__i - __first) + 1));
4607 std::iter_swap(__i, __j);
4613 for (_RandomAccessIterator __i = __first + _Dist(1); __i != __last; ++__i)
4616 _RandomAccessIterator __j
4617 = __first + _Dist(std::rand() % ((__i - __first) + 1));
4619 std::iter_swap(__i, __j);
4640 template<
typename _RandomAccessIterator,
typename _RandomNumberGenerator>
4641 _GLIBCXX14_DEPRECATED_SUGGEST(
"std::shuffle")
4643 random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
4644#if __cplusplus >= 201103L
4645 _RandomNumberGenerator&& __rand)
4647 _RandomNumberGenerator& __rand)
4651 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4652 _RandomAccessIterator>)
4653 __glibcxx_requires_valid_range(__first, __last);
4655 if (__first == __last)
4661 for (_RandomAccessIterator __i = __first + _Dist(1); __i != __last; ++__i)
4663 _RandomAccessIterator __j
4664 = __first + _Dist(__rand((__i - __first) + 1));
4666 std::iter_swap(__i, __j);
4687 template<
typename _ForwardIterator,
typename _Predicate>
4688 _GLIBCXX20_CONSTEXPR
4689 inline _ForwardIterator
4690 partition(_ForwardIterator __first, _ForwardIterator __last,
4694 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
4696 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
4698 __glibcxx_requires_valid_range(__first, __last);
4700 return std::__partition(__first, __last, __pred,
4701 std::__iterator_category(__first));
4721 template<
typename _RandomAccessIterator>
4722 _GLIBCXX20_CONSTEXPR
4724 partial_sort(_RandomAccessIterator __first,
4725 _RandomAccessIterator __middle,
4726 _RandomAccessIterator __last)
4729 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4730 _RandomAccessIterator>)
4731 __glibcxx_function_requires(_LessThanComparableConcept<
4733 __glibcxx_requires_valid_range(__first, __middle);
4734 __glibcxx_requires_valid_range(__middle, __last);
4735 __glibcxx_requires_irreflexive(__first, __last);
4737 std::__partial_sort(__first, __middle, __last,
4738 __gnu_cxx::__ops::less());
4759 template<
typename _RandomAccessIterator,
typename _Compare>
4760 _GLIBCXX20_CONSTEXPR
4762 partial_sort(_RandomAccessIterator __first,
4763 _RandomAccessIterator __middle,
4764 _RandomAccessIterator __last,
4768 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4769 _RandomAccessIterator>)
4770 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
4773 __glibcxx_requires_valid_range(__first, __middle);
4774 __glibcxx_requires_valid_range(__middle, __last);
4775 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
4777 std::__partial_sort(__first, __middle, __last, __comp);
4794 template<
typename _RandomAccessIterator>
4795 _GLIBCXX20_CONSTEXPR
4797 nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth,
4798 _RandomAccessIterator __last)
4801 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4802 _RandomAccessIterator>)
4803 __glibcxx_function_requires(_LessThanComparableConcept<
4805 __glibcxx_requires_valid_range(__first, __nth);
4806 __glibcxx_requires_valid_range(__nth, __last);
4807 __glibcxx_requires_irreflexive(__first, __last);
4809 if (__first == __last || __nth == __last)
4812 std::__introselect(__first, __nth, __last,
4814 __gnu_cxx::__ops::less());
4833 template<
typename _RandomAccessIterator,
typename _Compare>
4834 _GLIBCXX20_CONSTEXPR
4836 nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth,
4837 _RandomAccessIterator __last, _Compare __comp)
4840 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4841 _RandomAccessIterator>)
4842 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
4845 __glibcxx_requires_valid_range(__first, __nth);
4846 __glibcxx_requires_valid_range(__nth, __last);
4847 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
4849 if (__first == __last || __nth == __last)
4852 std::__introselect(__first, __nth, __last,
4870 template<
typename _RandomAccessIterator>
4871 _GLIBCXX20_CONSTEXPR
4873 sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
4876 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4877 _RandomAccessIterator>)
4878 __glibcxx_function_requires(_LessThanComparableConcept<
4880 __glibcxx_requires_valid_range(__first, __last);
4881 __glibcxx_requires_irreflexive(__first, __last);
4883 std::__sort(__first, __last, __gnu_cxx::__ops::less());
4900 template<
typename _RandomAccessIterator,
typename _Compare>
4901 _GLIBCXX20_CONSTEXPR
4903 sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
4907 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4908 _RandomAccessIterator>)
4909 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
4912 __glibcxx_requires_valid_range(__first, __last);
4913 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
4915 std::__sort(__first, __last, __comp);
4918 template<
typename _InputIterator1,
typename _InputIterator2,
4919 typename _OutputIterator,
typename _Compare>
4920 _GLIBCXX20_CONSTEXPR
4922 __merge(_InputIterator1 __first1, _InputIterator1 __last1,
4923 _InputIterator2 __first2, _InputIterator2 __last2,
4924 _OutputIterator __result, _Compare __comp)
4926 while (__first1 != __last1 && __first2 != __last2)
4928 if (__comp(*__first2, *__first1))
4930 *__result = *__first2;
4935 *__result = *__first1;
4940 return std::copy(__first2, __last2,
4941 std::copy(__first1, __last1, __result));
4964 template<
typename _InputIterator1,
typename _InputIterator2,
4965 typename _OutputIterator>
4966 _GLIBCXX20_CONSTEXPR
4967 inline _OutputIterator
4968 merge(_InputIterator1 __first1, _InputIterator1 __last1,
4969 _InputIterator2 __first2, _InputIterator2 __last2,
4970 _OutputIterator __result)
4973 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
4974 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
4975 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4977 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4979 __glibcxx_function_requires(_LessThanOpConcept<
4982 __glibcxx_requires_sorted_set(__first1, __last1, __first2);
4983 __glibcxx_requires_sorted_set(__first2, __last2, __first1);
4984 __glibcxx_requires_irreflexive2(__first1, __last1);
4985 __glibcxx_requires_irreflexive2(__first2, __last2);
4987 return _GLIBCXX_STD_A::__merge(__first1, __last1, __first2, __last2,
4988 __result, __gnu_cxx::__ops::less());
5015 template<
typename _InputIterator1,
typename _InputIterator2,
5016 typename _OutputIterator,
typename _Compare>
5017 _GLIBCXX20_CONSTEXPR
5018 inline _OutputIterator
5019 merge(_InputIterator1 __first1, _InputIterator1 __last1,
5020 _InputIterator2 __first2, _InputIterator2 __last2,
5021 _OutputIterator __result, _Compare __comp)
5024 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5025 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5026 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5028 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5030 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5033 __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
5034 __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
5035 __glibcxx_requires_irreflexive_pred2(__first1, __last1, __comp);
5036 __glibcxx_requires_irreflexive_pred2(__first2, __last2, __comp);
5038 return _GLIBCXX_STD_A::__merge(__first1, __last1, __first2, __last2,
5042 template<
typename _RandomAccessIterator,
typename _Compare>
5043 _GLIBCXX26_CONSTEXPR
5045 __stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
5048 typedef typename iterator_traits<_RandomAccessIterator>::value_type
5050 typedef typename iterator_traits<_RandomAccessIterator>::difference_type
5053 if (__first == __last)
5057# if __glibcxx_constexpr_algorithms >= 202306L
5059 return std::__inplace_stable_sort(__first, __last, __comp);
5066 _TmpBuf __buf(__first, (__last - __first + 1) / 2);
5068 if (__builtin_expect(__buf._M_requested_size() == __buf.size(),
true))
5069 std::__stable_sort_adaptive(__first,
5070 __first + _DistanceType(__buf.size()),
5071 __last, __buf.begin(), __comp);
5072 else if (__builtin_expect(__buf.begin() == 0,
false))
5073 std::__inplace_stable_sort(__first, __last, __comp);
5075 std::__stable_sort_adaptive_resize(__first, __last, __buf.begin(),
5076 _DistanceType(__buf.size()), __comp);
5078 std::__inplace_stable_sort(__first, __last, __comp);
5098 template<
typename _RandomAccessIterator>
5099 _GLIBCXX26_CONSTEXPR
5101 stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
5104 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
5105 _RandomAccessIterator>)
5106 __glibcxx_function_requires(_LessThanComparableConcept<
5108 __glibcxx_requires_valid_range(__first, __last);
5109 __glibcxx_requires_irreflexive(__first, __last);
5111 _GLIBCXX_STD_A::__stable_sort(__first, __last,
5112 __gnu_cxx::__ops::less());
5132 template<
typename _RandomAccessIterator,
typename _Compare>
5133 _GLIBCXX26_CONSTEXPR
5135 stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
5139 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
5140 _RandomAccessIterator>)
5141 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5142 typename iterator_traits<_RandomAccessIterator>::value_type,
5143 typename iterator_traits<_RandomAccessIterator>::value_type>)
5144 __glibcxx_requires_valid_range(__first, __last);
5145 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
5147 _GLIBCXX_STD_A::__stable_sort(__first, __last, __comp);
5150 template<typename _InputIterator1, typename _InputIterator2,
5151 typename _OutputIterator, typename _Compare>
5152 _GLIBCXX20_CONSTEXPR
5154 __set_union(_InputIterator1 __first1, _InputIterator1 __last1,
5155 _InputIterator2 __first2, _InputIterator2 __last2,
5156 _OutputIterator __result, _Compare __comp)
5158 while (__first1 != __last1 && __first2 != __last2)
5160 if (__comp(*__first1, *__first2))
5162 *__result = *__first1;
5165 else if (__comp(*__first2, *__first1))
5167 *__result = *__first2;
5172 *__result = *__first1;
5178 return std::copy(__first2, __last2,
5179 std::copy(__first1, __last1, __result));
5201 template<
typename _InputIterator1,
typename _InputIterator2,
5202 typename _OutputIterator>
5203 _GLIBCXX20_CONSTEXPR
5204 inline _OutputIterator
5205 set_union(_InputIterator1 __first1, _InputIterator1 __last1,
5206 _InputIterator2 __first2, _InputIterator2 __last2,
5207 _OutputIterator __result)
5210 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5211 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5212 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5214 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5216 __glibcxx_function_requires(_LessThanOpConcept<
5219 __glibcxx_function_requires(_LessThanOpConcept<
5222 __glibcxx_requires_sorted_set(__first1, __last1, __first2);
5223 __glibcxx_requires_sorted_set(__first2, __last2, __first1);
5224 __glibcxx_requires_irreflexive2(__first1, __last1);
5225 __glibcxx_requires_irreflexive2(__first2, __last2);
5227 return _GLIBCXX_STD_A::__set_union(__first1, __last1, __first2, __last2,
5228 __result, __gnu_cxx::__ops::less());
5251 template<
typename _InputIterator1,
typename _InputIterator2,
5252 typename _OutputIterator,
typename _Compare>
5253 _GLIBCXX20_CONSTEXPR
5254 inline _OutputIterator
5255 set_union(_InputIterator1 __first1, _InputIterator1 __last1,
5256 _InputIterator2 __first2, _InputIterator2 __last2,
5257 _OutputIterator __result, _Compare __comp)
5260 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5261 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5262 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5264 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5266 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5269 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5272 __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
5273 __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
5274 __glibcxx_requires_irreflexive_pred2(__first1, __last1, __comp);
5275 __glibcxx_requires_irreflexive_pred2(__first2, __last2, __comp);
5277 return _GLIBCXX_STD_A::__set_union(__first1, __last1, __first2, __last2,
5281 template<
typename _InputIterator1,
typename _InputIterator2,
5282 typename _OutputIterator,
typename _Compare>
5283 _GLIBCXX20_CONSTEXPR
5285 __set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5286 _InputIterator2 __first2, _InputIterator2 __last2,
5287 _OutputIterator __result, _Compare __comp)
5289 while (__first1 != __last1 && __first2 != __last2)
5290 if (__comp(*__first1, *__first2))
5292 else if (__comp(*__first2, *__first1))
5296 *__result = *__first1;
5322 template<
typename _InputIterator1,
typename _InputIterator2,
5323 typename _OutputIterator>
5324 _GLIBCXX20_CONSTEXPR
5325 inline _OutputIterator
5326 set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5327 _InputIterator2 __first2, _InputIterator2 __last2,
5328 _OutputIterator __result)
5331 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5332 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5333 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5335 __glibcxx_function_requires(_LessThanOpConcept<
5338 __glibcxx_function_requires(_LessThanOpConcept<
5341 __glibcxx_requires_sorted_set(__first1, __last1, __first2);
5342 __glibcxx_requires_sorted_set(__first2, __last2, __first1);
5343 __glibcxx_requires_irreflexive2(__first1, __last1);
5344 __glibcxx_requires_irreflexive2(__first2, __last2);
5346 return _GLIBCXX_STD_A::
5347 __set_intersection(__first1, __last1, __first2, __last2,
5348 __result, __gnu_cxx::__ops::less());
5372 template<
typename _InputIterator1,
typename _InputIterator2,
5373 typename _OutputIterator,
typename _Compare>
5374 _GLIBCXX20_CONSTEXPR
5375 inline _OutputIterator
5376 set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5377 _InputIterator2 __first2, _InputIterator2 __last2,
5378 _OutputIterator __result, _Compare __comp)
5381 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5382 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5383 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5385 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5388 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5391 __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
5392 __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
5393 __glibcxx_requires_irreflexive_pred2(__first1, __last1, __comp);
5394 __glibcxx_requires_irreflexive_pred2(__first2, __last2, __comp);
5396 return _GLIBCXX_STD_A::
5397 __set_intersection(__first1, __last1, __first2, __last2,
5401 template<
typename _InputIterator1,
typename _InputIterator2,
5402 typename _OutputIterator,
typename _Compare>
5403 _GLIBCXX20_CONSTEXPR
5405 __set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5406 _InputIterator2 __first2, _InputIterator2 __last2,
5407 _OutputIterator __result, _Compare __comp)
5409 while (__first1 != __last1 && __first2 != __last2)
5410 if (__comp(*__first1, *__first2))
5412 *__result = *__first1;
5416 else if (__comp(*__first2, *__first1))
5423 return std::copy(__first1, __last1, __result);
5446 template<
typename _InputIterator1,
typename _InputIterator2,
5447 typename _OutputIterator>
5448 _GLIBCXX20_CONSTEXPR
5449 inline _OutputIterator
5450 set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5451 _InputIterator2 __first2, _InputIterator2 __last2,
5452 _OutputIterator __result)
5455 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5456 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5457 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5459 __glibcxx_function_requires(_LessThanOpConcept<
5462 __glibcxx_function_requires(_LessThanOpConcept<
5465 __glibcxx_requires_sorted_set(__first1, __last1, __first2);
5466 __glibcxx_requires_sorted_set(__first2, __last2, __first1);
5467 __glibcxx_requires_irreflexive2(__first1, __last1);
5468 __glibcxx_requires_irreflexive2(__first2, __last2);
5470 return _GLIBCXX_STD_A::
5471 __set_difference(__first1, __last1, __first2, __last2, __result,
5472 __gnu_cxx::__ops::less());
5498 template<
typename _InputIterator1,
typename _InputIterator2,
5499 typename _OutputIterator,
typename _Compare>
5500 _GLIBCXX20_CONSTEXPR
5501 inline _OutputIterator
5502 set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5503 _InputIterator2 __first2, _InputIterator2 __last2,
5504 _OutputIterator __result, _Compare __comp)
5507 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5508 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5509 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5511 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5514 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5517 __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
5518 __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
5519 __glibcxx_requires_irreflexive_pred2(__first1, __last1, __comp);
5520 __glibcxx_requires_irreflexive_pred2(__first2, __last2, __comp);
5522 return _GLIBCXX_STD_A::
5523 __set_difference(__first1, __last1, __first2, __last2, __result,
5527 template<
typename _InputIterator1,
typename _InputIterator2,
5528 typename _OutputIterator,
5530 _GLIBCXX20_CONSTEXPR
5532 __set_symmetric_difference(_InputIterator1 __first1,
5533 _InputIterator1 __last1,
5534 _InputIterator2 __first2,
5535 _InputIterator2 __last2,
5536 _OutputIterator __result,
5539 while (__first1 != __last1 && __first2 != __last2)
5540 if (__comp(*__first1, *__first2))
5542 *__result = *__first1;
5546 else if (__comp(*__first2, *__first1))
5548 *__result = *__first2;
5557 return std::copy(__first2, __last2,
5558 std::copy(__first1, __last1, __result));
5579 template<
typename _InputIterator1,
typename _InputIterator2,
5580 typename _OutputIterator>
5581 _GLIBCXX20_CONSTEXPR
5582 inline _OutputIterator
5583 set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5584 _InputIterator2 __first2, _InputIterator2 __last2,
5585 _OutputIterator __result)
5588 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5589 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5590 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5592 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5594 __glibcxx_function_requires(_LessThanOpConcept<
5597 __glibcxx_function_requires(_LessThanOpConcept<
5600 __glibcxx_requires_sorted_set(__first1, __last1, __first2);
5601 __glibcxx_requires_sorted_set(__first2, __last2, __first1);
5602 __glibcxx_requires_irreflexive2(__first1, __last1);
5603 __glibcxx_requires_irreflexive2(__first2, __last2);
5605 return _GLIBCXX_STD_A::
5606 __set_symmetric_difference(__first1, __last1, __first2, __last2,
5607 __result, __gnu_cxx::__ops::less());
5631 template<
typename _InputIterator1,
typename _InputIterator2,
5632 typename _OutputIterator,
typename _Compare>
5633 _GLIBCXX20_CONSTEXPR
5634 inline _OutputIterator
5635 set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5636 _InputIterator2 __first2, _InputIterator2 __last2,
5637 _OutputIterator __result,
5641 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5642 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5643 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5645 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5647 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5650 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5653 __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
5654 __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
5655 __glibcxx_requires_irreflexive_pred2(__first1, __last1, __comp);
5656 __glibcxx_requires_irreflexive_pred2(__first2, __last2, __comp);
5658 return _GLIBCXX_STD_A::
5659 __set_symmetric_difference(__first1, __last1, __first2, __last2,
5663 template<
typename _ForwardIterator,
typename _Compare>
5664 _GLIBCXX14_CONSTEXPR
5666 __min_element(_ForwardIterator __first, _ForwardIterator __last,
5669 if (__first == __last)
5671 _ForwardIterator __result = __first;
5672 while (++__first != __last)
5673 if (__comp(*__first, *__result))
5685 template<
typename _ForwardIterator>
5686 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
5687 inline _ForwardIterator
5688 min_element(_ForwardIterator __first, _ForwardIterator __last)
5691 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
5692 __glibcxx_function_requires(_LessThanComparableConcept<
5694 __glibcxx_requires_valid_range(__first, __last);
5695 __glibcxx_requires_irreflexive(__first, __last);
5697 return _GLIBCXX_STD_A::__min_element(__first, __last,
5698 __gnu_cxx::__ops::less());
5710 template<
typename _ForwardIterator,
typename _Compare>
5711 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
5712 inline _ForwardIterator
5713 min_element(_ForwardIterator __first, _ForwardIterator __last,
5717 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
5718 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5721 __glibcxx_requires_valid_range(__first, __last);
5722 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
5724 return _GLIBCXX_STD_A::__min_element(__first, __last, __comp);
5727 template<
typename _ForwardIterator,
typename _Compare>
5728 _GLIBCXX14_CONSTEXPR
5730 __max_element(_ForwardIterator __first, _ForwardIterator __last,
5733 if (__first == __last)
return __first;
5734 _ForwardIterator __result = __first;
5735 while (++__first != __last)
5736 if (__comp(*__result, *__first))
5748 template<
typename _ForwardIterator>
5749 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
5750 inline _ForwardIterator
5751 max_element(_ForwardIterator __first, _ForwardIterator __last)
5754 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
5755 __glibcxx_function_requires(_LessThanComparableConcept<
5757 __glibcxx_requires_valid_range(__first, __last);
5758 __glibcxx_requires_irreflexive(__first, __last);
5760 return _GLIBCXX_STD_A::__max_element(__first, __last,
5761 __gnu_cxx::__ops::less());
5773 template<
typename _ForwardIterator,
typename _Compare>
5774 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
5775 inline _ForwardIterator
5776 max_element(_ForwardIterator __first, _ForwardIterator __last,
5780 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
5781 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5784 __glibcxx_requires_valid_range(__first, __last);
5785 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
5787 return _GLIBCXX_STD_A::__max_element(__first, __last, __comp);
5790#if __cplusplus >= 201103L
5792 template<
typename _Tp>
5793 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
5795 min(initializer_list<_Tp> __l)
5797 __glibcxx_requires_irreflexive(__l.begin(), __l.end());
5798 return *_GLIBCXX_STD_A::__min_element(__l.begin(), __l.end(),
5799 __gnu_cxx::__ops::less());
5802 template<
typename _Tp,
typename _Compare>
5803 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
5807 __glibcxx_requires_irreflexive_pred(__l.begin(), __l.end(), __comp);
5808 return *_GLIBCXX_STD_A::__min_element(__l.begin(), __l.end(), __comp);
5811 template<
typename _Tp>
5812 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
5816 __glibcxx_requires_irreflexive(__l.begin(), __l.end());
5817 return *_GLIBCXX_STD_A::__max_element(__l.begin(), __l.end(),
5818 __gnu_cxx::__ops::less());
5821 template<
typename _Tp,
typename _Compare>
5822 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
5826 __glibcxx_requires_irreflexive_pred(__l.begin(), __l.end(), __comp);
5827 return *_GLIBCXX_STD_A::__max_element(__l.begin(), __l.end(), __comp);
5831#if __cplusplus >= 201402L
5834 template<typename _InputIterator, typename _RandomAccessIterator,
5835 typename _Size,
typename _UniformRandomBitGenerator>
5836 _RandomAccessIterator
5839 _Size __n, _UniformRandomBitGenerator&& __g)
5842 using __param_type =
typename __distrib_type::param_type;
5843 __distrib_type __d{};
5844 _Size __sample_sz = 0;
5845 while (__first != __last && __sample_sz != __n)
5847 __out[__sample_sz++] = *__first;
5850 for (
auto __pop_sz = __sample_sz; __first != __last;
5851 ++__first, (void) ++__pop_sz)
5853 const auto __k = __d(__g, __param_type{0, __pop_sz});
5855 __out[__k] = *__first;
5857 return __out + __sample_sz;
5861 template<
typename _ForwardIterator,
typename _OutputIterator,
typename _Cat,
5862 typename _Size,
typename _UniformRandomBitGenerator>
5864 __sample(_ForwardIterator __first, _ForwardIterator __last,
5866 _OutputIterator __out, _Cat,
5867 _Size __n, _UniformRandomBitGenerator&& __g)
5870 using __param_type =
typename __distrib_type::param_type;
5875 if (__first == __last)
5878 __distrib_type __d{};
5880 __n =
std::min(__n, __unsampled_sz);
5885 const __uc_type __urngrange = __g.max() - __g.min();
5886 if (__urngrange / __uc_type(__unsampled_sz) >= __uc_type(__unsampled_sz))
5890 while (__n != 0 && __unsampled_sz >= 2)
5896 if (__p.first < __n)
5898 *__out++ = *__first;
5904 if (__n == 0)
break;
5907 if (__p.second < __n)
5909 *__out++ = *__first;
5919 for (; __n != 0; ++__first)
5920 if (__d(__g, __param_type{0, --__unsampled_sz}) < __n)
5922 *__out++ = *__first;
5930#ifdef __glibcxx_sample
5932 template<typename _PopulationIterator, typename _SampleIterator,
5933 typename _Distance,
typename _UniformRandomBitGenerator>
5935 sample(_PopulationIterator __first, _PopulationIterator __last,
5936 _SampleIterator __out, _Distance __n,
5937 _UniformRandomBitGenerator&& __g)
5940 =
decltype(std::__iter_concept_or_category<_PopulationIterator>());
5945 __or_<is_convertible<__pop_cat, forward_iterator_tag>,
5946 is_convertible<__samp_cat, random_access_iterator_tag>>::value,
5947 "output range must use a RandomAccessIterator when input range"
5948 " does not meet the ForwardIterator requirements");
5951 "sample size must be an integer type");
5954 return _GLIBCXX_STD_A::
5955 __sample(__first, __last, __pop_cat{}, __out, __samp_cat{}, __d,
5960_GLIBCXX_END_NAMESPACE_ALGO
5961_GLIBCXX_END_NAMESPACE_VERSION
5964#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.
ISO C++ entities toplevel namespace is std.
pair< _IntType, _IntType > __gen_two_uniform_ints(_IntType __b0, _IntType __b1, _UniformRandomBitGenerator &&__g)
Generate two uniformly distributed integers using a single distribution invocation.
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.
_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.
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...