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))
152 template<
typename _ForwardIterator,
typename _Integer,
153 typename _UnaryPredicate>
156 __search_n_aux(_ForwardIterator __first, _ForwardIterator __last,
157 _Integer __count, _UnaryPredicate __unary_pred,
158 std::forward_iterator_tag)
160 __first = std::__find_if(__first, __last, __unary_pred);
161 while (__first != __last)
165 _ForwardIterator __i = __first;
167 while (__i != __last && __n != 1 && __unary_pred(*__i))
176 __first = std::__find_if(++__i, __last, __unary_pred);
185 template<
typename _RandomAccessIter,
typename _Integer,
186 typename _UnaryPredicate>
189 __search_n_aux(_RandomAccessIter __first, _RandomAccessIter __last,
190 _Integer __count, _UnaryPredicate __unary_pred,
191 std::random_access_iterator_tag)
193 typedef typename std::iterator_traits<_RandomAccessIter>::difference_type
196 _DistanceType __tailSize = __last - __first;
197 _DistanceType __remainder = __count;
199 while (__remainder <= __tailSize)
201 __first += __remainder;
202 __tailSize -= __remainder;
205 _RandomAccessIter __backTrack = __first;
206 while (__unary_pred(*--__backTrack))
208 if (--__remainder == 0)
209 return __first - _DistanceType(__count);
211 __remainder = __count + 1 - (__first - __backTrack);
216 template<
typename _ForwardIterator,
typename _Integer,
217 typename _UnaryPredicate>
220 __search_n(_ForwardIterator __first, _ForwardIterator __last,
222 _UnaryPredicate __unary_pred)
228 return std::__find_if(__first, __last, __unary_pred);
230 return std::__search_n_aux(__first, __last, __count, __unary_pred,
231 std::__iter_concept_or_category(__first));
235 template<
typename _ForwardIterator1,
typename _ForwardIterator2,
236 typename _BinaryPredicate>
239 __find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
240 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
242 _BinaryPredicate __comp)
244 if (__first2 == __last2)
247 _ForwardIterator1 __result = __last1;
250 _ForwardIterator1 __new_result
251 = std::__search(__first1, __last1, __first2, __last2, __comp);
252 if (__new_result == __last1)
256 __result = __new_result;
257 __first1 = __new_result;
264 template<
typename _BidirectionalIterator1,
typename _BidirectionalIterator2,
265 typename _BinaryPredicate>
267 _BidirectionalIterator1
268 __find_end(_BidirectionalIterator1 __first1,
269 _BidirectionalIterator1 __last1,
270 _BidirectionalIterator2 __first2,
271 _BidirectionalIterator2 __last2,
273 _BinaryPredicate __comp)
276 __glibcxx_function_requires(_BidirectionalIteratorConcept<
277 _BidirectionalIterator1>)
278 __glibcxx_function_requires(_BidirectionalIteratorConcept<
279 _BidirectionalIterator2>)
284 _RevIterator1 __rlast1(__first1);
285 _RevIterator2 __rlast2(__first2);
286 _RevIterator1 __rresult = std::__search(_RevIterator1(__last1), __rlast1,
287 _RevIterator2(__last2), __rlast2,
290 if (__rresult == __rlast1)
294 _BidirectionalIterator1 __result = __rresult.
base();
329 template<
typename _ForwardIterator1,
typename _ForwardIterator2>
330 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
331 inline _ForwardIterator1
332 find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
333 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
336 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
337 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
338 __glibcxx_function_requires(_EqualOpConcept<
341 __glibcxx_requires_valid_range(__first1, __last1);
342 __glibcxx_requires_valid_range(__first2, __last2);
344 return std::__find_end(__first1, __last1, __first2, __last2,
345 std::__iter_concept_or_category(__first1),
346 std::__iter_concept_or_category(__first2),
347 __gnu_cxx::__ops::equal_to());
378 template<
typename _ForwardIterator1,
typename _ForwardIterator2,
379 typename _BinaryPredicate>
380 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
381 inline _ForwardIterator1
382 find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
383 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
384 _BinaryPredicate __comp)
387 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
388 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
389 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
392 __glibcxx_requires_valid_range(__first1, __last1);
393 __glibcxx_requires_valid_range(__first2, __last2);
395 return std::__find_end(__first1, __last1, __first2, __last2,
396 std::__iter_concept_or_category(__first1),
397 std::__iter_concept_or_category(__first2),
401#if __cplusplus >= 201103L
414 template<
typename _InputIterator,
typename _Predicate>
415 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
417 all_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
418 {
return __last == std::find_if_not(__first, __last, __pred); }
432 template<
typename _InputIterator,
typename _Predicate>
433 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
435 none_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
436 {
return __last == _GLIBCXX_STD_A::find_if(__first, __last, __pred); }
451 template<
typename _InputIterator,
typename _Predicate>
452 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
454 any_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
455 {
return !std::none_of(__first, __last, __pred); }
467 template<
typename _InputIterator,
typename _Predicate>
468 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
469 inline _InputIterator
470 find_if_not(_InputIterator __first, _InputIterator __last,
474 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
475 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
477 __glibcxx_requires_valid_range(__first, __last);
478 return std::__find_if_not(__first, __last, __pred);
491 template<
typename _InputIterator,
typename _Predicate>
492 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
494 is_partitioned(_InputIterator __first, _InputIterator __last,
497 __first = std::find_if_not(__first, __last, __pred);
498 if (__first == __last)
501 return std::none_of(__first, __last, __pred);
513 template<
typename _ForwardIterator,
typename _Predicate>
514 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
516 partition_point(_ForwardIterator __first, _ForwardIterator __last,
520 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
521 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
525 __glibcxx_requires_valid_range(__first, __last);
534 _DistanceType __half = __len >> 1;
535 _ForwardIterator __middle = __first;
537 if (__pred(*__middle))
541 __len = __len - __half - 1;
550 template<
typename _InputIterator,
typename _OutputIterator,
554 __remove_copy_if(_InputIterator __first, _InputIterator __last,
555 _OutputIterator __result, _Predicate __pred)
557 for (; __first != __last; ++__first)
558 if (!__pred(*__first))
560 *__result = *__first;
580 template<
typename _InputIterator,
typename _OutputIterator,
typename _Tp>
582 inline _OutputIterator
583 remove_copy(_InputIterator __first, _InputIterator __last,
584 _OutputIterator __result,
const _Tp& __value)
587 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
588 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
590 __glibcxx_function_requires(_EqualOpConcept<
592 __glibcxx_requires_valid_range(__first, __last);
594 return std::__remove_copy_if(__first, __last, __result,
595 __gnu_cxx::__ops::__equal_to(__value));
613 template<
typename _InputIterator,
typename _OutputIterator,
616 inline _OutputIterator
617 remove_copy_if(_InputIterator __first, _InputIterator __last,
618 _OutputIterator __result, _Predicate __pred)
621 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
622 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
624 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
626 __glibcxx_requires_valid_range(__first, __last);
628 return std::__remove_copy_if(__first, __last, __result, __pred);
631#if __cplusplus >= 201103L
647 template<
typename _InputIterator,
typename _OutputIterator,
651 copy_if(_InputIterator __first, _InputIterator __last,
652 _OutputIterator __result, _Predicate __pred)
655 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
656 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
658 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
660 __glibcxx_requires_valid_range(__first, __last);
662 for (; __first != __last; ++__first)
663 if (__pred(*__first))
665 *__result = *__first;
684 template<
typename _InputIterator,
typename _Size,
typename _OutputIterator>
686 inline _OutputIterator
687 copy_n(_InputIterator __first, _Size __n, _OutputIterator __result)
690 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
691 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
694 const auto __n2 = std::__size_to_integer(__n);
698 __glibcxx_requires_can_increment(__first, __n2);
699 __glibcxx_requires_can_increment(__result, __n2);
701 auto __res = std::__copy_n_a(std::__niter_base(__first), __n2,
702 std::__niter_base(__result),
true);
703 return std::__niter_wrap(__result,
std::move(__res));
721 template<
typename _InputIterator,
typename _OutputIterator1,
722 typename _OutputIterator2,
typename _Predicate>
725 partition_copy(_InputIterator __first, _InputIterator __last,
726 _OutputIterator1 __out_true, _OutputIterator2 __out_false,
730 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
731 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator1,
733 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator2,
735 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
737 __glibcxx_requires_valid_range(__first, __last);
739 for (; __first != __last; ++__first)
740 if (__pred(*__first))
742 *__out_true = *__first;
747 *__out_false = *__first;
772 template<
typename _ForwardIterator,
typename _Tp>
773 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
774 inline _ForwardIterator
775 remove(_ForwardIterator __first, _ForwardIterator __last,
779 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
781 __glibcxx_function_requires(_EqualOpConcept<
783 __glibcxx_requires_valid_range(__first, __last);
785 return std::__remove_if(__first, __last,
786 __gnu_cxx::__ops::__equal_to(__value));
806 template<
typename _ForwardIterator,
typename _Predicate>
807 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
808 inline _ForwardIterator
809 remove_if(_ForwardIterator __first, _ForwardIterator __last,
813 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
815 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
817 __glibcxx_requires_valid_range(__first, __last);
819 return std::__remove_if(__first, __last, __pred);
822 template<
typename _ForwardIterator,
typename _BinaryPredicate>
825 __adjacent_find(_ForwardIterator __first, _ForwardIterator __last,
826 _BinaryPredicate __binary_pred)
828 if (__first == __last)
830 _ForwardIterator __next = __first;
831 while (++__next != __last)
833 if (__binary_pred(*__first, *__next))
840 template<
typename _ForwardIterator,
typename _BinaryPredicate>
843 __unique(_ForwardIterator __first, _ForwardIterator __last,
844 _BinaryPredicate __binary_pred)
847 __first = std::__adjacent_find(__first, __last, __binary_pred);
848 if (__first == __last)
852 _ForwardIterator __dest = __first;
854 while (++__first != __last)
855 if (!__binary_pred(*__dest, *__first))
856 *++__dest = _GLIBCXX_MOVE(*__first);
874 template<
typename _ForwardIterator>
875 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
876 inline _ForwardIterator
877 unique(_ForwardIterator __first, _ForwardIterator __last)
880 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
882 __glibcxx_function_requires(_EqualityComparableConcept<
884 __glibcxx_requires_valid_range(__first, __last);
886 return std::__unique(__first, __last, __gnu_cxx::__ops::equal_to());
904 template<
typename _ForwardIterator,
typename _BinaryPredicate>
905 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
906 inline _ForwardIterator
907 unique(_ForwardIterator __first, _ForwardIterator __last,
908 _BinaryPredicate __binary_pred)
911 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
913 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
916 __glibcxx_requires_valid_range(__first, __last);
918 return std::__unique(__first, __last, __binary_pred);
928 template<
typename _ForwardIterator,
typename _OutputIterator,
929 typename _BinaryPredicate>
932 __unique_copy(_ForwardIterator __first, _ForwardIterator __last,
933 _OutputIterator __result, _BinaryPredicate __binary_pred,
934 forward_iterator_tag)
936 _ForwardIterator __prev = __first;
937 *__result = *__first;
938 while (++__first != __last)
939 if (!__binary_pred(*__prev, *__first))
941 *++__result = *__first;
949 template<
typename _InputIterator,
typename _OutputIterator,
950 typename _BinaryPredicate>
953 __unique_copy_1(_InputIterator __first, _InputIterator __last,
954 _OutputIterator __result, _BinaryPredicate __binary_pred,
958 _Val __value = *__first;
960 while (++__first != __last)
961 if (!__binary_pred(__value, *__first))
964 *++__result = __value;
971 template<
typename _InputIterator,
typename _ForwardIterator,
972 typename _BinaryPredicate>
974 __unique_copy_1(_InputIterator __first, _InputIterator __last,
975 _ForwardIterator __result, _BinaryPredicate __binary_pred,
978 *__result = *__first;
979 while (++__first != __last)
980 if (!__binary_pred(*__result, *__first))
981 *++__result = *__first;
988 template<
typename _InputIterator,
typename _OutputIterator,
989 typename _BinaryPredicate>
992 __unique_copy(_InputIterator __first, _InputIterator __last,
993 _OutputIterator __result, _BinaryPredicate __binary_pred,
1000 typedef typename _OutItTraits::iterator_category _Cat;
1002 const bool __same_type = __is_same(
typename _OutItTraits::value_type,
1003 typename _InItTraits::value_type);
1004 typedef __truth_type<__output_is_fwd && __same_type> __cmp_with_output;
1005 return std::__unique_copy_1(__first, __last, __result, __binary_pred,
1006 typename __cmp_with_output::__type());
1015 template<
typename _B
idirectionalIterator>
1016 _GLIBCXX20_CONSTEXPR
1018 __reverse(_BidirectionalIterator __first, _BidirectionalIterator __last,
1022 if (__first == __last || __first == --__last)
1026 std::iter_swap(__first, __last);
1036 template<
typename _RandomAccessIterator>
1037 _GLIBCXX20_CONSTEXPR
1039 __reverse(_RandomAccessIterator __first, _RandomAccessIterator __last,
1042 if (__first == __last)
1045 while (__first < __last)
1047 std::iter_swap(__first, __last);
1066 template<
typename _B
idirectionalIterator>
1067 _GLIBCXX20_CONSTEXPR
1069 reverse(_BidirectionalIterator __first, _BidirectionalIterator __last)
1072 __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
1073 _BidirectionalIterator>)
1074 __glibcxx_requires_valid_range(__first, __last);
1075 std::__reverse(__first, __last, std::__iterator_category(__first));
1094 template<
typename _B
idirectionalIterator,
typename _OutputIterator>
1095 _GLIBCXX20_CONSTEXPR
1097 reverse_copy(_BidirectionalIterator __first, _BidirectionalIterator __last,
1098 _OutputIterator __result)
1101 __glibcxx_function_requires(_BidirectionalIteratorConcept<
1102 _BidirectionalIterator>)
1103 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
1105 __glibcxx_requires_valid_range(__first, __last);
1107 while (__first != __last)
1110 *__result = *__last;
1122 template<
typename _Eucl
ideanRingElement>
1123 _GLIBCXX20_CONSTEXPR
1124 _EuclideanRingElement
1125 __gcd(_EuclideanRingElement __m, _EuclideanRingElement __n)
1129 _EuclideanRingElement __t = __m % __n;
1137_GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE(_V2)
1142 template<
typename _ForwardIterator>
1143 _GLIBCXX20_CONSTEXPR
1145 __rotate(_ForwardIterator __first,
1146 _ForwardIterator __middle,
1147 _ForwardIterator __last,
1150 if (__first == __middle)
1152 else if (__last == __middle)
1155 _ForwardIterator __first2 = __middle;
1158 std::iter_swap(__first, __first2);
1161 if (__first == __middle)
1162 __middle = __first2;
1164 while (__first2 != __last);
1166 _ForwardIterator __ret = __first;
1168 __first2 = __middle;
1170 while (__first2 != __last)
1172 std::iter_swap(__first, __first2);
1175 if (__first == __middle)
1176 __middle = __first2;
1177 else if (__first2 == __last)
1178 __first2 = __middle;
1184 template<
typename _B
idirectionalIterator>
1185 _GLIBCXX20_CONSTEXPR
1186 _BidirectionalIterator
1187 __rotate(_BidirectionalIterator __first,
1188 _BidirectionalIterator __middle,
1189 _BidirectionalIterator __last,
1193 __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
1194 _BidirectionalIterator>)
1196 if (__first == __middle)
1198 else if (__last == __middle)
1204 while (__first != __middle && __middle != __last)
1206 std::iter_swap(__first, --__last);
1210 if (__first == __middle)
1223 template<
typename _RandomAccessIterator>
1224 _GLIBCXX20_CONSTEXPR
1225 _RandomAccessIterator
1226 __rotate(_RandomAccessIterator __first,
1227 _RandomAccessIterator __middle,
1228 _RandomAccessIterator __last,
1232 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
1233 _RandomAccessIterator>)
1235 if (__first == __middle)
1237 else if (__last == __middle)
1245#if __cplusplus >= 201103L
1246 typedef typename make_unsigned<_Distance>::type _UDistance;
1248 typedef _Distance _UDistance;
1251 _Distance __n = __last - __first;
1252 _Distance __k = __middle - __first;
1254 if (__k == __n - __k)
1256 std::swap_ranges(__first, __middle, __middle);
1260 _RandomAccessIterator __p = __first;
1261 _RandomAccessIterator __ret = __first + (__last - __middle);
1265 if (__k < __n - __k)
1267 if (__is_pod(_ValueType) && __k == 1)
1269 _RandomAccessIterator __mid = __p + _Distance(__n - 1);
1270 _RandomAccessIterator __end = __mid;
1272 _ValueType __t = _GLIBCXX_MOVE(*__p);
1273 _GLIBCXX_MOVE3(__p + _Distance(1), __end, __p);
1274 *__mid = _GLIBCXX_MOVE(__t);
1277 _RandomAccessIterator __q = __p + __k;
1278 for (_Distance __i = 0; __i < __n - __k; ++ __i)
1280 std::iter_swap(__p, __q);
1284 __n =
static_cast<_UDistance
>(__n) %
static_cast<_UDistance
>(__k);
1287 std::swap(__n, __k);
1293 if (__is_pod(_ValueType) && __k == 1)
1295 _RandomAccessIterator __mid = __p + _Distance(__n - 1);
1296 _RandomAccessIterator __end = __mid;
1298 _ValueType __t = _GLIBCXX_MOVE(*__mid);
1299 _GLIBCXX_MOVE_BACKWARD3(__p, __mid, __end);
1300 *__p = _GLIBCXX_MOVE(__t);
1303 _RandomAccessIterator __q = __p + __n;
1305 for (_Distance __i = 0; __i < __n - __k; ++ __i)
1309 std::iter_swap(__p, __q);
1311 __n =
static_cast<_UDistance
>(__n) %
static_cast<_UDistance
>(__k);
1314 std::swap(__n, __k);
1344 template<
typename _ForwardIterator>
1345 _GLIBCXX20_CONSTEXPR
1346 inline _ForwardIterator
1347 rotate(_ForwardIterator __first, _ForwardIterator __middle,
1348 _ForwardIterator __last)
1351 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
1353 __glibcxx_requires_valid_range(__first, __middle);
1354 __glibcxx_requires_valid_range(__middle, __last);
1356 return std::__rotate(__first, __middle, __last,
1357 std::__iterator_category(__first));
1360_GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)
1382 template<
typename _ForwardIterator,
typename _OutputIterator>
1383 _GLIBCXX20_CONSTEXPR
1384 inline _OutputIterator
1385 rotate_copy(_ForwardIterator __first, _ForwardIterator __middle,
1386 _ForwardIterator __last, _OutputIterator __result)
1389 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
1390 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
1392 __glibcxx_requires_valid_range(__first, __middle);
1393 __glibcxx_requires_valid_range(__middle, __last);
1395 return std::copy(__first, __middle,
1396 std::copy(__middle, __last, __result));
1402 template<
typename _ForwardIterator,
typename _Predicate>
1403 _GLIBCXX20_CONSTEXPR
1405 __partition(_ForwardIterator __first, _ForwardIterator __last,
1406 _Predicate __pred, forward_iterator_tag)
1408 if (__first == __last)
1411 while (__pred(*__first))
1412 if (++__first == __last)
1415 _ForwardIterator __next = __first;
1417 while (++__next != __last)
1418 if (__pred(*__next))
1420 std::iter_swap(__first, __next);
1428 template<
typename _B
idirectionalIterator,
typename _Predicate>
1429 _GLIBCXX20_CONSTEXPR
1430 _BidirectionalIterator
1431 __partition(_BidirectionalIterator __first, _BidirectionalIterator __last,
1437 if (__first == __last)
1439 else if (__pred(*__first))
1445 if (__first == __last)
1447 else if (!
bool(__pred(*__last)))
1451 std::iter_swap(__first, __last);
1468 template<
typename _ForwardIterator,
typename _Pointer,
typename _Predicate,
1470 _GLIBCXX26_CONSTEXPR
1472 __stable_partition_adaptive(_ForwardIterator __first,
1473 _ForwardIterator __last,
1474 _Predicate __pred, _Distance __len,
1476 _Distance __buffer_size)
1481 if (__len <= __buffer_size)
1483 _ForwardIterator __result1 = __first;
1484 _Pointer __result2 = __buffer;
1489 *__result2 = _GLIBCXX_MOVE(*__first);
1492 for (; __first != __last; ++__first)
1493 if (__pred(*__first))
1495 *__result1 = _GLIBCXX_MOVE(*__first);
1500 *__result2 = _GLIBCXX_MOVE(*__first);
1504 _GLIBCXX_MOVE3(__buffer, __result2, __result1);
1508 _ForwardIterator __middle = __first;
1510 _ForwardIterator __left_split =
1511 std::__stable_partition_adaptive(__first, __middle, __pred,
1512 __len / 2, __buffer,
1517 _Distance __right_len = __len - __len / 2;
1518 _ForwardIterator __right_split =
1519 std::__find_if_not_n(__middle, __right_len, __pred);
1523 std::__stable_partition_adaptive(__right_split, __last, __pred,
1525 __buffer, __buffer_size);
1527 return std::rotate(__left_split, __middle, __right_split);
1530 template<
typename _ForwardIterator,
typename _Predicate>
1531 _GLIBCXX26_CONSTEXPR
1533 __stable_partition(_ForwardIterator __first, _ForwardIterator __last,
1536 __first = std::__find_if_not(__first, __last, __pred);
1538 if (__first == __last)
1548#if __glibcxx_constexpr_algorithms >= 202306L
1553 return std::__stable_partition_adaptive(__first, __last, __pred,
1561 __buf(__first, __len);
1563 std::__stable_partition_adaptive(__first, __last, __pred,
1566 _DistanceType(__buf.size()));
1587 template<
typename _ForwardIterator,
typename _Predicate>
1588 _GLIBCXX26_CONSTEXPR
1589 inline _ForwardIterator
1590 stable_partition(_ForwardIterator __first, _ForwardIterator __last,
1594 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
1596 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
1598 __glibcxx_requires_valid_range(__first, __last);
1600 return std::__stable_partition(__first, __last, __pred);
1607 template<
typename _RandomAccessIterator,
typename _Compare>
1608 _GLIBCXX20_CONSTEXPR
1610 __heap_select(_RandomAccessIterator __first,
1611 _RandomAccessIterator __middle,
1612 _RandomAccessIterator __last, _Compare __comp)
1614 std::__make_heap(__first, __middle, __comp);
1615 for (_RandomAccessIterator __i = __middle; __i < __last; ++__i)
1616 if (__comp(*__i, *__first))
1617 std::__pop_heap(__first, __middle, __i, __comp);
1622 template<
typename _InputIterator,
typename _RandomAccessIterator,
1624 _GLIBCXX20_CONSTEXPR
1625 _RandomAccessIterator
1626 __partial_sort_copy(_InputIterator __first, _InputIterator __last,
1627 _RandomAccessIterator __result_first,
1628 _RandomAccessIterator __result_last,
1634 typedef typename _RItTraits::difference_type _DistanceType;
1636 if (__result_first == __result_last)
1637 return __result_last;
1638 _RandomAccessIterator __result_real_last = __result_first;
1639 while (__first != __last && __result_real_last != __result_last)
1641 *__result_real_last = *__first;
1642 ++__result_real_last;
1646 std::__make_heap(__result_first, __result_real_last, __comp);
1647 while (__first != __last)
1649 if (__comp(*__first, *__result_first))
1650 std::__adjust_heap(__result_first, _DistanceType(0),
1651 _DistanceType(__result_real_last
1653 _InputValueType(*__first), __comp);
1656 std::__sort_heap(__result_first, __result_real_last, __comp);
1657 return __result_real_last;
1680 template<
typename _InputIterator,
typename _RandomAccessIterator>
1681 _GLIBCXX20_CONSTEXPR
1682 inline _RandomAccessIterator
1683 partial_sort_copy(_InputIterator __first, _InputIterator __last,
1684 _RandomAccessIterator __result_first,
1685 _RandomAccessIterator __result_last)
1687#ifdef _GLIBCXX_CONCEPT_CHECKS
1695 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
1696 __glibcxx_function_requires(_ConvertibleConcept<_InputValueType,
1698 __glibcxx_function_requires(_LessThanOpConcept<_InputValueType,
1700 __glibcxx_function_requires(_LessThanComparableConcept<_OutputValueType>)
1701 __glibcxx_requires_valid_range(__first, __last);
1702 __glibcxx_requires_irreflexive(__first, __last);
1703 __glibcxx_requires_valid_range(__result_first, __result_last);
1705 return std::__partial_sort_copy(__first, __last,
1706 __result_first, __result_last,
1707 __gnu_cxx::__ops::less());
1730 template<
typename _InputIterator,
typename _RandomAccessIterator,
1732 _GLIBCXX20_CONSTEXPR
1733 inline _RandomAccessIterator
1734 partial_sort_copy(_InputIterator __first, _InputIterator __last,
1735 _RandomAccessIterator __result_first,
1736 _RandomAccessIterator __result_last,
1739#ifdef _GLIBCXX_CONCEPT_CHECKS
1747 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
1748 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
1749 _RandomAccessIterator>)
1750 __glibcxx_function_requires(_ConvertibleConcept<_InputValueType,
1752 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
1753 _InputValueType, _OutputValueType>)
1754 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
1755 _OutputValueType, _OutputValueType>)
1756 __glibcxx_requires_valid_range(__first, __last);
1757 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
1758 __glibcxx_requires_valid_range(__result_first, __result_last);
1760 return std::__partial_sort_copy(__first, __last,
1761 __result_first, __result_last,
1768 template<
typename _RandomAccessIterator,
typename _Compare>
1769 _GLIBCXX20_CONSTEXPR
1771 __unguarded_linear_insert(_RandomAccessIterator __last,
1774 typename iterator_traits<_RandomAccessIterator>::value_type
1775 __val = _GLIBCXX_MOVE(*__last);
1776 _RandomAccessIterator __next = __last;
1778 while (__comp(__val, *__next))
1780 *__last = _GLIBCXX_MOVE(*__next);
1784 *__last = _GLIBCXX_MOVE(__val);
1788 template<
typename _RandomAccessIterator,
typename _Compare>
1789 _GLIBCXX20_CONSTEXPR
1791 __insertion_sort(_RandomAccessIterator __first,
1792 _RandomAccessIterator __last, _Compare __comp)
1794 if (__first == __last)
1798 typedef typename _IterTraits::difference_type _Dist;
1800 for (_RandomAccessIterator __i = __first + _Dist(1); __i != __last; ++__i)
1802 if (__comp(*__i, *__first))
1804 typename _IterTraits::value_type __val = _GLIBCXX_MOVE(*__i);
1805 _GLIBCXX_MOVE_BACKWARD3(__first, __i, __i + _Dist(1));
1806 *__first = _GLIBCXX_MOVE(__val);
1809 std::__unguarded_linear_insert(__i, __comp);
1814 template<
typename _RandomAccessIterator,
typename _Compare>
1815 _GLIBCXX20_CONSTEXPR
1817 __unguarded_insertion_sort(_RandomAccessIterator __first,
1818 _RandomAccessIterator __last, _Compare __comp)
1820 for (_RandomAccessIterator __i = __first; __i != __last; ++__i)
1821 std::__unguarded_linear_insert(__i, __comp);
1828 enum { _S_threshold = 16 };
1831 template<
typename _RandomAccessIterator,
typename _Compare>
1832 _GLIBCXX20_CONSTEXPR
1834 __final_insertion_sort(_RandomAccessIterator __first,
1835 _RandomAccessIterator __last, _Compare __comp)
1838 __threshold = _S_threshold;
1840 if (__last - __first > __threshold)
1842 std::__insertion_sort(__first, __first + __threshold, __comp);
1843 std::__unguarded_insertion_sort(__first + __threshold, __last,
1847 std::__insertion_sort(__first, __last, __comp);
1851 template<
typename _RandomAccessIterator,
typename _Compare>
1852 _GLIBCXX20_CONSTEXPR
1853 _RandomAccessIterator
1854 __unguarded_partition(_RandomAccessIterator __first,
1855 _RandomAccessIterator __last,
1856 _RandomAccessIterator __pivot, _Compare __comp)
1860 while (__comp(*__first, *__pivot))
1863 while (__comp(*__pivot, *__last))
1865 if (!(__first < __last))
1867 std::iter_swap(__first, __last);
1873 template<
typename _RandomAccessIterator,
typename _Compare>
1874 _GLIBCXX20_CONSTEXPR
1875 inline _RandomAccessIterator
1876 __unguarded_partition_pivot(_RandomAccessIterator __first,
1877 _RandomAccessIterator __last, _Compare __comp)
1880 typedef typename _IterTraits::difference_type _Dist;
1882 _RandomAccessIterator __mid = __first + _Dist((__last - __first) / 2);
1883 _RandomAccessIterator __second = __first + _Dist(1);
1884 std::__move_median_to_first(__first, __second, __mid, __last - _Dist(1),
1886 return std::__unguarded_partition(__second, __last, __first, __comp);
1889 template<
typename _RandomAccessIterator,
typename _Compare>
1890 _GLIBCXX20_CONSTEXPR
1892 __partial_sort(_RandomAccessIterator __first,
1893 _RandomAccessIterator __middle,
1894 _RandomAccessIterator __last,
1897 std::__heap_select(__first, __middle, __last, __comp);
1898 std::__sort_heap(__first, __middle, __comp);
1902 template<
typename _RandomAccessIterator,
typename _Size,
typename _Compare>
1903 _GLIBCXX20_CONSTEXPR
1905 __introsort_loop(_RandomAccessIterator __first,
1906 _RandomAccessIterator __last,
1907 _Size __depth_limit, _Compare __comp)
1909 while (__last - __first >
int(_S_threshold))
1911 if (__depth_limit == 0)
1913 std::__partial_sort(__first, __last, __last, __comp);
1917 _RandomAccessIterator __cut =
1918 std::__unguarded_partition_pivot(__first, __last, __comp);
1919 std::__introsort_loop(__cut, __last, __depth_limit, __comp);
1926 template<
typename _RandomAccessIterator,
typename _Compare>
1927 _GLIBCXX20_CONSTEXPR
1929 __sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
1932 if (__first != __last)
1934 std::__introsort_loop(__first, __last,
1937 std::__final_insertion_sort(__first, __last, __comp);
1941 template<
typename _RandomAccessIterator,
typename _Size,
typename _Compare>
1942 _GLIBCXX20_CONSTEXPR
1944 __introselect(_RandomAccessIterator __first, _RandomAccessIterator __nth,
1945 _RandomAccessIterator __last, _Size __depth_limit,
1948 _RandomAccessIterator __after_nth = __nth;
1951 while (__last - __first > 3)
1953 if (__depth_limit == 0)
1955 std::__heap_select(__first, __after_nth, __last, __comp);
1957 std::iter_swap(__first, __nth);
1961 _RandomAccessIterator __cut =
1962 std::__unguarded_partition_pivot(__first, __last, __comp);
1968 std::__insertion_sort(__first, __last, __comp);
1992 template<
typename _ForwardIterator,
typename _Tp,
typename _Compare>
1993 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1994 inline _ForwardIterator
1995 lower_bound(_ForwardIterator __first, _ForwardIterator __last,
1996 const _Tp& __val, _Compare __comp)
1999 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2000 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2002 __glibcxx_requires_partitioned_lower_pred(__first, __last,
2005 return std::__lower_bound(__first, __last, __val, __comp);
2010 template<
typename _ForwardIterator,
typename _Tp,
typename _Compare>
2011 _GLIBCXX20_CONSTEXPR
2013 __upper_bound(_ForwardIterator __first, _ForwardIterator __last,
2014 const _Tp& __val, _Compare __comp)
2016 typedef typename iterator_traits<_ForwardIterator>::difference_type
2023 _DistanceType __half = __len >> 1;
2024 _ForwardIterator __middle = __first;
2026 if (__comp(__val, *__middle))
2032 __len = __len - __half - 1;
2050 template<
typename _ForwardIterator,
typename _Tp>
2051 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
2052 inline _ForwardIterator
2053 upper_bound(_ForwardIterator __first, _ForwardIterator __last,
2057 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2058 __glibcxx_function_requires(_LessThanOpConcept<
2060 __glibcxx_requires_partitioned_upper(__first, __last, __val);
2062 return std::__upper_bound(__first, __last, __val,
2063 __gnu_cxx::__ops::less());
2081 template<
typename _ForwardIterator,
typename _Tp,
typename _Compare>
2082 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
2083 inline _ForwardIterator
2084 upper_bound(_ForwardIterator __first, _ForwardIterator __last,
2085 const _Tp& __val, _Compare __comp)
2088 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2089 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2091 __glibcxx_requires_partitioned_upper_pred(__first, __last,
2094 return std::__upper_bound(__first, __last, __val, __comp);
2098 template<
typename _ForwardIterator,
typename _Tp,
typename _Compare>
2099 _GLIBCXX20_CONSTEXPR
2101 __equal_range(_ForwardIterator __first, _ForwardIterator __last,
2102 const _Tp& __val, _Compare __comp)
2104 typedef typename iterator_traits<_ForwardIterator>::difference_type
2111 _DistanceType __half = __len >> 1;
2112 _ForwardIterator __middle = __first;
2114 if (__comp(*__middle, __val))
2118 __len = __len - __half - 1;
2120 else if (__comp(__val, *__middle))
2124 _ForwardIterator __left
2125 = std::__lower_bound(__first, __middle, __val, __comp);
2127 _ForwardIterator __right
2128 = std::__upper_bound(++__middle, __first, __val, __comp);
2153 template<
typename _ForwardIterator,
typename _Tp>
2154 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
2156 equal_range(_ForwardIterator __first, _ForwardIterator __last,
2160 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2161 __glibcxx_function_requires(_LessThanOpConcept<
2163 __glibcxx_function_requires(_LessThanOpConcept<
2165 __glibcxx_requires_partitioned_lower(__first, __last, __val);
2166 __glibcxx_requires_partitioned_upper(__first, __last, __val);
2168 return std::__equal_range(__first, __last, __val,
2169 __gnu_cxx::__ops::less());
2189 template<
typename _ForwardIterator,
typename _Tp,
typename _Compare>
2190 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
2192 equal_range(_ForwardIterator __first, _ForwardIterator __last,
2193 const _Tp& __val, _Compare __comp)
2196 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2197 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2199 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2201 __glibcxx_requires_partitioned_lower_pred(__first, __last,
2203 __glibcxx_requires_partitioned_upper_pred(__first, __last,
2206 return std::__equal_range(__first, __last, __val, __comp);
2220 template<
typename _ForwardIterator,
typename _Tp>
2221 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
2223 binary_search(_ForwardIterator __first, _ForwardIterator __last,
2227 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2228 __glibcxx_function_requires(_LessThanOpConcept<
2230 __glibcxx_requires_partitioned_lower(__first, __last, __val);
2231 __glibcxx_requires_partitioned_upper(__first, __last, __val);
2233 _ForwardIterator __i
2234 = std::__lower_bound(__first, __last, __val, __gnu_cxx::__ops::less());
2235 return __i != __last && !(__val < *__i);
2253 template<
typename _ForwardIterator,
typename _Tp,
typename _Compare>
2254 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
2256 binary_search(_ForwardIterator __first, _ForwardIterator __last,
2257 const _Tp& __val, _Compare __comp)
2260 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2261 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2263 __glibcxx_requires_partitioned_lower_pred(__first, __last,
2265 __glibcxx_requires_partitioned_upper_pred(__first, __last,
2268 _ForwardIterator __i
2269 = std::__lower_bound(__first, __last, __val, __comp);
2270 return __i != __last && !bool(__comp(__val, *__i));
2278 template<
typename _InputIterator1,
typename _InputIterator2,
2279 typename _OutputIterator,
typename _Compare>
2281 __move_merge_adaptive(_InputIterator1 __first1, _InputIterator1 __last1,
2282 _InputIterator2 __first2, _InputIterator2 __last2,
2283 _OutputIterator __result, _Compare __comp)
2285 while (__first1 != __last1 && __first2 != __last2)
2287 if (__comp(*__first2, *__first1))
2289 *__result = _GLIBCXX_MOVE(*__first2);
2294 *__result = _GLIBCXX_MOVE(*__first1);
2299 if (__first1 != __last1)
2300 _GLIBCXX_MOVE3(__first1, __last1, __result);
2304 template<
typename _BidirectionalIterator1,
typename _BidirectionalIterator2,
2305 typename _BidirectionalIterator3,
typename _Compare>
2307 __move_merge_adaptive_backward(_BidirectionalIterator1 __first1,
2308 _BidirectionalIterator1 __last1,
2309 _BidirectionalIterator2 __first2,
2310 _BidirectionalIterator2 __last2,
2311 _BidirectionalIterator3 __result,
2314 if (__first1 == __last1)
2316 _GLIBCXX_MOVE_BACKWARD3(__first2, __last2, __result);
2319 else if (__first2 == __last2)
2326 if (__comp(*__last2, *__last1))
2328 *--__result = _GLIBCXX_MOVE(*__last1);
2329 if (__first1 == __last1)
2331 _GLIBCXX_MOVE_BACKWARD3(__first2, ++__last2, __result);
2338 *--__result = _GLIBCXX_MOVE(*__last2);
2339 if (__first2 == __last2)
2347 template<
typename _BidirectionalIterator1,
typename _BidirectionalIterator2,
2349 _BidirectionalIterator1
2350 __rotate_adaptive(_BidirectionalIterator1 __first,
2351 _BidirectionalIterator1 __middle,
2352 _BidirectionalIterator1 __last,
2353 _Distance __len1, _Distance __len2,
2354 _BidirectionalIterator2 __buffer,
2355 _Distance __buffer_size)
2357 _BidirectionalIterator2 __buffer_end;
2358 if (__len1 > __len2 && __len2 <= __buffer_size)
2362 __buffer_end = _GLIBCXX_MOVE3(__middle, __last, __buffer);
2363 _GLIBCXX_MOVE_BACKWARD3(__first, __middle, __last);
2364 return _GLIBCXX_MOVE3(__buffer, __buffer_end, __first);
2369 else if (__len1 <= __buffer_size)
2373 __buffer_end = _GLIBCXX_MOVE3(__first, __middle, __buffer);
2374 _GLIBCXX_MOVE3(__middle, __last, __first);
2375 return _GLIBCXX_MOVE_BACKWARD3(__buffer, __buffer_end, __last);
2381 return std::rotate(__first, __middle, __last);
2385 template<
typename _BidirectionalIterator,
typename _Distance,
2386 typename _Pointer,
typename _Compare>
2388 __merge_adaptive(_BidirectionalIterator __first,
2389 _BidirectionalIterator __middle,
2390 _BidirectionalIterator __last,
2391 _Distance __len1, _Distance __len2,
2392 _Pointer __buffer, _Compare __comp)
2394 if (__len1 <= __len2)
2396 _Pointer __buffer_end = _GLIBCXX_MOVE3(__first, __middle, __buffer);
2397 std::__move_merge_adaptive(__buffer, __buffer_end, __middle, __last,
2402 _Pointer __buffer_end = _GLIBCXX_MOVE3(__middle, __last, __buffer);
2403 std::__move_merge_adaptive_backward(__first, __middle, __buffer,
2404 __buffer_end, __last, __comp);
2408 template<
typename _BidirectionalIterator,
typename _Distance,
2409 typename _Pointer,
typename _Compare>
2411 __merge_adaptive_resize(_BidirectionalIterator __first,
2412 _BidirectionalIterator __middle,
2413 _BidirectionalIterator __last,
2414 _Distance __len1, _Distance __len2,
2415 _Pointer __buffer, _Distance __buffer_size,
2418 if (__len1 <= __buffer_size || __len2 <= __buffer_size)
2419 std::__merge_adaptive(__first, __middle, __last,
2420 __len1, __len2, __buffer, __comp);
2423 _BidirectionalIterator __first_cut = __first;
2424 _BidirectionalIterator __second_cut = __middle;
2425 _Distance __len11 = 0;
2426 _Distance __len22 = 0;
2427 if (__len1 > __len2)
2429 __len11 = __len1 / 2;
2432 = std::__lower_bound(__middle, __last, *__first_cut, __comp);
2437 __len22 = __len2 / 2;
2440 = std::__upper_bound(__first, __middle, *__second_cut, __comp);
2444 _BidirectionalIterator __new_middle
2445 = std::__rotate_adaptive(__first_cut, __middle, __second_cut,
2446 _Distance(__len1 - __len11), __len22,
2447 __buffer, __buffer_size);
2448 std::__merge_adaptive_resize(__first, __first_cut, __new_middle,
2450 __buffer, __buffer_size, __comp);
2451 std::__merge_adaptive_resize(__new_middle, __second_cut, __last,
2452 _Distance(__len1 - __len11),
2453 _Distance(__len2 - __len22),
2454 __buffer, __buffer_size, __comp);
2459 template<
typename _BidirectionalIterator,
typename _Distance,
2461 _GLIBCXX26_CONSTEXPR
2463 __merge_without_buffer(_BidirectionalIterator __first,
2464 _BidirectionalIterator __middle,
2465 _BidirectionalIterator __last,
2466 _Distance __len1, _Distance __len2,
2469 if (__len1 == 0 || __len2 == 0)
2472 if (__len1 + __len2 == 2)
2474 if (__comp(*__middle, *__first))
2475 std::iter_swap(__first, __middle);
2479 _BidirectionalIterator __first_cut = __first;
2480 _BidirectionalIterator __second_cut = __middle;
2481 _Distance __len11 = 0;
2482 _Distance __len22 = 0;
2483 if (__len1 > __len2)
2485 __len11 = __len1 / 2;
2488 = std::__lower_bound(__middle, __last, *__first_cut, __comp);
2493 __len22 = __len2 / 2;
2496 = std::__upper_bound(__first, __middle, *__second_cut, __comp);
2500 _BidirectionalIterator __new_middle
2501 = std::rotate(__first_cut, __middle, __second_cut);
2502 std::__merge_without_buffer(__first, __first_cut, __new_middle,
2503 __len11, __len22, __comp);
2504 std::__merge_without_buffer(__new_middle, __second_cut, __last,
2505 __len1 - __len11, __len2 - __len22, __comp);
2508 template<
typename _B
idirectionalIterator,
typename _Compare>
2509 _GLIBCXX26_CONSTEXPR
2511 __inplace_merge(_BidirectionalIterator __first,
2512 _BidirectionalIterator __middle,
2513 _BidirectionalIterator __last,
2521 if (__first == __middle || __middle == __last)
2524 const _DistanceType __len1 =
std::distance(__first, __middle);
2525 const _DistanceType __len2 =
std::distance(__middle, __last);
2528# if __glibcxx_constexpr_algorithms >= 202306L
2530 return std::__merge_without_buffer
2531 (__first, __middle, __last, __len1, __len2, __comp);
2537 _TmpBuf __buf(__first,
std::min(__len1, __len2));
2539 if (__builtin_expect(__buf.size() == __buf._M_requested_size(),
true))
2540 std::__merge_adaptive
2541 (__first, __middle, __last, __len1, __len2, __buf.begin(), __comp);
2542 else if (__builtin_expect(__buf.begin() == 0,
false))
2543 std::__merge_without_buffer
2544 (__first, __middle, __last, __len1, __len2, __comp);
2546 std::__merge_adaptive_resize
2547 (__first, __middle, __last, __len1, __len2, __buf.begin(),
2548 _DistanceType(__buf.size()), __comp);
2550 std::__merge_without_buffer
2551 (__first, __middle, __last, __len1, __len2, __comp);
2573 template<
typename _B
idirectionalIterator>
2574 _GLIBCXX26_CONSTEXPR
2576 inplace_merge(_BidirectionalIterator __first,
2577 _BidirectionalIterator __middle,
2578 _BidirectionalIterator __last)
2581 __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
2582 _BidirectionalIterator>)
2583 __glibcxx_function_requires(_LessThanComparableConcept<
2585 __glibcxx_requires_sorted(__first, __middle);
2586 __glibcxx_requires_sorted(__middle, __last);
2587 __glibcxx_requires_irreflexive(__first, __last);
2589 std::__inplace_merge(__first, __middle, __last,
2590 __gnu_cxx::__ops::less());
2614 template<
typename _B
idirectionalIterator,
typename _Compare>
2615 _GLIBCXX26_CONSTEXPR
2617 inplace_merge(_BidirectionalIterator __first,
2618 _BidirectionalIterator __middle,
2619 _BidirectionalIterator __last,
2623 __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
2624 _BidirectionalIterator>)
2625 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2628 __glibcxx_requires_sorted_pred(__first, __middle, __comp);
2629 __glibcxx_requires_sorted_pred(__middle, __last, __comp);
2630 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
2632 std::__inplace_merge(__first, __middle, __last, __comp);
2638 template<
typename _InputIterator,
typename _OutputIterator,
2641 __move_merge(_InputIterator __first1, _InputIterator __last1,
2642 _InputIterator __first2, _InputIterator __last2,
2643 _OutputIterator __result, _Compare __comp)
2645 while (__first1 != __last1 && __first2 != __last2)
2647 if (__comp(*__first2, *__first1))
2649 *__result = _GLIBCXX_MOVE(*__first2);
2654 *__result = _GLIBCXX_MOVE(*__first1);
2659 return _GLIBCXX_MOVE3(__first2, __last2,
2660 _GLIBCXX_MOVE3(__first1, __last1,
2664 template<
typename _RandomAccessIterator1,
typename _RandomAccessIterator2,
2665 typename _Distance,
typename _Compare>
2667 __merge_sort_loop(_RandomAccessIterator1 __first,
2668 _RandomAccessIterator1 __last,
2669 _RandomAccessIterator2 __result, _Distance __step_size,
2672 const _Distance __two_step = 2 * __step_size;
2674 while (__last - __first >= __two_step)
2676 __result = std::__move_merge(__first, __first + __step_size,
2677 __first + __step_size,
2678 __first + __two_step,
2680 __first += __two_step;
2682 __step_size =
std::min(_Distance(__last - __first), __step_size);
2684 std::__move_merge(__first, __first + __step_size,
2685 __first + __step_size, __last, __result, __comp);
2688 template<
typename _RandomAccessIterator,
typename _Distance,
2690 _GLIBCXX20_CONSTEXPR
2692 __chunk_insertion_sort(_RandomAccessIterator __first,
2693 _RandomAccessIterator __last,
2694 _Distance __chunk_size, _Compare __comp)
2696 while (__last - __first >= __chunk_size)
2698 std::__insertion_sort(__first, __first + __chunk_size, __comp);
2699 __first += __chunk_size;
2701 std::__insertion_sort(__first, __last, __comp);
2704 enum { _S_chunk_size = 7 };
2706 template<
typename _RandomAccessIterator,
typename _Po
inter,
typename _Compare>
2708 __merge_sort_with_buffer(_RandomAccessIterator __first,
2709 _RandomAccessIterator __last,
2710 _Pointer __buffer, _Compare __comp)
2715 const _Distance __len = __last - __first;
2716 const _Pointer __buffer_last = __buffer + __len;
2718 _Distance __step_size = _S_chunk_size;
2719 std::__chunk_insertion_sort(__first, __last, __step_size, __comp);
2721 while (__step_size < __len)
2723 std::__merge_sort_loop(__first, __last, __buffer,
2724 __step_size, __comp);
2726 std::__merge_sort_loop(__buffer, __buffer_last, __first,
2727 __step_size, __comp);
2732 template<
typename _RandomAccessIterator,
typename _Po
inter,
typename _Compare>
2734 __stable_sort_adaptive(_RandomAccessIterator __first,
2735 _RandomAccessIterator __middle,
2736 _RandomAccessIterator __last,
2737 _Pointer __buffer, _Compare __comp)
2739 std::__merge_sort_with_buffer(__first, __middle, __buffer, __comp);
2740 std::__merge_sort_with_buffer(__middle, __last, __buffer, __comp);
2742 std::__merge_adaptive(__first, __middle, __last,
2743 __middle - __first, __last - __middle,
2747 template<
typename _RandomAccessIterator,
typename _Pointer,
2748 typename _Distance,
typename _Compare>
2750 __stable_sort_adaptive_resize(_RandomAccessIterator __first,
2751 _RandomAccessIterator __last,
2752 _Pointer __buffer, _Distance __buffer_size,
2755 const _Distance __len = (__last - __first + 1) / 2;
2756 const _RandomAccessIterator __middle = __first + __len;
2757 if (__len > __buffer_size)
2759 std::__stable_sort_adaptive_resize(__first, __middle, __buffer,
2760 __buffer_size, __comp);
2761 std::__stable_sort_adaptive_resize(__middle, __last, __buffer,
2762 __buffer_size, __comp);
2763 std::__merge_adaptive_resize(__first, __middle, __last,
2764 _Distance(__middle - __first),
2765 _Distance(__last - __middle),
2766 __buffer, __buffer_size,
2770 std::__stable_sort_adaptive(__first, __middle, __last,
2775 template<
typename _RandomAccessIterator,
typename _Compare>
2776 _GLIBCXX26_CONSTEXPR
2778 __inplace_stable_sort(_RandomAccessIterator __first,
2779 _RandomAccessIterator __last, _Compare __comp)
2781 if (__last - __first < 15)
2783 std::__insertion_sort(__first, __last, __comp);
2786 _RandomAccessIterator __middle = __first + (__last - __first) / 2;
2787 std::__inplace_stable_sort(__first, __middle, __comp);
2788 std::__inplace_stable_sort(__middle, __last, __comp);
2789 std::__merge_without_buffer(__first, __middle, __last,
2802 template<
typename _InputIterator1,
typename _InputIterator2,
2804 _GLIBCXX20_CONSTEXPR
2806 __includes(_InputIterator1 __first1, _InputIterator1 __last1,
2807 _InputIterator2 __first2, _InputIterator2 __last2,
2810 while (__first1 != __last1 && __first2 != __last2)
2812 if (__comp(*__first2, *__first1))
2814 if (!__comp(*__first1, *__first2))
2819 return __first2 == __last2;
2841 template<
typename _InputIterator1,
typename _InputIterator2>
2842 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
2844 includes(_InputIterator1 __first1, _InputIterator1 __last1,
2845 _InputIterator2 __first2, _InputIterator2 __last2)
2848 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
2849 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
2850 __glibcxx_function_requires(_LessThanOpConcept<
2853 __glibcxx_function_requires(_LessThanOpConcept<
2856 __glibcxx_requires_sorted_set(__first1, __last1, __first2);
2857 __glibcxx_requires_sorted_set(__first2, __last2, __first1);
2858 __glibcxx_requires_irreflexive2(__first1, __last1);
2859 __glibcxx_requires_irreflexive2(__first2, __last2);
2861 return std::__includes(__first1, __last1, __first2, __last2,
2862 __gnu_cxx::__ops::less());
2886 template<
typename _InputIterator1,
typename _InputIterator2,
2888 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
2890 includes(_InputIterator1 __first1, _InputIterator1 __last1,
2891 _InputIterator2 __first2, _InputIterator2 __last2,
2895 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
2896 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
2897 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2900 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2903 __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
2904 __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
2905 __glibcxx_requires_irreflexive_pred2(__first1, __last1, __comp);
2906 __glibcxx_requires_irreflexive_pred2(__first2, __last2, __comp);
2908 return std::__includes(__first1, __last1, __first2, __last2, __comp);
2922 template<
typename _B
idirectionalIterator,
typename _Compare>
2923 _GLIBCXX20_CONSTEXPR
2925 __next_permutation(_BidirectionalIterator __first,
2926 _BidirectionalIterator __last, _Compare __comp)
2928 if (__first == __last)
2930 _BidirectionalIterator __i = __first;
2939 _BidirectionalIterator __ii = __i;
2941 if (__comp(*__i, *__ii))
2943 _BidirectionalIterator __j = __last;
2944 while (!__comp(*__i, *--__j))
2946 std::iter_swap(__i, __j);
2947 std::__reverse(__ii, __last,
2948 std::__iterator_category(__first));
2953 std::__reverse(__first, __last,
2954 std::__iterator_category(__first));
2973 template<
typename _B
idirectionalIterator>
2974 _GLIBCXX20_CONSTEXPR
2976 next_permutation(_BidirectionalIterator __first,
2977 _BidirectionalIterator __last)
2980 __glibcxx_function_requires(_BidirectionalIteratorConcept<
2981 _BidirectionalIterator>)
2982 __glibcxx_function_requires(_LessThanComparableConcept<
2984 __glibcxx_requires_valid_range(__first, __last);
2985 __glibcxx_requires_irreflexive(__first, __last);
2987 return std::__next_permutation(__first, __last, __gnu_cxx::__ops::less());
3005 template<
typename _B
idirectionalIterator,
typename _Compare>
3006 _GLIBCXX20_CONSTEXPR
3008 next_permutation(_BidirectionalIterator __first,
3009 _BidirectionalIterator __last, _Compare __comp)
3012 __glibcxx_function_requires(_BidirectionalIteratorConcept<
3013 _BidirectionalIterator>)
3014 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
3017 __glibcxx_requires_valid_range(__first, __last);
3018 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
3020 return std::__next_permutation(__first, __last, __comp);
3024 template<
typename _B
idirectionalIterator,
typename _Compare>
3025 _GLIBCXX20_CONSTEXPR
3027 __prev_permutation(_BidirectionalIterator __first,
3028 _BidirectionalIterator __last, _Compare __comp)
3030 if (__first == __last)
3032 _BidirectionalIterator __i = __first;
3041 _BidirectionalIterator __ii = __i;
3043 if (__comp(*__ii, *__i))
3045 _BidirectionalIterator __j = __last;
3046 while (!__comp(*--__j, *__i))
3048 std::iter_swap(__i, __j);
3049 std::__reverse(__ii, __last,
3050 std::__iterator_category(__first));
3055 std::__reverse(__first, __last,
3056 std::__iterator_category(__first));
3076 template<
typename _B
idirectionalIterator>
3077 _GLIBCXX20_CONSTEXPR
3079 prev_permutation(_BidirectionalIterator __first,
3080 _BidirectionalIterator __last)
3083 __glibcxx_function_requires(_BidirectionalIteratorConcept<
3084 _BidirectionalIterator>)
3085 __glibcxx_function_requires(_LessThanComparableConcept<
3087 __glibcxx_requires_valid_range(__first, __last);
3088 __glibcxx_requires_irreflexive(__first, __last);
3090 return std::__prev_permutation(__first, __last, __gnu_cxx::__ops::less());
3108 template<
typename _B
idirectionalIterator,
typename _Compare>
3109 _GLIBCXX20_CONSTEXPR
3111 prev_permutation(_BidirectionalIterator __first,
3112 _BidirectionalIterator __last, _Compare __comp)
3115 __glibcxx_function_requires(_BidirectionalIteratorConcept<
3116 _BidirectionalIterator>)
3117 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
3120 __glibcxx_requires_valid_range(__first, __last);
3121 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
3123 return std::__prev_permutation(__first, __last, __comp);
3130 template<
typename _InputIterator,
typename _OutputIterator,
3131 typename _Predicate,
typename _Tp>
3132 _GLIBCXX20_CONSTEXPR
3134 __replace_copy_if(_InputIterator __first, _InputIterator __last,
3135 _OutputIterator __result,
3136 _Predicate __pred,
const _Tp& __new_value)
3138 for (; __first != __last; ++__first, (void)++__result)
3139 if (__pred(*__first))
3140 *__result = __new_value;
3142 *__result = *__first;
3161 template<
typename _InputIterator,
typename _OutputIterator,
typename _Tp>
3162 _GLIBCXX20_CONSTEXPR
3163 inline _OutputIterator
3164 replace_copy(_InputIterator __first, _InputIterator __last,
3165 _OutputIterator __result,
3166 const _Tp& __old_value,
const _Tp& __new_value)
3169 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3170 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
3172 __glibcxx_function_requires(_EqualOpConcept<
3174 __glibcxx_requires_valid_range(__first, __last);
3176 return std::__replace_copy_if(__first, __last, __result,
3177 __gnu_cxx::__ops::__equal_to(__old_value),
3196 template<
typename _InputIterator,
typename _OutputIterator,
3197 typename _Predicate,
typename _Tp>
3198 _GLIBCXX20_CONSTEXPR
3199 inline _OutputIterator
3200 replace_copy_if(_InputIterator __first, _InputIterator __last,
3201 _OutputIterator __result,
3202 _Predicate __pred,
const _Tp& __new_value)
3205 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3206 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
3208 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
3210 __glibcxx_requires_valid_range(__first, __last);
3212 return std::__replace_copy_if(__first, __last, __result, __pred,
3216#if __cplusplus >= 201103L
3224 template<
typename _ForwardIterator>
3225 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
3227 is_sorted(_ForwardIterator __first, _ForwardIterator __last)
3228 {
return std::is_sorted_until(__first, __last) == __last; }
3239 template<
typename _ForwardIterator,
typename _Compare>
3240 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
3242 is_sorted(_ForwardIterator __first, _ForwardIterator __last,
3244 {
return std::is_sorted_until(__first, __last, __comp) == __last; }
3247 template<
typename _ForwardIterator,
typename _Compare>
3248 _GLIBCXX20_CONSTEXPR
3250 __is_sorted_until(_ForwardIterator __first, _ForwardIterator __last,
3253 if (__first == __last)
3256 _ForwardIterator __next = __first;
3257 for (++__next; __next != __last; __first = __next, (void)++__next)
3258 if (__comp(*__next, *__first))
3272 template<
typename _ForwardIterator>
3273 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
3274 inline _ForwardIterator
3275 is_sorted_until(_ForwardIterator __first, _ForwardIterator __last)
3278 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
3279 __glibcxx_function_requires(_LessThanComparableConcept<
3281 __glibcxx_requires_valid_range(__first, __last);
3282 __glibcxx_requires_irreflexive(__first, __last);
3284 return std::__is_sorted_until(__first, __last,
3285 __gnu_cxx::__ops::less());
3297 template<
typename _ForwardIterator,
typename _Compare>
3298 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
3299 inline _ForwardIterator
3300 is_sorted_until(_ForwardIterator __first, _ForwardIterator __last,
3304 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
3305 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
3308 __glibcxx_requires_valid_range(__first, __last);
3309 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
3311 return std::__is_sorted_until(__first, __last, __comp);
3322 template<
typename _Tp>
3323 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
3328 __glibcxx_function_requires(_LessThanComparableConcept<_Tp>)
3330 return __b < __a ? pair<const _Tp&, const _Tp&>(__b, __a)
3343 template<
typename _Tp,
typename _Compare>
3344 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
3346 minmax(
const _Tp& __a,
const _Tp& __b, _Compare __comp)
3353 template<
typename _ForwardIterator,
typename _Compare>
3354 _GLIBCXX14_CONSTEXPR
3356 __minmax_element(_ForwardIterator __first, _ForwardIterator __last,
3359 _ForwardIterator __next = __first;
3360 if (__first == __last
3361 || ++__next == __last)
3364 _ForwardIterator __min{}, __max{};
3365 if (__comp(*__next, *__first))
3379 while (__first != __last)
3382 if (++__next == __last)
3384 if (__comp(*__first, *__min))
3386 else if (!__comp(*__first, *__max))
3391 if (__comp(*__next, *__first))
3393 if (__comp(*__next, *__min))
3395 if (!__comp(*__first, *__max))
3400 if (__comp(*__first, *__min))
3402 if (!__comp(*__next, *__max))
3425 template<
typename _ForwardIterator>
3426 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
3428 minmax_element(_ForwardIterator __first, _ForwardIterator __last)
3431 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
3432 __glibcxx_function_requires(_LessThanComparableConcept<
3434 __glibcxx_requires_valid_range(__first, __last);
3435 __glibcxx_requires_irreflexive(__first, __last);
3437 return std::__minmax_element(__first, __last, __gnu_cxx::__ops::less());
3452 template<
typename _ForwardIterator,
typename _Compare>
3453 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
3455 minmax_element(_ForwardIterator __first, _ForwardIterator __last,
3459 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
3460 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
3463 __glibcxx_requires_valid_range(__first, __last);
3464 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
3466 return std::__minmax_element(__first, __last, __comp);
3469 template<
typename _Tp>
3470 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
3471 inline pair<_Tp, _Tp>
3472 minmax(initializer_list<_Tp> __l)
3474 __glibcxx_requires_irreflexive(__l.begin(), __l.end());
3476 std::__minmax_element(__l.begin(), __l.end(),
3477 __gnu_cxx::__ops::less());
3481 template<
typename _Tp,
typename _Compare>
3482 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
3486 __glibcxx_requires_irreflexive_pred(__l.begin(), __l.end(), __comp);
3488 std::__minmax_element(__l.begin(), __l.end(), __comp);
3506 template<
typename _ForwardIterator1,
typename _ForwardIterator2,
3507 typename _BinaryPredicate>
3508 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
3510 is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
3511 _ForwardIterator2 __first2, _BinaryPredicate __pred)
3514 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
3515 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
3516 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
3519 __glibcxx_requires_valid_range(__first1, __last1);
3521 return std::__is_permutation(__first1, __last1, __first2, __pred);
3524#if __glibcxx_robust_nonmodifying_seq_ops
3526#pragma GCC diagnostic push
3527#pragma GCC diagnostic ignored "-Wc++17-extensions"
3528 template<
typename _ForwardIterator1,
typename _ForwardIterator2,
3529 typename _BinaryPredicate>
3530 _GLIBCXX20_CONSTEXPR
3532 __is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
3533 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
3534 _BinaryPredicate __pred)
3536 using _Cat1 =
decltype(std::__iter_concept_or_category<_ForwardIterator1>());
3537 using _Cat2 =
decltype(std::__iter_concept_or_category<_ForwardIterator2>());
3538 using _It1_is_RA = is_same<_Cat1, random_access_iterator_tag>;
3539 using _It2_is_RA = is_same<_Cat2, random_access_iterator_tag>;
3540 constexpr bool __ra_iters = __and_<_It1_is_RA, _It2_is_RA>::value;
3541 if constexpr (__ra_iters)
3543 if ((__last1 - __first1) != (__last2 - __first2))
3549 for (; __first1 != __last1 && __first2 != __last2;
3550 ++__first1, (void)++__first2)
3551 if (!__pred(*__first1, *__first2))
3554 if constexpr (__ra_iters)
3556 if (__first1 == __last1)
3563 if (__d1 == 0 && __d2 == 0)
3569 for (_ForwardIterator1 __scan = __first1; __scan != __last1; ++__scan)
3571 auto&& __scan_val = *__scan;
3572 auto __scaneq = __gnu_cxx::__ops::bind1st(__pred, __scan_val);
3573 if (__scan != std::__find_if(__first1, __scan, __scaneq))
3576 auto __matches = std::__count_if(__first2, __last2, __scaneq);
3578 || std::__count_if(__scan, __last1, __scaneq) != __matches)
3583#pragma GCC diagnostic pop
3599 template<
typename _ForwardIterator1,
typename _ForwardIterator2>
3600 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
3602 is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
3603 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
3605 __glibcxx_requires_valid_range(__first1, __last1);
3606 __glibcxx_requires_valid_range(__first2, __last2);
3608 return std::__is_permutation(__first1, __last1, __first2, __last2,
3609 __gnu_cxx::__ops::equal_to());
3626 template<
typename _ForwardIterator1,
typename _ForwardIterator2,
3627 typename _BinaryPredicate>
3628 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
3630 is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
3631 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
3632 _BinaryPredicate __pred)
3634 __glibcxx_requires_valid_range(__first1, __last1);
3635 __glibcxx_requires_valid_range(__first2, __last2);
3637 return std::__is_permutation(__first1, __last1, __first2, __last2,
3642#ifdef __glibcxx_clamp
3654 template<
typename _Tp>
3655 [[nodiscard]]
constexpr const _Tp&
3656 clamp(
const _Tp& __val,
const _Tp& __lo,
const _Tp& __hi)
3658 __glibcxx_assert(!(__hi < __lo));
3674 template<
typename _Tp,
typename _Compare>
3675 [[nodiscard]]
constexpr const _Tp&
3676 clamp(
const _Tp& __val,
const _Tp& __lo,
const _Tp& __hi, _Compare __comp)
3678 __glibcxx_assert(!__comp(__hi, __lo));
3704 template<
typename _IntType,
typename _UniformRandomBitGenerator>
3707 _UniformRandomBitGenerator&& __g)
3725 template<
typename _RandomAccessIterator,
3726 typename _UniformRandomNumberGenerator>
3728 shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
3729 _UniformRandomNumberGenerator&& __g)
3732 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
3733 _RandomAccessIterator>)
3734 __glibcxx_requires_valid_range(__first, __last);
3736 if (__first == __last)
3742 typedef typename std::make_unsigned<_DistanceType>::type __ud_type;
3744 typedef typename __distr_type::param_type __p_type;
3746 typedef typename remove_reference<_UniformRandomNumberGenerator>::type
3751 const __uc_type __urngrange = __g.max() - __g.min();
3752 const __uc_type __urange = __uc_type(__last - __first);
3754 if (__urngrange / __urange >= __urange)
3757 _RandomAccessIterator __i = __first + 1;
3763 if ((__urange % 2) == 0)
3765 __distr_type __d{0, 1};
3766 std::iter_swap(__i++, __first + __d(__g));
3773 while (__i != __last)
3775 const __uc_type __swap_range = __uc_type(__i - __first) + 1;
3780 std::iter_swap(__i++, __first + __pospos.
first);
3781 std::iter_swap(__i++, __first + __pospos.
second);
3789 for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
3790 std::iter_swap(__i, __first + __d(__g, __p_type(0, __i - __first)));
3794_GLIBCXX_BEGIN_NAMESPACE_ALGO
3808 template<
typename _InputIterator,
typename _Function>
3809 _GLIBCXX20_CONSTEXPR
3811 for_each(_InputIterator __first, _InputIterator __last, _Function __f)
3814 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3815 __glibcxx_requires_valid_range(__first, __last);
3816 for (; __first != __last; ++__first)
3821#if __cplusplus >= 201703L
3834 template<
typename _InputIterator,
typename _Size,
typename _Function>
3835 _GLIBCXX20_CONSTEXPR
3839 auto __n2 = std::__size_to_integer(__n);
3840 using _Cat =
decltype(std::__iter_concept_or_category<_InputIterator>());
3841 if constexpr (is_base_of_v<random_access_iterator_tag, _Cat>)
3846 auto __last = __first + __d;
3847 std::for_each(__first, __last,
std::move(__f));
3871 template<
typename _InputIterator,
typename _Tp>
3872 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
3873 inline _InputIterator
3874 find(_InputIterator __first, _InputIterator __last,
const _Tp& __val)
3877 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3878 __glibcxx_function_requires(_EqualOpConcept<
3880 __glibcxx_requires_valid_range(__first, __last);
3882#if __cpp_if_constexpr && __glibcxx_type_trait_variable_templates
3884 if constexpr (__can_use_memchr_for_find<_ValT, _Tp>)
3885 if constexpr (is_pointer_v<
decltype(std::__niter_base(__first))>
3886#
if __glibcxx_concepts && __glibcxx_to_address
3887 || contiguous_iterator<_InputIterator>
3895 if (!(
static_cast<_ValT
>(__val) == __val))
3897 else if (!__is_constant_evaluated())
3899 const int __ival =
static_cast<int>(__val);
3900 if (
auto __n = __last - __first; __n > 0)
3902#if __glibcxx_concepts && __glibcxx_to_address
3905 const void* __p0 = std::__niter_base(__first);
3907 if (
auto __p1 = __builtin_memchr(__p0, __ival, __n))
3908 return __first + ((
const char*)__p1 - (
const char*)__p0);
3915 return std::__find_if(__first, __last,
3916 __gnu_cxx::__ops::__equal_to(__val));
3929 template<
typename _InputIterator,
typename _Predicate>
3930 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
3931 inline _InputIterator
3932 find_if(_InputIterator __first, _InputIterator __last,
3936 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3937 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
3939 __glibcxx_requires_valid_range(__first, __last);
3941 return std::__find_if(__first, __last, __pred);
3961 template<
typename _InputIterator,
typename _ForwardIterator>
3962 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
3964 find_first_of(_InputIterator __first1, _InputIterator __last1,
3965 _ForwardIterator __first2, _ForwardIterator __last2)
3968 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3969 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
3970 __glibcxx_function_requires(_EqualOpConcept<
3973 __glibcxx_requires_valid_range(__first1, __last1);
3974 __glibcxx_requires_valid_range(__first2, __last2);
3976 for (; __first1 != __last1; ++__first1)
3977 for (_ForwardIterator __iter = __first2; __iter != __last2; ++__iter)
3978 if (*__first1 == *__iter)
4002 template<
typename _InputIterator,
typename _ForwardIterator,
4003 typename _BinaryPredicate>
4004 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
4006 find_first_of(_InputIterator __first1, _InputIterator __last1,
4007 _ForwardIterator __first2, _ForwardIterator __last2,
4008 _BinaryPredicate __comp)
4011 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
4012 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
4013 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
4016 __glibcxx_requires_valid_range(__first1, __last1);
4017 __glibcxx_requires_valid_range(__first2, __last2);
4019 for (; __first1 != __last1; ++__first1)
4020 for (_ForwardIterator __iter = __first2; __iter != __last2; ++__iter)
4021 if (__comp(*__first1, *__iter))
4035 template<
typename _ForwardIterator>
4036 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
4037 inline _ForwardIterator
4038 adjacent_find(_ForwardIterator __first, _ForwardIterator __last)
4041 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
4042 __glibcxx_function_requires(_EqualityComparableConcept<
4044 __glibcxx_requires_valid_range(__first, __last);
4046 return std::__adjacent_find(__first, __last,
4047 __gnu_cxx::__ops::equal_to());
4061 template<
typename _ForwardIterator,
typename _BinaryPredicate>
4062 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
4063 inline _ForwardIterator
4064 adjacent_find(_ForwardIterator __first, _ForwardIterator __last,
4065 _BinaryPredicate __binary_pred)
4068 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
4069 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
4072 __glibcxx_requires_valid_range(__first, __last);
4074 return std::__adjacent_find(__first, __last, __binary_pred);
4086 template<
typename _InputIterator,
typename _Tp>
4087 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
4088 inline typename iterator_traits<_InputIterator>::difference_type
4089 count(_InputIterator __first, _InputIterator __last,
const _Tp& __value)
4092 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
4093 __glibcxx_function_requires(_EqualOpConcept<
4095 __glibcxx_requires_valid_range(__first, __last);
4097 return std::__count_if(__first, __last,
4098 __gnu_cxx::__ops::__equal_to(__value));
4110 template<
typename _InputIterator,
typename _Predicate>
4111 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
4112 inline typename iterator_traits<_InputIterator>::difference_type
4113 count_if(_InputIterator __first, _InputIterator __last, _Predicate __pred)
4116 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
4117 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
4119 __glibcxx_requires_valid_range(__first, __last);
4121 return std::__count_if(__first, __last, __pred);
4150 template<
typename _ForwardIterator1,
typename _ForwardIterator2>
4151 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
4152 inline _ForwardIterator1
4153 search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
4154 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
4157 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
4158 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
4159 __glibcxx_function_requires(_EqualOpConcept<
4162 __glibcxx_requires_valid_range(__first1, __last1);
4163 __glibcxx_requires_valid_range(__first2, __last2);
4165 return std::__search(__first1, __last1, __first2, __last2,
4166 __gnu_cxx::__ops::equal_to());
4183 template<
typename _ForwardIterator,
typename _Integer,
typename _Tp>
4184 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
4185 inline _ForwardIterator
4186 search_n(_ForwardIterator __first, _ForwardIterator __last,
4187 _Integer __count,
const _Tp& __val)
4190 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
4191 __glibcxx_function_requires(_EqualOpConcept<
4193 __glibcxx_requires_valid_range(__first, __last);
4195 return std::__search_n(__first, __last, __count,
4196 __gnu_cxx::__ops::__equal_to(__val));
4216 template<
typename _ForwardIterator,
typename _Integer,
typename _Tp,
4217 typename _BinaryPredicate>
4218 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
4219 inline _ForwardIterator
4220 search_n(_ForwardIterator __first, _ForwardIterator __last,
4221 _Integer __count,
const _Tp& __val,
4222 _BinaryPredicate __binary_pred)
4225 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
4226 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
4228 __glibcxx_requires_valid_range(__first, __last);
4230 return std::__search_n(__first, __last, __count,
4231 __gnu_cxx::__ops::bind2nd(__binary_pred, __val));
4234#if __cplusplus >= 201703L
4242 template<
typename _ForwardIterator,
typename _Searcher>
4243 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
4244 inline _ForwardIterator
4245 search(_ForwardIterator __first, _ForwardIterator __last,
4246 const _Searcher& __searcher)
4247 {
return __searcher(__first, __last).first; }
4266 template<
typename _InputIterator,
typename _OutputIterator,
4267 typename _UnaryOperation>
4268 _GLIBCXX20_CONSTEXPR
4270 transform(_InputIterator __first, _InputIterator __last,
4271 _OutputIterator __result, _UnaryOperation __unary_op)
4274 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
4275 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4277 __typeof__(__unary_op(*__first))>)
4278 __glibcxx_requires_valid_range(__first, __last);
4280 for (; __first != __last; ++__first, (void)++__result)
4281 *__result = __unary_op(*__first);
4303 template<
typename _InputIterator1,
typename _InputIterator2,
4304 typename _OutputIterator,
typename _BinaryOperation>
4305 _GLIBCXX20_CONSTEXPR
4307 transform(_InputIterator1 __first1, _InputIterator1 __last1,
4308 _InputIterator2 __first2, _OutputIterator __result,
4309 _BinaryOperation __binary_op)
4312 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
4313 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
4314 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4316 __typeof__(__binary_op(*__first1,*__first2))>)
4317 __glibcxx_requires_valid_range(__first1, __last1);
4319 for (; __first1 != __last1; ++__first1, (void)++__first2, ++__result)
4320 *__result = __binary_op(*__first1, *__first2);
4336 template<
typename _ForwardIterator,
typename _Tp>
4337 _GLIBCXX20_CONSTEXPR
4339 replace(_ForwardIterator __first, _ForwardIterator __last,
4340 const _Tp& __old_value,
const _Tp& __new_value)
4343 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
4345 __glibcxx_function_requires(_EqualOpConcept<
4347 __glibcxx_function_requires(_ConvertibleConcept<_Tp,
4349 __glibcxx_requires_valid_range(__first, __last);
4351 for (; __first != __last; ++__first)
4352 if (*__first == __old_value)
4353 *__first = __new_value;
4368 template<
typename _ForwardIterator,
typename _Predicate,
typename _Tp>
4369 _GLIBCXX20_CONSTEXPR
4371 replace_if(_ForwardIterator __first, _ForwardIterator __last,
4372 _Predicate __pred,
const _Tp& __new_value)
4375 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
4377 __glibcxx_function_requires(_ConvertibleConcept<_Tp,
4379 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
4381 __glibcxx_requires_valid_range(__first, __last);
4383 for (; __first != __last; ++__first)
4384 if (__pred(*__first))
4385 *__first = __new_value;
4399 template<
typename _ForwardIterator,
typename _Generator>
4400 _GLIBCXX20_CONSTEXPR
4402 generate(_ForwardIterator __first, _ForwardIterator __last,
4406 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
4407 __glibcxx_function_requires(_GeneratorConcept<_Generator,
4409 __glibcxx_requires_valid_range(__first, __last);
4411 for (; __first != __last; ++__first)
4432 template<
typename _OutputIterator,
typename _Size,
typename _Generator>
4433 _GLIBCXX20_CONSTEXPR
4435 generate_n(_OutputIterator __first, _Size __n, _Generator __gen)
4438 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4440 __typeof__(__gen())>)
4442 typedef __decltype(std::__size_to_integer(__n)) _IntSize;
4443 for (_IntSize __niter = std::__size_to_integer(__n);
4444 __niter > 0; --__niter, (void) ++__first)
4467 template<
typename _InputIterator,
typename _OutputIterator>
4468 _GLIBCXX20_CONSTEXPR
4469 inline _OutputIterator
4470 unique_copy(_InputIterator __first, _InputIterator __last,
4471 _OutputIterator __result)
4474 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
4475 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4477 __glibcxx_function_requires(_EqualityComparableConcept<
4479 __glibcxx_requires_valid_range(__first, __last);
4481 if (__first == __last)
4483 return std::__unique_copy(__first, __last, __result,
4484 __gnu_cxx::__ops::equal_to(),
4485 std::__iter_concept_or_category(__first));
4506 template<
typename _InputIterator,
typename _OutputIterator,
4507 typename _BinaryPredicate>
4508 _GLIBCXX20_CONSTEXPR
4509 inline _OutputIterator
4510 unique_copy(_InputIterator __first, _InputIterator __last,
4511 _OutputIterator __result,
4512 _BinaryPredicate __binary_pred)
4515 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
4516 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4518 __glibcxx_requires_valid_range(__first, __last);
4519 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
4523 if (__first == __last)
4525 return std::__unique_copy(__first, __last, __result, __binary_pred,
4526 std::__iter_concept_or_category(__first));
4529#if __cplusplus <= 201103L || _GLIBCXX_USE_DEPRECATED
4545 template<
typename _RandomAccessIterator>
4546 _GLIBCXX14_DEPRECATED_SUGGEST(
"std::shuffle")
4548 random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last)
4551 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4552 _RandomAccessIterator>)
4553 __glibcxx_requires_valid_range(__first, __last);
4555 if (__first == __last)
4561#if RAND_MAX < __INT_MAX__
4562 if (__builtin_expect((__last - __first) >= RAND_MAX / 4, 0))
4567 = (unsigned)std::rand() ^ ((unsigned)std::rand() << 15);
4568 for (_RandomAccessIterator __i = __first + _Dist(1); __i != __last;
4572 __xss ^= __xss << 13;
4573 __xss ^= __xss >> 17;
4574 __xss ^= __xss << 5;
4575 _RandomAccessIterator __j
4576 = __first + _Dist(__xss % ((__i - __first) + 1));
4578 std::iter_swap(__i, __j);
4584 for (_RandomAccessIterator __i = __first + _Dist(1); __i != __last; ++__i)
4587 _RandomAccessIterator __j
4588 = __first + _Dist(std::rand() % ((__i - __first) + 1));
4590 std::iter_swap(__i, __j);
4611 template<
typename _RandomAccessIterator,
typename _RandomNumberGenerator>
4612 _GLIBCXX14_DEPRECATED_SUGGEST(
"std::shuffle")
4614 random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
4615#if __cplusplus >= 201103L
4616 _RandomNumberGenerator&& __rand)
4618 _RandomNumberGenerator& __rand)
4622 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4623 _RandomAccessIterator>)
4624 __glibcxx_requires_valid_range(__first, __last);
4626 if (__first == __last)
4632 for (_RandomAccessIterator __i = __first + _Dist(1); __i != __last; ++__i)
4634 _RandomAccessIterator __j
4635 = __first + _Dist(__rand((__i - __first) + 1));
4637 std::iter_swap(__i, __j);
4658 template<
typename _ForwardIterator,
typename _Predicate>
4659 _GLIBCXX20_CONSTEXPR
4660 inline _ForwardIterator
4661 partition(_ForwardIterator __first, _ForwardIterator __last,
4665 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
4667 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
4669 __glibcxx_requires_valid_range(__first, __last);
4671 return std::__partition(__first, __last, __pred,
4672 std::__iterator_category(__first));
4692 template<
typename _RandomAccessIterator>
4693 _GLIBCXX20_CONSTEXPR
4695 partial_sort(_RandomAccessIterator __first,
4696 _RandomAccessIterator __middle,
4697 _RandomAccessIterator __last)
4700 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4701 _RandomAccessIterator>)
4702 __glibcxx_function_requires(_LessThanComparableConcept<
4704 __glibcxx_requires_valid_range(__first, __middle);
4705 __glibcxx_requires_valid_range(__middle, __last);
4706 __glibcxx_requires_irreflexive(__first, __last);
4708 std::__partial_sort(__first, __middle, __last,
4709 __gnu_cxx::__ops::less());
4730 template<
typename _RandomAccessIterator,
typename _Compare>
4731 _GLIBCXX20_CONSTEXPR
4733 partial_sort(_RandomAccessIterator __first,
4734 _RandomAccessIterator __middle,
4735 _RandomAccessIterator __last,
4739 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4740 _RandomAccessIterator>)
4741 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
4744 __glibcxx_requires_valid_range(__first, __middle);
4745 __glibcxx_requires_valid_range(__middle, __last);
4746 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
4748 std::__partial_sort(__first, __middle, __last, __comp);
4765 template<
typename _RandomAccessIterator>
4766 _GLIBCXX20_CONSTEXPR
4768 nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth,
4769 _RandomAccessIterator __last)
4772 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4773 _RandomAccessIterator>)
4774 __glibcxx_function_requires(_LessThanComparableConcept<
4776 __glibcxx_requires_valid_range(__first, __nth);
4777 __glibcxx_requires_valid_range(__nth, __last);
4778 __glibcxx_requires_irreflexive(__first, __last);
4780 if (__first == __last || __nth == __last)
4783 std::__introselect(__first, __nth, __last,
4785 __gnu_cxx::__ops::less());
4804 template<
typename _RandomAccessIterator,
typename _Compare>
4805 _GLIBCXX20_CONSTEXPR
4807 nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth,
4808 _RandomAccessIterator __last, _Compare __comp)
4811 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4812 _RandomAccessIterator>)
4813 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
4816 __glibcxx_requires_valid_range(__first, __nth);
4817 __glibcxx_requires_valid_range(__nth, __last);
4818 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
4820 if (__first == __last || __nth == __last)
4823 std::__introselect(__first, __nth, __last,
4841 template<
typename _RandomAccessIterator>
4842 _GLIBCXX20_CONSTEXPR
4844 sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
4847 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4848 _RandomAccessIterator>)
4849 __glibcxx_function_requires(_LessThanComparableConcept<
4851 __glibcxx_requires_valid_range(__first, __last);
4852 __glibcxx_requires_irreflexive(__first, __last);
4854 std::__sort(__first, __last, __gnu_cxx::__ops::less());
4871 template<
typename _RandomAccessIterator,
typename _Compare>
4872 _GLIBCXX20_CONSTEXPR
4874 sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
4878 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4879 _RandomAccessIterator>)
4880 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
4883 __glibcxx_requires_valid_range(__first, __last);
4884 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
4886 std::__sort(__first, __last, __comp);
4889 template<
typename _InputIterator1,
typename _InputIterator2,
4890 typename _OutputIterator,
typename _Compare>
4891 _GLIBCXX20_CONSTEXPR
4893 __merge(_InputIterator1 __first1, _InputIterator1 __last1,
4894 _InputIterator2 __first2, _InputIterator2 __last2,
4895 _OutputIterator __result, _Compare __comp)
4897 while (__first1 != __last1 && __first2 != __last2)
4899 if (__comp(*__first2, *__first1))
4901 *__result = *__first2;
4906 *__result = *__first1;
4911 return std::copy(__first2, __last2,
4912 std::copy(__first1, __last1, __result));
4935 template<
typename _InputIterator1,
typename _InputIterator2,
4936 typename _OutputIterator>
4937 _GLIBCXX20_CONSTEXPR
4938 inline _OutputIterator
4939 merge(_InputIterator1 __first1, _InputIterator1 __last1,
4940 _InputIterator2 __first2, _InputIterator2 __last2,
4941 _OutputIterator __result)
4944 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
4945 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
4946 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4948 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4950 __glibcxx_function_requires(_LessThanOpConcept<
4953 __glibcxx_requires_sorted_set(__first1, __last1, __first2);
4954 __glibcxx_requires_sorted_set(__first2, __last2, __first1);
4955 __glibcxx_requires_irreflexive2(__first1, __last1);
4956 __glibcxx_requires_irreflexive2(__first2, __last2);
4958 return _GLIBCXX_STD_A::__merge(__first1, __last1, __first2, __last2,
4959 __result, __gnu_cxx::__ops::less());
4986 template<
typename _InputIterator1,
typename _InputIterator2,
4987 typename _OutputIterator,
typename _Compare>
4988 _GLIBCXX20_CONSTEXPR
4989 inline _OutputIterator
4990 merge(_InputIterator1 __first1, _InputIterator1 __last1,
4991 _InputIterator2 __first2, _InputIterator2 __last2,
4992 _OutputIterator __result, _Compare __comp)
4995 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
4996 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
4997 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4999 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5001 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5004 __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
5005 __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
5006 __glibcxx_requires_irreflexive_pred2(__first1, __last1, __comp);
5007 __glibcxx_requires_irreflexive_pred2(__first2, __last2, __comp);
5009 return _GLIBCXX_STD_A::__merge(__first1, __last1, __first2, __last2,
5013 template<
typename _RandomAccessIterator,
typename _Compare>
5014 _GLIBCXX26_CONSTEXPR
5016 __stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
5019 typedef typename iterator_traits<_RandomAccessIterator>::value_type
5021 typedef typename iterator_traits<_RandomAccessIterator>::difference_type
5024 if (__first == __last)
5028# if __glibcxx_constexpr_algorithms >= 202306L
5030 return std::__inplace_stable_sort(__first, __last, __comp);
5037 _TmpBuf __buf(__first, (__last - __first + 1) / 2);
5039 if (__builtin_expect(__buf._M_requested_size() == __buf.size(),
true))
5040 std::__stable_sort_adaptive(__first,
5041 __first + _DistanceType(__buf.size()),
5042 __last, __buf.begin(), __comp);
5043 else if (__builtin_expect(__buf.begin() == 0,
false))
5044 std::__inplace_stable_sort(__first, __last, __comp);
5046 std::__stable_sort_adaptive_resize(__first, __last, __buf.begin(),
5047 _DistanceType(__buf.size()), __comp);
5049 std::__inplace_stable_sort(__first, __last, __comp);
5069 template<
typename _RandomAccessIterator>
5070 _GLIBCXX26_CONSTEXPR
5072 stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
5075 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
5076 _RandomAccessIterator>)
5077 __glibcxx_function_requires(_LessThanComparableConcept<
5079 __glibcxx_requires_valid_range(__first, __last);
5080 __glibcxx_requires_irreflexive(__first, __last);
5082 _GLIBCXX_STD_A::__stable_sort(__first, __last,
5083 __gnu_cxx::__ops::less());
5103 template<
typename _RandomAccessIterator,
typename _Compare>
5104 _GLIBCXX26_CONSTEXPR
5106 stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
5110 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
5111 _RandomAccessIterator>)
5112 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5113 typename iterator_traits<_RandomAccessIterator>::value_type,
5114 typename iterator_traits<_RandomAccessIterator>::value_type>)
5115 __glibcxx_requires_valid_range(__first, __last);
5116 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
5118 _GLIBCXX_STD_A::__stable_sort(__first, __last, __comp);
5121 template<typename _InputIterator1, typename _InputIterator2,
5122 typename _OutputIterator, typename _Compare>
5123 _GLIBCXX20_CONSTEXPR
5125 __set_union(_InputIterator1 __first1, _InputIterator1 __last1,
5126 _InputIterator2 __first2, _InputIterator2 __last2,
5127 _OutputIterator __result, _Compare __comp)
5129 while (__first1 != __last1 && __first2 != __last2)
5131 if (__comp(*__first1, *__first2))
5133 *__result = *__first1;
5136 else if (__comp(*__first2, *__first1))
5138 *__result = *__first2;
5143 *__result = *__first1;
5149 return std::copy(__first2, __last2,
5150 std::copy(__first1, __last1, __result));
5172 template<
typename _InputIterator1,
typename _InputIterator2,
5173 typename _OutputIterator>
5174 _GLIBCXX20_CONSTEXPR
5175 inline _OutputIterator
5176 set_union(_InputIterator1 __first1, _InputIterator1 __last1,
5177 _InputIterator2 __first2, _InputIterator2 __last2,
5178 _OutputIterator __result)
5181 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5182 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5183 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5185 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5187 __glibcxx_function_requires(_LessThanOpConcept<
5190 __glibcxx_function_requires(_LessThanOpConcept<
5193 __glibcxx_requires_sorted_set(__first1, __last1, __first2);
5194 __glibcxx_requires_sorted_set(__first2, __last2, __first1);
5195 __glibcxx_requires_irreflexive2(__first1, __last1);
5196 __glibcxx_requires_irreflexive2(__first2, __last2);
5198 return _GLIBCXX_STD_A::__set_union(__first1, __last1, __first2, __last2,
5199 __result, __gnu_cxx::__ops::less());
5222 template<
typename _InputIterator1,
typename _InputIterator2,
5223 typename _OutputIterator,
typename _Compare>
5224 _GLIBCXX20_CONSTEXPR
5225 inline _OutputIterator
5226 set_union(_InputIterator1 __first1, _InputIterator1 __last1,
5227 _InputIterator2 __first2, _InputIterator2 __last2,
5228 _OutputIterator __result, _Compare __comp)
5231 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5232 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5233 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5235 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5237 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5240 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5243 __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
5244 __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
5245 __glibcxx_requires_irreflexive_pred2(__first1, __last1, __comp);
5246 __glibcxx_requires_irreflexive_pred2(__first2, __last2, __comp);
5248 return _GLIBCXX_STD_A::__set_union(__first1, __last1, __first2, __last2,
5252 template<
typename _InputIterator1,
typename _InputIterator2,
5253 typename _OutputIterator,
typename _Compare>
5254 _GLIBCXX20_CONSTEXPR
5256 __set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5257 _InputIterator2 __first2, _InputIterator2 __last2,
5258 _OutputIterator __result, _Compare __comp)
5260 while (__first1 != __last1 && __first2 != __last2)
5261 if (__comp(*__first1, *__first2))
5263 else if (__comp(*__first2, *__first1))
5267 *__result = *__first1;
5293 template<
typename _InputIterator1,
typename _InputIterator2,
5294 typename _OutputIterator>
5295 _GLIBCXX20_CONSTEXPR
5296 inline _OutputIterator
5297 set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5298 _InputIterator2 __first2, _InputIterator2 __last2,
5299 _OutputIterator __result)
5302 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5303 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5304 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5306 __glibcxx_function_requires(_LessThanOpConcept<
5309 __glibcxx_function_requires(_LessThanOpConcept<
5312 __glibcxx_requires_sorted_set(__first1, __last1, __first2);
5313 __glibcxx_requires_sorted_set(__first2, __last2, __first1);
5314 __glibcxx_requires_irreflexive2(__first1, __last1);
5315 __glibcxx_requires_irreflexive2(__first2, __last2);
5317 return _GLIBCXX_STD_A::
5318 __set_intersection(__first1, __last1, __first2, __last2,
5319 __result, __gnu_cxx::__ops::less());
5343 template<
typename _InputIterator1,
typename _InputIterator2,
5344 typename _OutputIterator,
typename _Compare>
5345 _GLIBCXX20_CONSTEXPR
5346 inline _OutputIterator
5347 set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5348 _InputIterator2 __first2, _InputIterator2 __last2,
5349 _OutputIterator __result, _Compare __comp)
5352 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5353 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5354 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5356 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5359 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5362 __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
5363 __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
5364 __glibcxx_requires_irreflexive_pred2(__first1, __last1, __comp);
5365 __glibcxx_requires_irreflexive_pred2(__first2, __last2, __comp);
5367 return _GLIBCXX_STD_A::
5368 __set_intersection(__first1, __last1, __first2, __last2,
5372 template<
typename _InputIterator1,
typename _InputIterator2,
5373 typename _OutputIterator,
typename _Compare>
5374 _GLIBCXX20_CONSTEXPR
5376 __set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5377 _InputIterator2 __first2, _InputIterator2 __last2,
5378 _OutputIterator __result, _Compare __comp)
5380 while (__first1 != __last1 && __first2 != __last2)
5381 if (__comp(*__first1, *__first2))
5383 *__result = *__first1;
5387 else if (__comp(*__first2, *__first1))
5394 return std::copy(__first1, __last1, __result);
5417 template<
typename _InputIterator1,
typename _InputIterator2,
5418 typename _OutputIterator>
5419 _GLIBCXX20_CONSTEXPR
5420 inline _OutputIterator
5421 set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5422 _InputIterator2 __first2, _InputIterator2 __last2,
5423 _OutputIterator __result)
5426 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5427 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5428 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5430 __glibcxx_function_requires(_LessThanOpConcept<
5433 __glibcxx_function_requires(_LessThanOpConcept<
5436 __glibcxx_requires_sorted_set(__first1, __last1, __first2);
5437 __glibcxx_requires_sorted_set(__first2, __last2, __first1);
5438 __glibcxx_requires_irreflexive2(__first1, __last1);
5439 __glibcxx_requires_irreflexive2(__first2, __last2);
5441 return _GLIBCXX_STD_A::
5442 __set_difference(__first1, __last1, __first2, __last2, __result,
5443 __gnu_cxx::__ops::less());
5469 template<
typename _InputIterator1,
typename _InputIterator2,
5470 typename _OutputIterator,
typename _Compare>
5471 _GLIBCXX20_CONSTEXPR
5472 inline _OutputIterator
5473 set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5474 _InputIterator2 __first2, _InputIterator2 __last2,
5475 _OutputIterator __result, _Compare __comp)
5478 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5479 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5480 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5482 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5485 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5488 __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
5489 __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
5490 __glibcxx_requires_irreflexive_pred2(__first1, __last1, __comp);
5491 __glibcxx_requires_irreflexive_pred2(__first2, __last2, __comp);
5493 return _GLIBCXX_STD_A::
5494 __set_difference(__first1, __last1, __first2, __last2, __result,
5498 template<
typename _InputIterator1,
typename _InputIterator2,
5499 typename _OutputIterator,
5501 _GLIBCXX20_CONSTEXPR
5503 __set_symmetric_difference(_InputIterator1 __first1,
5504 _InputIterator1 __last1,
5505 _InputIterator2 __first2,
5506 _InputIterator2 __last2,
5507 _OutputIterator __result,
5510 while (__first1 != __last1 && __first2 != __last2)
5511 if (__comp(*__first1, *__first2))
5513 *__result = *__first1;
5517 else if (__comp(*__first2, *__first1))
5519 *__result = *__first2;
5528 return std::copy(__first2, __last2,
5529 std::copy(__first1, __last1, __result));
5550 template<
typename _InputIterator1,
typename _InputIterator2,
5551 typename _OutputIterator>
5552 _GLIBCXX20_CONSTEXPR
5553 inline _OutputIterator
5554 set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5555 _InputIterator2 __first2, _InputIterator2 __last2,
5556 _OutputIterator __result)
5559 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5560 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5561 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5563 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5565 __glibcxx_function_requires(_LessThanOpConcept<
5568 __glibcxx_function_requires(_LessThanOpConcept<
5571 __glibcxx_requires_sorted_set(__first1, __last1, __first2);
5572 __glibcxx_requires_sorted_set(__first2, __last2, __first1);
5573 __glibcxx_requires_irreflexive2(__first1, __last1);
5574 __glibcxx_requires_irreflexive2(__first2, __last2);
5576 return _GLIBCXX_STD_A::
5577 __set_symmetric_difference(__first1, __last1, __first2, __last2,
5578 __result, __gnu_cxx::__ops::less());
5602 template<
typename _InputIterator1,
typename _InputIterator2,
5603 typename _OutputIterator,
typename _Compare>
5604 _GLIBCXX20_CONSTEXPR
5605 inline _OutputIterator
5606 set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5607 _InputIterator2 __first2, _InputIterator2 __last2,
5608 _OutputIterator __result,
5612 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5613 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5614 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5616 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5618 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5621 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5624 __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
5625 __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
5626 __glibcxx_requires_irreflexive_pred2(__first1, __last1, __comp);
5627 __glibcxx_requires_irreflexive_pred2(__first2, __last2, __comp);
5629 return _GLIBCXX_STD_A::
5630 __set_symmetric_difference(__first1, __last1, __first2, __last2,
5634 template<
typename _ForwardIterator,
typename _Compare>
5635 _GLIBCXX14_CONSTEXPR
5637 __min_element(_ForwardIterator __first, _ForwardIterator __last,
5640 if (__first == __last)
5642 _ForwardIterator __result = __first;
5643 while (++__first != __last)
5644 if (__comp(*__first, *__result))
5656 template<
typename _ForwardIterator>
5657 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
5658 inline _ForwardIterator
5659 min_element(_ForwardIterator __first, _ForwardIterator __last)
5662 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
5663 __glibcxx_function_requires(_LessThanComparableConcept<
5665 __glibcxx_requires_valid_range(__first, __last);
5666 __glibcxx_requires_irreflexive(__first, __last);
5668 return _GLIBCXX_STD_A::__min_element(__first, __last,
5669 __gnu_cxx::__ops::less());
5681 template<
typename _ForwardIterator,
typename _Compare>
5682 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
5683 inline _ForwardIterator
5684 min_element(_ForwardIterator __first, _ForwardIterator __last,
5688 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
5689 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5692 __glibcxx_requires_valid_range(__first, __last);
5693 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
5695 return _GLIBCXX_STD_A::__min_element(__first, __last, __comp);
5698 template<
typename _ForwardIterator,
typename _Compare>
5699 _GLIBCXX14_CONSTEXPR
5701 __max_element(_ForwardIterator __first, _ForwardIterator __last,
5704 if (__first == __last)
return __first;
5705 _ForwardIterator __result = __first;
5706 while (++__first != __last)
5707 if (__comp(*__result, *__first))
5719 template<
typename _ForwardIterator>
5720 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
5721 inline _ForwardIterator
5722 max_element(_ForwardIterator __first, _ForwardIterator __last)
5725 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
5726 __glibcxx_function_requires(_LessThanComparableConcept<
5728 __glibcxx_requires_valid_range(__first, __last);
5729 __glibcxx_requires_irreflexive(__first, __last);
5731 return _GLIBCXX_STD_A::__max_element(__first, __last,
5732 __gnu_cxx::__ops::less());
5744 template<
typename _ForwardIterator,
typename _Compare>
5745 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
5746 inline _ForwardIterator
5747 max_element(_ForwardIterator __first, _ForwardIterator __last,
5751 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
5752 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5755 __glibcxx_requires_valid_range(__first, __last);
5756 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
5758 return _GLIBCXX_STD_A::__max_element(__first, __last, __comp);
5761#if __cplusplus >= 201103L
5763 template<
typename _Tp>
5764 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
5766 min(initializer_list<_Tp> __l)
5768 __glibcxx_requires_irreflexive(__l.begin(), __l.end());
5769 return *_GLIBCXX_STD_A::__min_element(__l.begin(), __l.end(),
5770 __gnu_cxx::__ops::less());
5773 template<
typename _Tp,
typename _Compare>
5774 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
5778 __glibcxx_requires_irreflexive_pred(__l.begin(), __l.end(), __comp);
5779 return *_GLIBCXX_STD_A::__min_element(__l.begin(), __l.end(), __comp);
5782 template<
typename _Tp>
5783 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
5787 __glibcxx_requires_irreflexive(__l.begin(), __l.end());
5788 return *_GLIBCXX_STD_A::__max_element(__l.begin(), __l.end(),
5789 __gnu_cxx::__ops::less());
5792 template<
typename _Tp,
typename _Compare>
5793 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
5797 __glibcxx_requires_irreflexive_pred(__l.begin(), __l.end(), __comp);
5798 return *_GLIBCXX_STD_A::__max_element(__l.begin(), __l.end(), __comp);
5802#if __cplusplus >= 201402L
5805 template<typename _InputIterator, typename _RandomAccessIterator,
5806 typename _Size,
typename _UniformRandomBitGenerator>
5807 _RandomAccessIterator
5810 _Size __n, _UniformRandomBitGenerator&& __g)
5813 using __param_type =
typename __distrib_type::param_type;
5814 __distrib_type __d{};
5815 _Size __sample_sz = 0;
5816 while (__first != __last && __sample_sz != __n)
5818 __out[__sample_sz++] = *__first;
5821 for (
auto __pop_sz = __sample_sz; __first != __last;
5822 ++__first, (void) ++__pop_sz)
5824 const auto __k = __d(__g, __param_type{0, __pop_sz});
5826 __out[__k] = *__first;
5828 return __out + __sample_sz;
5832 template<
typename _ForwardIterator,
typename _OutputIterator,
typename _Cat,
5833 typename _Size,
typename _UniformRandomBitGenerator>
5835 __sample(_ForwardIterator __first, _ForwardIterator __last,
5837 _OutputIterator __out, _Cat,
5838 _Size __n, _UniformRandomBitGenerator&& __g)
5841 using __param_type =
typename __distrib_type::param_type;
5846 if (__first == __last)
5849 __distrib_type __d{};
5851 __n =
std::min(__n, __unsampled_sz);
5856 const __uc_type __urngrange = __g.max() - __g.min();
5857 if (__urngrange / __uc_type(__unsampled_sz) >= __uc_type(__unsampled_sz))
5861 while (__n != 0 && __unsampled_sz >= 2)
5867 if (__p.first < __n)
5869 *__out++ = *__first;
5875 if (__n == 0)
break;
5878 if (__p.second < __n)
5880 *__out++ = *__first;
5890 for (; __n != 0; ++__first)
5891 if (__d(__g, __param_type{0, --__unsampled_sz}) < __n)
5893 *__out++ = *__first;
5901#ifdef __glibcxx_sample
5903 template<typename _PopulationIterator, typename _SampleIterator,
5904 typename _Distance,
typename _UniformRandomBitGenerator>
5906 sample(_PopulationIterator __first, _PopulationIterator __last,
5907 _SampleIterator __out, _Distance __n,
5908 _UniformRandomBitGenerator&& __g)
5911 =
decltype(std::__iter_concept_or_category<_PopulationIterator>());
5916 __or_<is_convertible<__pop_cat, forward_iterator_tag>,
5917 is_convertible<__samp_cat, random_access_iterator_tag>>::value,
5918 "output range must use a RandomAccessIterator when input range"
5919 " does not meet the ForwardIterator requirements");
5922 "sample size must be an integer type");
5925 return _GLIBCXX_STD_A::
5926 __sample(__first, __last, __pop_cat{}, __out, __samp_cat{}, __d,
5931_GLIBCXX_END_NAMESPACE_ALGO
5932_GLIBCXX_END_NAMESPACE_VERSION
5935#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...