64#if __cplusplus >= 201103L
70# if (__cplusplus <= 201103L || _GLIBCXX_USE_DEPRECATED)
77namespace std _GLIBCXX_VISIBILITY(default)
79_GLIBCXX_BEGIN_NAMESPACE_VERSION
82 template<
typename _Iterator,
typename _Compare>
86 _Iterator __c, _Compare __comp)
91 std::iter_swap(__result, __b);
92 else if (__comp(__a, __c))
93 std::iter_swap(__result, __c);
95 std::iter_swap(__result, __a);
97 else if (__comp(__a, __c))
98 std::iter_swap(__result, __a);
99 else if (__comp(__b, __c))
100 std::iter_swap(__result, __c);
102 std::iter_swap(__result, __b);
106 template<
typename _InputIterator,
typename _Predicate>
108 inline _InputIterator
112 return std::__find_if(__first, __last,
113 __gnu_cxx::__ops::__negate(__pred));
119 template<
typename _InputIterator,
typename _Predicate,
typename _Distance>
124 for (; __len; --__len, (void) ++__first)
125 if (!__pred(__first))
147 template<
typename _ForwardIterator,
typename _Integer,
148 typename _UnaryPredicate>
152 _Integer __count, _UnaryPredicate __unary_pred,
155 __first = std::__find_if(__first, __last, __unary_pred);
156 while (__first != __last)
160 _ForwardIterator __i = __first;
162 while (__i != __last && __n != 1 && __unary_pred(__i))
171 __first = std::__find_if(++__i, __last, __unary_pred);
180 template<
typename _RandomAccessIter,
typename _Integer,
181 typename _UnaryPredicate>
185 _Integer __count, _UnaryPredicate __unary_pred,
191 _DistanceType __tailSize = __last - __first;
192 _DistanceType __remainder = __count;
194 while (__remainder <= __tailSize)
196 __first += __remainder;
197 __tailSize -= __remainder;
200 _RandomAccessIter __backTrack = __first;
201 while (__unary_pred(--__backTrack))
203 if (--__remainder == 0)
204 return (__first - __count);
206 __remainder = __count + 1 - (__first - __backTrack);
211 template<
typename _ForwardIterator,
typename _Integer,
212 typename _UnaryPredicate>
215 __search_n(_ForwardIterator __first, _ForwardIterator __last,
217 _UnaryPredicate __unary_pred)
223 return std::__find_if(__first, __last, __unary_pred);
230 template<
typename _ForwardIterator1,
typename _ForwardIterator2,
231 typename _BinaryPredicate>
234 __find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
235 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
236 forward_iterator_tag, forward_iterator_tag,
237 _BinaryPredicate __comp)
239 if (__first2 == __last2)
242 _ForwardIterator1 __result = __last1;
245 _ForwardIterator1 __new_result
246 = std::__search(__first1, __last1, __first2, __last2, __comp);
247 if (__new_result == __last1)
251 __result = __new_result;
252 __first1 = __new_result;
259 template<
typename _BidirectionalIterator1,
typename _BidirectionalIterator2,
260 typename _BinaryPredicate>
262 _BidirectionalIterator1
263 __find_end(_BidirectionalIterator1 __first1,
264 _BidirectionalIterator1 __last1,
265 _BidirectionalIterator2 __first2,
266 _BidirectionalIterator2 __last2,
267 bidirectional_iterator_tag, bidirectional_iterator_tag,
268 _BinaryPredicate __comp)
271 __glibcxx_function_requires(_BidirectionalIteratorConcept<
272 _BidirectionalIterator1>)
273 __glibcxx_function_requires(_BidirectionalIteratorConcept<
274 _BidirectionalIterator2>)
276 typedef reverse_iterator<_BidirectionalIterator1> _RevIterator1;
277 typedef reverse_iterator<_BidirectionalIterator2> _RevIterator2;
279 _RevIterator1 __rlast1(__first1);
280 _RevIterator2 __rlast2(__first2);
281 _RevIterator1 __rresult =
std::__search(_RevIterator1(__last1), __rlast1,
282 _RevIterator2(__last2), __rlast2,
285 if (__rresult == __rlast1)
289 _BidirectionalIterator1 __result = __rresult.base();
321 template<
typename _ForwardIterator1,
typename _ForwardIterator2>
322 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
323 inline _ForwardIterator1
324 find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
325 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
328 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
329 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
330 __glibcxx_function_requires(_EqualOpConcept<
333 __glibcxx_requires_valid_range(__first1, __last1);
334 __glibcxx_requires_valid_range(__first2, __last2);
336 return std::__find_end(__first1, __last1, __first2, __last2,
339 __gnu_cxx::__ops::__iter_equal_to_iter());
370 template<
typename _ForwardIterator1,
typename _ForwardIterator2,
371 typename _BinaryPredicate>
372 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
373 inline _ForwardIterator1
374 find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
375 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
376 _BinaryPredicate __comp)
379 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
380 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
381 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
384 __glibcxx_requires_valid_range(__first1, __last1);
385 __glibcxx_requires_valid_range(__first2, __last2);
387 return std::__find_end(__first1, __last1, __first2, __last2,
390 __gnu_cxx::__ops::__iter_comp_iter(__comp));
393#if __cplusplus >= 201103L
406 template<
typename _InputIterator,
typename _Predicate>
407 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
409 all_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
410 {
return __last == std::find_if_not(__first, __last, __pred); }
424 template<
typename _InputIterator,
typename _Predicate>
425 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
427 none_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
428 {
return __last == _GLIBCXX_STD_A::find_if(__first, __last, __pred); }
443 template<
typename _InputIterator,
typename _Predicate>
444 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
446 any_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
447 {
return !std::none_of(__first, __last, __pred); }
459 template<
typename _InputIterator,
typename _Predicate>
460 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
461 inline _InputIterator
462 find_if_not(_InputIterator __first, _InputIterator __last,
466 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
467 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
469 __glibcxx_requires_valid_range(__first, __last);
471 __gnu_cxx::__ops::__pred_iter(__pred));
484 template<
typename _InputIterator,
typename _Predicate>
485 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
487 is_partitioned(_InputIterator __first, _InputIterator __last,
490 __first = std::find_if_not(__first, __last, __pred);
491 if (__first == __last)
494 return std::none_of(__first, __last, __pred);
506 template<
typename _ForwardIterator,
typename _Predicate>
507 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
509 partition_point(_ForwardIterator __first, _ForwardIterator __last,
513 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
514 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
518 __glibcxx_requires_valid_range(__first, __last);
527 _DistanceType __half = __len >> 1;
528 _ForwardIterator __middle = __first;
530 if (__pred(*__middle))
534 __len = __len - __half - 1;
543 template<
typename _InputIterator,
typename _OutputIterator,
547 __remove_copy_if(_InputIterator __first, _InputIterator __last,
548 _OutputIterator __result, _Predicate __pred)
550 for (; __first != __last; ++__first)
551 if (!__pred(__first))
553 *__result = *__first;
573 template<
typename _InputIterator,
typename _OutputIterator,
typename _Tp>
575 inline _OutputIterator
576 remove_copy(_InputIterator __first, _InputIterator __last,
577 _OutputIterator __result,
const _Tp& __value)
580 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
581 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
583 __glibcxx_function_requires(_EqualOpConcept<
585 __glibcxx_requires_valid_range(__first, __last);
587 return std::__remove_copy_if(__first, __last, __result,
588 __gnu_cxx::__ops::__iter_equals_val(__value));
606 template<
typename _InputIterator,
typename _OutputIterator,
609 inline _OutputIterator
610 remove_copy_if(_InputIterator __first, _InputIterator __last,
611 _OutputIterator __result, _Predicate __pred)
614 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
615 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
617 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
619 __glibcxx_requires_valid_range(__first, __last);
621 return std::__remove_copy_if(__first, __last, __result,
622 __gnu_cxx::__ops::__pred_iter(__pred));
625#if __cplusplus >= 201103L
641 template<
typename _InputIterator,
typename _OutputIterator,
645 copy_if(_InputIterator __first, _InputIterator __last,
646 _OutputIterator __result, _Predicate __pred)
649 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
650 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
652 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
654 __glibcxx_requires_valid_range(__first, __last);
656 for (; __first != __last; ++__first)
657 if (__pred(*__first))
659 *__result = *__first;
665 template<
typename _InputIterator,
typename _Size,
typename _OutputIterator>
668 __copy_n(_InputIterator __first, _Size __n,
669 _OutputIterator __result, input_iterator_tag)
671 return std::__niter_wrap(__result,
672 __copy_n_a(__first, __n,
673 std::__niter_base(__result),
true));
676 template<
typename _RandomAccessIterator,
typename _Size,
677 typename _OutputIterator>
679 inline _OutputIterator
680 __copy_n(_RandomAccessIterator __first, _Size __n,
681 _OutputIterator __result, random_access_iterator_tag)
682 {
return std::copy(__first, __first + __n, __result); }
697 template<
typename _InputIterator,
typename _Size,
typename _OutputIterator>
699 inline _OutputIterator
700 copy_n(_InputIterator __first, _Size __n, _OutputIterator __result)
703 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
704 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
707 const auto __n2 = std::__size_to_integer(__n);
711 __glibcxx_requires_can_increment(__first, __n2);
712 __glibcxx_requires_can_increment(__result, __n2);
714 return std::__copy_n(__first, __n2, __result,
733 template<
typename _InputIterator,
typename _OutputIterator1,
734 typename _OutputIterator2,
typename _Predicate>
736 pair<_OutputIterator1, _OutputIterator2>
737 partition_copy(_InputIterator __first, _InputIterator __last,
738 _OutputIterator1 __out_true, _OutputIterator2 __out_false,
742 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
743 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator1,
745 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator2,
747 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
749 __glibcxx_requires_valid_range(__first, __last);
751 for (; __first != __last; ++__first)
752 if (__pred(*__first))
754 *__out_true = *__first;
759 *__out_false = *__first;
784 template<
typename _ForwardIterator,
typename _Tp>
785 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
786 inline _ForwardIterator
787 remove(_ForwardIterator __first, _ForwardIterator __last,
791 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
793 __glibcxx_function_requires(_EqualOpConcept<
795 __glibcxx_requires_valid_range(__first, __last);
797 return std::__remove_if(__first, __last,
798 __gnu_cxx::__ops::__iter_equals_val(__value));
818 template<
typename _ForwardIterator,
typename _Predicate>
819 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
820 inline _ForwardIterator
821 remove_if(_ForwardIterator __first, _ForwardIterator __last,
825 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
827 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
829 __glibcxx_requires_valid_range(__first, __last);
831 return std::__remove_if(__first, __last,
832 __gnu_cxx::__ops::__pred_iter(__pred));
835 template<
typename _ForwardIterator,
typename _BinaryPredicate>
838 __adjacent_find(_ForwardIterator __first, _ForwardIterator __last,
839 _BinaryPredicate __binary_pred)
841 if (__first == __last)
843 _ForwardIterator __next = __first;
844 while (++__next != __last)
846 if (__binary_pred(__first, __next))
853 template<
typename _ForwardIterator,
typename _BinaryPredicate>
856 __unique(_ForwardIterator __first, _ForwardIterator __last,
857 _BinaryPredicate __binary_pred)
860 __first = std::__adjacent_find(__first, __last, __binary_pred);
861 if (__first == __last)
865 _ForwardIterator __dest = __first;
867 while (++__first != __last)
868 if (!__binary_pred(__dest, __first))
869 *++__dest = _GLIBCXX_MOVE(*__first);
887 template<
typename _ForwardIterator>
888 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
889 inline _ForwardIterator
890 unique(_ForwardIterator __first, _ForwardIterator __last)
893 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
895 __glibcxx_function_requires(_EqualityComparableConcept<
897 __glibcxx_requires_valid_range(__first, __last);
899 return std::__unique(__first, __last,
900 __gnu_cxx::__ops::__iter_equal_to_iter());
918 template<
typename _ForwardIterator,
typename _BinaryPredicate>
919 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
920 inline _ForwardIterator
921 unique(_ForwardIterator __first, _ForwardIterator __last,
922 _BinaryPredicate __binary_pred)
925 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
927 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
930 __glibcxx_requires_valid_range(__first, __last);
932 return std::__unique(__first, __last,
933 __gnu_cxx::__ops::__iter_comp_iter(__binary_pred));
942 template<
typename _ForwardIterator,
typename _OutputIterator,
943 typename _BinaryPredicate>
947 _OutputIterator __result, _BinaryPredicate __binary_pred,
951 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
955 _ForwardIterator __next = __first;
956 *__result = *__first;
957 while (++__next != __last)
958 if (!__binary_pred(__first, __next))
961 *++__result = *__first;
972 template<
typename _InputIterator,
typename _OutputIterator,
973 typename _BinaryPredicate>
977 _OutputIterator __result, _BinaryPredicate __binary_pred,
981 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
986 __decltype(__gnu_cxx::__ops::__iter_comp_val(__binary_pred))
988 = __gnu_cxx::__ops::__iter_comp_val(__binary_pred);
990 while (++__first != __last)
991 if (!__rebound_pred(__first, __value))
994 *++__result = __value;
1005 template<
typename _InputIterator,
typename _ForwardIterator,
1006 typename _BinaryPredicate>
1007 _GLIBCXX20_CONSTEXPR
1010 _ForwardIterator __result, _BinaryPredicate __binary_pred,
1014 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
1017 *__result = *__first;
1018 while (++__first != __last)
1019 if (!__binary_pred(__result, __first))
1020 *++__result = *__first;
1029 template<
typename _B
idirectionalIterator>
1030 _GLIBCXX20_CONSTEXPR
1032 __reverse(_BidirectionalIterator __first, _BidirectionalIterator __last,
1036 if (__first == __last || __first == --__last)
1040 std::iter_swap(__first, __last);
1050 template<
typename _RandomAccessIterator>
1051 _GLIBCXX20_CONSTEXPR
1053 __reverse(_RandomAccessIterator __first, _RandomAccessIterator __last,
1056 if (__first == __last)
1059 while (__first < __last)
1061 std::iter_swap(__first, __last);
1079 template<
typename _B
idirectionalIterator>
1080 _GLIBCXX20_CONSTEXPR
1082 reverse(_BidirectionalIterator __first, _BidirectionalIterator __last)
1085 __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
1086 _BidirectionalIterator>)
1087 __glibcxx_requires_valid_range(__first, __last);
1107 template<
typename _B
idirectionalIterator,
typename _OutputIterator>
1108 _GLIBCXX20_CONSTEXPR
1110 reverse_copy(_BidirectionalIterator __first, _BidirectionalIterator __last,
1111 _OutputIterator __result)
1114 __glibcxx_function_requires(_BidirectionalIteratorConcept<
1115 _BidirectionalIterator>)
1116 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
1118 __glibcxx_requires_valid_range(__first, __last);
1120 while (__first != __last)
1123 *__result = *__last;
1133 template<
typename _Eucl
ideanRingElement>
1134 _GLIBCXX20_CONSTEXPR
1135 _EuclideanRingElement
1136 __gcd(_EuclideanRingElement __m, _EuclideanRingElement __n)
1140 _EuclideanRingElement __t = __m % __n;
1147_GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE(_V2)
1150 template<
typename _ForwardIterator>
1151 _GLIBCXX20_CONSTEXPR
1154 _ForwardIterator __middle,
1155 _ForwardIterator __last,
1158 if (__first == __middle)
1160 else if (__last == __middle)
1163 _ForwardIterator __first2 = __middle;
1166 std::iter_swap(__first, __first2);
1169 if (__first == __middle)
1170 __middle = __first2;
1172 while (__first2 != __last);
1174 _ForwardIterator __ret = __first;
1176 __first2 = __middle;
1178 while (__first2 != __last)
1180 std::iter_swap(__first, __first2);
1183 if (__first == __middle)
1184 __middle = __first2;
1185 else if (__first2 == __last)
1186 __first2 = __middle;
1192 template<
typename _B
idirectionalIterator>
1193 _GLIBCXX20_CONSTEXPR
1194 _BidirectionalIterator
1196 _BidirectionalIterator __middle,
1197 _BidirectionalIterator __last,
1201 __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
1202 _BidirectionalIterator>)
1204 if (__first == __middle)
1206 else if (__last == __middle)
1212 while (__first != __middle && __middle != __last)
1214 std::iter_swap(__first, --__last);
1218 if (__first == __middle)
1231 template<
typename _RandomAccessIterator>
1232 _GLIBCXX20_CONSTEXPR
1233 _RandomAccessIterator
1235 _RandomAccessIterator __middle,
1236 _RandomAccessIterator __last,
1240 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
1241 _RandomAccessIterator>)
1243 if (__first == __middle)
1245 else if (__last == __middle)
1253#if __cplusplus >= 201103L
1254 typedef typename make_unsigned<_Distance>::type _UDistance;
1256 typedef _Distance _UDistance;
1259 _Distance __n = __last - __first;
1260 _Distance __k = __middle - __first;
1262 if (__k == __n - __k)
1264 std::swap_ranges(__first, __middle, __middle);
1268 _RandomAccessIterator __p = __first;
1269 _RandomAccessIterator __ret = __first + (__last - __middle);
1273 if (__k < __n - __k)
1275 if (__is_pod(_ValueType) && __k == 1)
1277 _ValueType __t = _GLIBCXX_MOVE(*__p);
1278 _GLIBCXX_MOVE3(__p + 1, __p + __n, __p);
1279 *(__p + __n - 1) = _GLIBCXX_MOVE(__t);
1282 _RandomAccessIterator __q = __p + __k;
1283 for (_Distance __i = 0; __i < __n - __k; ++ __i)
1285 std::iter_swap(__p, __q);
1289 __n =
static_cast<_UDistance
>(__n) %
static_cast<_UDistance
>(__k);
1292 std::swap(__n, __k);
1298 if (__is_pod(_ValueType) && __k == 1)
1300 _ValueType __t = _GLIBCXX_MOVE(*(__p + __n - 1));
1301 _GLIBCXX_MOVE_BACKWARD3(__p, __p + __n - 1, __p + __n);
1302 *__p = _GLIBCXX_MOVE(__t);
1305 _RandomAccessIterator __q = __p + __n;
1307 for (_Distance __i = 0; __i < __n - __k; ++ __i)
1311 std::iter_swap(__p, __q);
1313 __n =
static_cast<_UDistance
>(__n) %
static_cast<_UDistance
>(__k);
1316 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);
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));
1400 template<
typename _ForwardIterator,
typename _Predicate>
1401 _GLIBCXX20_CONSTEXPR
1406 if (__first == __last)
1409 while (__pred(*__first))
1410 if (++__first == __last)
1413 _ForwardIterator __next = __first;
1415 while (++__next != __last)
1416 if (__pred(*__next))
1418 std::iter_swap(__first, __next);
1426 template<
typename _B
idirectionalIterator,
typename _Predicate>
1427 _GLIBCXX20_CONSTEXPR
1428 _BidirectionalIterator
1429 __partition(_BidirectionalIterator __first, _BidirectionalIterator __last,
1435 if (__first == __last)
1437 else if (__pred(*__first))
1443 if (__first == __last)
1445 else if (!
bool(__pred(*__last)))
1449 std::iter_swap(__first, __last);
1463 template<
typename _ForwardIterator,
typename _Pointer,
typename _Predicate,
1467 _ForwardIterator __last,
1468 _Predicate __pred, _Distance __len,
1470 _Distance __buffer_size)
1475 if (__len <= __buffer_size)
1477 _ForwardIterator __result1 = __first;
1478 _Pointer __result2 = __buffer;
1483 *__result2 = _GLIBCXX_MOVE(*__first);
1486 for (; __first != __last; ++__first)
1487 if (__pred(__first))
1489 *__result1 = _GLIBCXX_MOVE(*__first);
1494 *__result2 = _GLIBCXX_MOVE(*__first);
1498 _GLIBCXX_MOVE3(__buffer, __result2, __result1);
1502 _ForwardIterator __middle = __first;
1504 _ForwardIterator __left_split =
1506 __len / 2, __buffer,
1511 _Distance __right_len = __len - __len / 2;
1512 _ForwardIterator __right_split =
1519 __buffer, __buffer_size);
1521 return std::rotate(__left_split, __middle, __right_split);
1524 template<
typename _ForwardIterator,
typename _Predicate>
1526 __stable_partition(_ForwardIterator __first, _ForwardIterator __last,
1531 if (__first == __last)
1534 typedef typename iterator_traits<_ForwardIterator>::value_type
1536 typedef typename iterator_traits<_ForwardIterator>::difference_type
1539 _Temporary_buffer<_ForwardIterator, _ValueType>
1543 _DistanceType(__buf.requested_size()),
1545 _DistanceType(__buf.size()));
1565 template<
typename _ForwardIterator,
typename _Predicate>
1566 inline _ForwardIterator
1567 stable_partition(_ForwardIterator __first, _ForwardIterator __last,
1571 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
1573 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
1575 __glibcxx_requires_valid_range(__first, __last);
1577 return std::__stable_partition(__first, __last,
1578 __gnu_cxx::__ops::__pred_iter(__pred));
1585 template<
typename _RandomAccessIterator,
typename _Compare>
1586 _GLIBCXX20_CONSTEXPR
1588 __heap_select(_RandomAccessIterator __first,
1589 _RandomAccessIterator __middle,
1590 _RandomAccessIterator __last, _Compare __comp)
1592 std::__make_heap(__first, __middle, __comp);
1593 for (_RandomAccessIterator __i = __middle; __i < __last; ++__i)
1594 if (__comp(__i, __first))
1595 std::__pop_heap(__first, __middle, __i, __comp);
1600 template<
typename _InputIterator,
typename _RandomAccessIterator,
1602 _GLIBCXX20_CONSTEXPR
1603 _RandomAccessIterator
1604 __partial_sort_copy(_InputIterator __first, _InputIterator __last,
1605 _RandomAccessIterator __result_first,
1606 _RandomAccessIterator __result_last,
1609 typedef typename iterator_traits<_InputIterator>::value_type
1611 typedef iterator_traits<_RandomAccessIterator> _RItTraits;
1612 typedef typename _RItTraits::difference_type _DistanceType;
1614 if (__result_first == __result_last)
1615 return __result_last;
1616 _RandomAccessIterator __result_real_last = __result_first;
1617 while (__first != __last && __result_real_last != __result_last)
1619 *__result_real_last = *__first;
1620 ++__result_real_last;
1624 std::__make_heap(__result_first, __result_real_last, __comp);
1625 while (__first != __last)
1627 if (__comp(__first, __result_first))
1628 std::__adjust_heap(__result_first, _DistanceType(0),
1629 _DistanceType(__result_real_last
1631 _InputValueType(*__first), __comp);
1634 std::__sort_heap(__result_first, __result_real_last, __comp);
1635 return __result_real_last;
1658 template<
typename _InputIterator,
typename _RandomAccessIterator>
1659 _GLIBCXX20_CONSTEXPR
1660 inline _RandomAccessIterator
1661 partial_sort_copy(_InputIterator __first, _InputIterator __last,
1662 _RandomAccessIterator __result_first,
1663 _RandomAccessIterator __result_last)
1665#ifdef _GLIBCXX_CONCEPT_CHECKS
1673 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
1674 __glibcxx_function_requires(_ConvertibleConcept<_InputValueType,
1676 __glibcxx_function_requires(_LessThanOpConcept<_InputValueType,
1678 __glibcxx_function_requires(_LessThanComparableConcept<_OutputValueType>)
1679 __glibcxx_requires_valid_range(__first, __last);
1680 __glibcxx_requires_irreflexive(__first, __last);
1681 __glibcxx_requires_valid_range(__result_first, __result_last);
1683 return std::__partial_sort_copy(__first, __last,
1684 __result_first, __result_last,
1685 __gnu_cxx::__ops::__iter_less_iter());
1708 template<
typename _InputIterator,
typename _RandomAccessIterator,
1710 _GLIBCXX20_CONSTEXPR
1711 inline _RandomAccessIterator
1712 partial_sort_copy(_InputIterator __first, _InputIterator __last,
1713 _RandomAccessIterator __result_first,
1714 _RandomAccessIterator __result_last,
1717#ifdef _GLIBCXX_CONCEPT_CHECKS
1725 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
1726 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
1727 _RandomAccessIterator>)
1728 __glibcxx_function_requires(_ConvertibleConcept<_InputValueType,
1730 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
1731 _InputValueType, _OutputValueType>)
1732 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
1733 _OutputValueType, _OutputValueType>)
1734 __glibcxx_requires_valid_range(__first, __last);
1735 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
1736 __glibcxx_requires_valid_range(__result_first, __result_last);
1738 return std::__partial_sort_copy(__first, __last,
1739 __result_first, __result_last,
1740 __gnu_cxx::__ops::__iter_comp_iter(__comp));
1746 template<
typename _RandomAccessIterator,
typename _Compare>
1747 _GLIBCXX20_CONSTEXPR
1749 __unguarded_linear_insert(_RandomAccessIterator __last,
1752 typename iterator_traits<_RandomAccessIterator>::value_type
1753 __val = _GLIBCXX_MOVE(*__last);
1754 _RandomAccessIterator __next = __last;
1756 while (__comp(__val, __next))
1758 *__last = _GLIBCXX_MOVE(*__next);
1762 *__last = _GLIBCXX_MOVE(__val);
1766 template<
typename _RandomAccessIterator,
typename _Compare>
1767 _GLIBCXX20_CONSTEXPR
1769 __insertion_sort(_RandomAccessIterator __first,
1770 _RandomAccessIterator __last, _Compare __comp)
1772 if (__first == __last)
return;
1774 for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
1776 if (__comp(__i, __first))
1778 typename iterator_traits<_RandomAccessIterator>::value_type
1779 __val = _GLIBCXX_MOVE(*__i);
1780 _GLIBCXX_MOVE_BACKWARD3(__first, __i, __i + 1);
1781 *__first = _GLIBCXX_MOVE(__val);
1784 std::__unguarded_linear_insert(__i,
1785 __gnu_cxx::__ops::__val_comp_iter(__comp));
1790 template<
typename _RandomAccessIterator,
typename _Compare>
1791 _GLIBCXX20_CONSTEXPR
1793 __unguarded_insertion_sort(_RandomAccessIterator __first,
1794 _RandomAccessIterator __last, _Compare __comp)
1796 for (_RandomAccessIterator __i = __first; __i != __last; ++__i)
1797 std::__unguarded_linear_insert(__i,
1798 __gnu_cxx::__ops::__val_comp_iter(__comp));
1805 enum { _S_threshold = 16 };
1808 template<
typename _RandomAccessIterator,
typename _Compare>
1809 _GLIBCXX20_CONSTEXPR
1811 __final_insertion_sort(_RandomAccessIterator __first,
1812 _RandomAccessIterator __last, _Compare __comp)
1814 if (__last - __first >
int(_S_threshold))
1816 std::__insertion_sort(__first, __first +
int(_S_threshold), __comp);
1817 std::__unguarded_insertion_sort(__first +
int(_S_threshold), __last,
1821 std::__insertion_sort(__first, __last, __comp);
1825 template<
typename _RandomAccessIterator,
typename _Compare>
1826 _GLIBCXX20_CONSTEXPR
1827 _RandomAccessIterator
1828 __unguarded_partition(_RandomAccessIterator __first,
1829 _RandomAccessIterator __last,
1830 _RandomAccessIterator __pivot, _Compare __comp)
1834 while (__comp(__first, __pivot))
1837 while (__comp(__pivot, __last))
1839 if (!(__first < __last))
1841 std::iter_swap(__first, __last);
1847 template<
typename _RandomAccessIterator,
typename _Compare>
1848 _GLIBCXX20_CONSTEXPR
1849 inline _RandomAccessIterator
1850 __unguarded_partition_pivot(_RandomAccessIterator __first,
1851 _RandomAccessIterator __last, _Compare __comp)
1853 _RandomAccessIterator __mid = __first + (__last - __first) / 2;
1856 return std::__unguarded_partition(__first + 1, __last, __first, __comp);
1859 template<
typename _RandomAccessIterator,
typename _Compare>
1860 _GLIBCXX20_CONSTEXPR
1862 __partial_sort(_RandomAccessIterator __first,
1863 _RandomAccessIterator __middle,
1864 _RandomAccessIterator __last,
1867 std::__heap_select(__first, __middle, __last, __comp);
1868 std::__sort_heap(__first, __middle, __comp);
1872 template<
typename _RandomAccessIterator,
typename _Size,
typename _Compare>
1873 _GLIBCXX20_CONSTEXPR
1875 __introsort_loop(_RandomAccessIterator __first,
1876 _RandomAccessIterator __last,
1877 _Size __depth_limit, _Compare __comp)
1879 while (__last - __first >
int(_S_threshold))
1881 if (__depth_limit == 0)
1883 std::__partial_sort(__first, __last, __last, __comp);
1887 _RandomAccessIterator __cut =
1888 std::__unguarded_partition_pivot(__first, __last, __comp);
1889 std::__introsort_loop(__cut, __last, __depth_limit, __comp);
1896 template<
typename _RandomAccessIterator,
typename _Compare>
1897 _GLIBCXX20_CONSTEXPR
1899 __sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
1902 if (__first != __last)
1904 std::__introsort_loop(__first, __last,
1907 std::__final_insertion_sort(__first, __last, __comp);
1911 template<
typename _RandomAccessIterator,
typename _Size,
typename _Compare>
1912 _GLIBCXX20_CONSTEXPR
1914 __introselect(_RandomAccessIterator __first, _RandomAccessIterator __nth,
1915 _RandomAccessIterator __last, _Size __depth_limit,
1918 while (__last - __first > 3)
1920 if (__depth_limit == 0)
1922 std::__heap_select(__first, __nth + 1, __last, __comp);
1924 std::iter_swap(__first, __nth);
1928 _RandomAccessIterator __cut =
1929 std::__unguarded_partition_pivot(__first, __last, __comp);
1935 std::__insertion_sort(__first, __last, __comp);
1959 template<
typename _ForwardIterator,
typename _Tp,
typename _Compare>
1960 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1961 inline _ForwardIterator
1962 lower_bound(_ForwardIterator __first, _ForwardIterator __last,
1963 const _Tp& __val, _Compare __comp)
1966 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
1967 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
1969 __glibcxx_requires_partitioned_lower_pred(__first, __last,
1972 return std::__lower_bound(__first, __last, __val,
1973 __gnu_cxx::__ops::__iter_comp_val(__comp));
1976 template<
typename _ForwardIterator,
typename _Tp,
typename _Compare>
1977 _GLIBCXX20_CONSTEXPR
1979 __upper_bound(_ForwardIterator __first, _ForwardIterator __last,
1980 const _Tp& __val, _Compare __comp)
1982 typedef typename iterator_traits<_ForwardIterator>::difference_type
1989 _DistanceType __half = __len >> 1;
1990 _ForwardIterator __middle = __first;
1992 if (__comp(__val, __middle))
1998 __len = __len - __half - 1;
2015 template<
typename _ForwardIterator,
typename _Tp>
2016 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
2017 inline _ForwardIterator
2018 upper_bound(_ForwardIterator __first, _ForwardIterator __last,
2022 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2023 __glibcxx_function_requires(_LessThanOpConcept<
2025 __glibcxx_requires_partitioned_upper(__first, __last, __val);
2027 return std::__upper_bound(__first, __last, __val,
2028 __gnu_cxx::__ops::__val_less_iter());
2046 template<
typename _ForwardIterator,
typename _Tp,
typename _Compare>
2047 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
2048 inline _ForwardIterator
2049 upper_bound(_ForwardIterator __first, _ForwardIterator __last,
2050 const _Tp& __val, _Compare __comp)
2053 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2054 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2056 __glibcxx_requires_partitioned_upper_pred(__first, __last,
2059 return std::__upper_bound(__first, __last, __val,
2060 __gnu_cxx::__ops::__val_comp_iter(__comp));
2063 template<
typename _ForwardIterator,
typename _Tp,
2064 typename _CompareItTp,
typename _CompareTpIt>
2065 _GLIBCXX20_CONSTEXPR
2066 pair<_ForwardIterator, _ForwardIterator>
2067 __equal_range(_ForwardIterator __first, _ForwardIterator __last,
2069 _CompareItTp __comp_it_val, _CompareTpIt __comp_val_it)
2071 typedef typename iterator_traits<_ForwardIterator>::difference_type
2078 _DistanceType __half = __len >> 1;
2079 _ForwardIterator __middle = __first;
2081 if (__comp_it_val(__middle, __val))
2085 __len = __len - __half - 1;
2087 else if (__comp_val_it(__val, __middle))
2091 _ForwardIterator __left
2092 = std::__lower_bound(__first, __middle, __val, __comp_it_val);
2094 _ForwardIterator __right
2095 = std::__upper_bound(++__middle, __first, __val, __comp_val_it);
2096 return pair<_ForwardIterator, _ForwardIterator>(__left, __right);
2099 return pair<_ForwardIterator, _ForwardIterator>(__first, __first);
2119 template<
typename _ForwardIterator,
typename _Tp>
2120 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
2121 inline pair<_ForwardIterator, _ForwardIterator>
2122 equal_range(_ForwardIterator __first, _ForwardIterator __last,
2126 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2127 __glibcxx_function_requires(_LessThanOpConcept<
2129 __glibcxx_function_requires(_LessThanOpConcept<
2131 __glibcxx_requires_partitioned_lower(__first, __last, __val);
2132 __glibcxx_requires_partitioned_upper(__first, __last, __val);
2134 return std::__equal_range(__first, __last, __val,
2135 __gnu_cxx::__ops::__iter_less_val(),
2136 __gnu_cxx::__ops::__val_less_iter());
2156 template<
typename _ForwardIterator,
typename _Tp,
typename _Compare>
2157 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
2158 inline pair<_ForwardIterator, _ForwardIterator>
2159 equal_range(_ForwardIterator __first, _ForwardIterator __last,
2160 const _Tp& __val, _Compare __comp)
2163 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2164 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2166 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2168 __glibcxx_requires_partitioned_lower_pred(__first, __last,
2170 __glibcxx_requires_partitioned_upper_pred(__first, __last,
2173 return std::__equal_range(__first, __last, __val,
2174 __gnu_cxx::__ops::__iter_comp_val(__comp),
2175 __gnu_cxx::__ops::__val_comp_iter(__comp));
2190 template<
typename _ForwardIterator,
typename _Tp>
2191 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
2193 binary_search(_ForwardIterator __first, _ForwardIterator __last,
2197 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2198 __glibcxx_function_requires(_LessThanOpConcept<
2200 __glibcxx_requires_partitioned_lower(__first, __last, __val);
2201 __glibcxx_requires_partitioned_upper(__first, __last, __val);
2203 _ForwardIterator __i
2204 = std::__lower_bound(__first, __last, __val,
2205 __gnu_cxx::__ops::__iter_less_val());
2206 return __i != __last && !(__val < *__i);
2224 template<
typename _ForwardIterator,
typename _Tp,
typename _Compare>
2225 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
2227 binary_search(_ForwardIterator __first, _ForwardIterator __last,
2228 const _Tp& __val, _Compare __comp)
2231 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
2232 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2234 __glibcxx_requires_partitioned_lower_pred(__first, __last,
2236 __glibcxx_requires_partitioned_upper_pred(__first, __last,
2239 _ForwardIterator __i
2240 = std::__lower_bound(__first, __last, __val,
2241 __gnu_cxx::__ops::__iter_comp_val(__comp));
2242 return __i != __last && !bool(__comp(__val, *__i));
2248 template<
typename _InputIterator1,
typename _InputIterator2,
2249 typename _OutputIterator,
typename _Compare>
2252 _InputIterator2 __first2, _InputIterator2 __last2,
2253 _OutputIterator __result, _Compare __comp)
2255 while (__first1 != __last1 && __first2 != __last2)
2257 if (__comp(__first2, __first1))
2259 *__result = _GLIBCXX_MOVE(*__first2);
2264 *__result = _GLIBCXX_MOVE(*__first1);
2269 if (__first1 != __last1)
2270 _GLIBCXX_MOVE3(__first1, __last1, __result);
2274 template<
typename _BidirectionalIterator1,
typename _BidirectionalIterator2,
2275 typename _BidirectionalIterator3,
typename _Compare>
2278 _BidirectionalIterator1 __last1,
2279 _BidirectionalIterator2 __first2,
2280 _BidirectionalIterator2 __last2,
2281 _BidirectionalIterator3 __result,
2284 if (__first1 == __last1)
2286 _GLIBCXX_MOVE_BACKWARD3(__first2, __last2, __result);
2289 else if (__first2 == __last2)
2296 if (__comp(__last2, __last1))
2298 *--__result = _GLIBCXX_MOVE(*__last1);
2299 if (__first1 == __last1)
2301 _GLIBCXX_MOVE_BACKWARD3(__first2, ++__last2, __result);
2308 *--__result = _GLIBCXX_MOVE(*__last2);
2309 if (__first2 == __last2)
2317 template<
typename _BidirectionalIterator1,
typename _BidirectionalIterator2,
2319 _BidirectionalIterator1
2321 _BidirectionalIterator1 __middle,
2322 _BidirectionalIterator1 __last,
2323 _Distance __len1, _Distance __len2,
2324 _BidirectionalIterator2 __buffer,
2325 _Distance __buffer_size)
2327 _BidirectionalIterator2 __buffer_end;
2328 if (__len1 > __len2 && __len2 <= __buffer_size)
2332 __buffer_end = _GLIBCXX_MOVE3(__middle, __last, __buffer);
2333 _GLIBCXX_MOVE_BACKWARD3(__first, __middle, __last);
2334 return _GLIBCXX_MOVE3(__buffer, __buffer_end, __first);
2339 else if (__len1 <= __buffer_size)
2343 __buffer_end = _GLIBCXX_MOVE3(__first, __middle, __buffer);
2344 _GLIBCXX_MOVE3(__middle, __last, __first);
2345 return _GLIBCXX_MOVE_BACKWARD3(__buffer, __buffer_end, __last);
2351 return std::rotate(__first, __middle, __last);
2355 template<
typename _BidirectionalIterator,
typename _Distance,
2356 typename _Pointer,
typename _Compare>
2359 _BidirectionalIterator __middle,
2360 _BidirectionalIterator __last,
2361 _Distance __len1, _Distance __len2,
2362 _Pointer __buffer, _Compare __comp)
2364 if (__len1 <= __len2)
2366 _Pointer __buffer_end = _GLIBCXX_MOVE3(__first, __middle, __buffer);
2372 _Pointer __buffer_end = _GLIBCXX_MOVE3(__middle, __last, __buffer);
2374 __buffer_end, __last, __comp);
2378 template<
typename _BidirectionalIterator,
typename _Distance,
2379 typename _Pointer,
typename _Compare>
2381 __merge_adaptive_resize(_BidirectionalIterator __first,
2382 _BidirectionalIterator __middle,
2383 _BidirectionalIterator __last,
2384 _Distance __len1, _Distance __len2,
2385 _Pointer __buffer, _Distance __buffer_size,
2388 if (__len1 <= __buffer_size || __len2 <= __buffer_size)
2390 __len1, __len2, __buffer, __comp);
2393 _BidirectionalIterator __first_cut = __first;
2394 _BidirectionalIterator __second_cut = __middle;
2395 _Distance __len11 = 0;
2396 _Distance __len22 = 0;
2397 if (__len1 > __len2)
2399 __len11 = __len1 / 2;
2402 = std::__lower_bound(__middle, __last, *__first_cut,
2403 __gnu_cxx::__ops::__iter_comp_val(__comp));
2408 __len22 = __len2 / 2;
2411 = std::__upper_bound(__first, __middle, *__second_cut,
2412 __gnu_cxx::__ops::__val_comp_iter(__comp));
2416 _BidirectionalIterator __new_middle
2418 _Distance(__len1 - __len11), __len22,
2419 __buffer, __buffer_size);
2420 std::__merge_adaptive_resize(__first, __first_cut, __new_middle,
2422 __buffer, __buffer_size, __comp);
2423 std::__merge_adaptive_resize(__new_middle, __second_cut, __last,
2424 _Distance(__len1 - __len11),
2425 _Distance(__len2 - __len22),
2426 __buffer, __buffer_size, __comp);
2431 template<
typename _BidirectionalIterator,
typename _Distance,
2435 _BidirectionalIterator __middle,
2436 _BidirectionalIterator __last,
2437 _Distance __len1, _Distance __len2,
2440 if (__len1 == 0 || __len2 == 0)
2443 if (__len1 + __len2 == 2)
2445 if (__comp(__middle, __first))
2446 std::iter_swap(__first, __middle);
2450 _BidirectionalIterator __first_cut = __first;
2451 _BidirectionalIterator __second_cut = __middle;
2452 _Distance __len11 = 0;
2453 _Distance __len22 = 0;
2454 if (__len1 > __len2)
2456 __len11 = __len1 / 2;
2459 = std::__lower_bound(__middle, __last, *__first_cut,
2460 __gnu_cxx::__ops::__iter_comp_val(__comp));
2465 __len22 = __len2 / 2;
2468 = std::__upper_bound(__first, __middle, *__second_cut,
2469 __gnu_cxx::__ops::__val_comp_iter(__comp));
2473 _BidirectionalIterator __new_middle
2474 = std::rotate(__first_cut, __middle, __second_cut);
2476 __len11, __len22, __comp);
2478 __len1 - __len11, __len2 - __len22, __comp);
2481 template<
typename _B
idirectionalIterator,
typename _Compare>
2483 __inplace_merge(_BidirectionalIterator __first,
2484 _BidirectionalIterator __middle,
2485 _BidirectionalIterator __last,
2488 typedef typename iterator_traits<_BidirectionalIterator>::value_type
2490 typedef typename iterator_traits<_BidirectionalIterator>::difference_type
2493 if (__first == __middle || __middle == __last)
2496 const _DistanceType __len1 =
std::distance(__first, __middle);
2497 const _DistanceType __len2 =
std::distance(__middle, __last);
2500 typedef _Temporary_buffer<_BidirectionalIterator, _ValueType> _TmpBuf;
2503 _TmpBuf __buf(__first,
std::min(__len1, __len2));
2505 if (__builtin_expect(__buf.size() == __buf.requested_size(),
true))
2507 (__first, __middle, __last, __len1, __len2, __buf.begin(), __comp);
2508 else if (__builtin_expect(__buf.begin() == 0,
false))
2510 (__first, __middle, __last, __len1, __len2, __comp);
2512 std::__merge_adaptive_resize
2513 (__first, __middle, __last, __len1, __len2, __buf.begin(),
2514 _DistanceType(__buf.size()), __comp);
2517 (__first, __middle, __last, __len1, __len2, __comp);
2539 template<
typename _B
idirectionalIterator>
2541 inplace_merge(_BidirectionalIterator __first,
2542 _BidirectionalIterator __middle,
2543 _BidirectionalIterator __last)
2546 __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
2547 _BidirectionalIterator>)
2548 __glibcxx_function_requires(_LessThanComparableConcept<
2550 __glibcxx_requires_sorted(__first, __middle);
2551 __glibcxx_requires_sorted(__middle, __last);
2552 __glibcxx_requires_irreflexive(__first, __last);
2554 std::__inplace_merge(__first, __middle, __last,
2555 __gnu_cxx::__ops::__iter_less_iter());
2580 template<
typename _B
idirectionalIterator,
typename _Compare>
2582 inplace_merge(_BidirectionalIterator __first,
2583 _BidirectionalIterator __middle,
2584 _BidirectionalIterator __last,
2588 __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<
2589 _BidirectionalIterator>)
2590 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2593 __glibcxx_requires_sorted_pred(__first, __middle, __comp);
2594 __glibcxx_requires_sorted_pred(__middle, __last, __comp);
2595 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
2597 std::__inplace_merge(__first, __middle, __last,
2598 __gnu_cxx::__ops::__iter_comp_iter(__comp));
2603 template<
typename _InputIterator,
typename _OutputIterator,
2607 _InputIterator __first2, _InputIterator __last2,
2608 _OutputIterator __result, _Compare __comp)
2610 while (__first1 != __last1 && __first2 != __last2)
2612 if (__comp(__first2, __first1))
2614 *__result = _GLIBCXX_MOVE(*__first2);
2619 *__result = _GLIBCXX_MOVE(*__first1);
2624 return _GLIBCXX_MOVE3(__first2, __last2,
2625 _GLIBCXX_MOVE3(__first1, __last1,
2629 template<
typename _RandomAccessIterator1,
typename _RandomAccessIterator2,
2630 typename _Distance,
typename _Compare>
2632 __merge_sort_loop(_RandomAccessIterator1 __first,
2633 _RandomAccessIterator1 __last,
2634 _RandomAccessIterator2 __result, _Distance __step_size,
2637 const _Distance __two_step = 2 * __step_size;
2639 while (__last - __first >= __two_step)
2642 __first + __step_size,
2643 __first + __two_step,
2645 __first += __two_step;
2647 __step_size =
std::min(_Distance(__last - __first), __step_size);
2650 __first + __step_size, __last, __result, __comp);
2653 template<
typename _RandomAccessIterator,
typename _Distance,
2655 _GLIBCXX20_CONSTEXPR
2657 __chunk_insertion_sort(_RandomAccessIterator __first,
2658 _RandomAccessIterator __last,
2659 _Distance __chunk_size, _Compare __comp)
2661 while (__last - __first >= __chunk_size)
2663 std::__insertion_sort(__first, __first + __chunk_size, __comp);
2664 __first += __chunk_size;
2666 std::__insertion_sort(__first, __last, __comp);
2669 enum { _S_chunk_size = 7 };
2671 template<
typename _RandomAccessIterator,
typename _Po
inter,
typename _Compare>
2673 __merge_sort_with_buffer(_RandomAccessIterator __first,
2674 _RandomAccessIterator __last,
2675 _Pointer __buffer, _Compare __comp)
2677 typedef typename iterator_traits<_RandomAccessIterator>::difference_type
2680 const _Distance __len = __last - __first;
2681 const _Pointer __buffer_last = __buffer + __len;
2683 _Distance __step_size = _S_chunk_size;
2684 std::__chunk_insertion_sort(__first, __last, __step_size, __comp);
2686 while (__step_size < __len)
2688 std::__merge_sort_loop(__first, __last, __buffer,
2689 __step_size, __comp);
2691 std::__merge_sort_loop(__buffer, __buffer_last, __first,
2692 __step_size, __comp);
2697 template<
typename _RandomAccessIterator,
typename _Po
inter,
typename _Compare>
2699 __stable_sort_adaptive(_RandomAccessIterator __first,
2700 _RandomAccessIterator __middle,
2701 _RandomAccessIterator __last,
2702 _Pointer __buffer, _Compare __comp)
2704 std::__merge_sort_with_buffer(__first, __middle, __buffer, __comp);
2705 std::__merge_sort_with_buffer(__middle, __last, __buffer, __comp);
2708 __middle - __first, __last - __middle,
2712 template<
typename _RandomAccessIterator,
typename _Pointer,
2713 typename _Distance,
typename _Compare>
2715 __stable_sort_adaptive_resize(_RandomAccessIterator __first,
2716 _RandomAccessIterator __last,
2717 _Pointer __buffer, _Distance __buffer_size,
2720 const _Distance __len = (__last - __first + 1) / 2;
2721 const _RandomAccessIterator __middle = __first + __len;
2722 if (__len > __buffer_size)
2724 std::__stable_sort_adaptive_resize(__first, __middle, __buffer,
2725 __buffer_size, __comp);
2726 std::__stable_sort_adaptive_resize(__middle, __last, __buffer,
2727 __buffer_size, __comp);
2728 std::__merge_adaptive_resize(__first, __middle, __last,
2729 _Distance(__middle - __first),
2730 _Distance(__last - __middle),
2731 __buffer, __buffer_size,
2735 std::__stable_sort_adaptive(__first, __middle, __last,
2740 template<
typename _RandomAccessIterator,
typename _Compare>
2743 _RandomAccessIterator __last, _Compare __comp)
2745 if (__last - __first < 15)
2747 std::__insertion_sort(__first, __last, __comp);
2750 _RandomAccessIterator __middle = __first + (__last - __first) / 2;
2766 template<
typename _InputIterator1,
typename _InputIterator2,
2768 _GLIBCXX20_CONSTEXPR
2770 __includes(_InputIterator1 __first1, _InputIterator1 __last1,
2771 _InputIterator2 __first2, _InputIterator2 __last2,
2774 while (__first1 != __last1 && __first2 != __last2)
2776 if (__comp(__first2, __first1))
2778 if (!__comp(__first1, __first2))
2783 return __first2 == __last2;
2804 template<
typename _InputIterator1,
typename _InputIterator2>
2805 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
2807 includes(_InputIterator1 __first1, _InputIterator1 __last1,
2808 _InputIterator2 __first2, _InputIterator2 __last2)
2811 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
2812 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
2813 __glibcxx_function_requires(_LessThanOpConcept<
2816 __glibcxx_function_requires(_LessThanOpConcept<
2819 __glibcxx_requires_sorted_set(__first1, __last1, __first2);
2820 __glibcxx_requires_sorted_set(__first2, __last2, __first1);
2821 __glibcxx_requires_irreflexive2(__first1, __last1);
2822 __glibcxx_requires_irreflexive2(__first2, __last2);
2824 return std::__includes(__first1, __last1, __first2, __last2,
2825 __gnu_cxx::__ops::__iter_less_iter());
2849 template<
typename _InputIterator1,
typename _InputIterator2,
2851 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
2853 includes(_InputIterator1 __first1, _InputIterator1 __last1,
2854 _InputIterator2 __first2, _InputIterator2 __last2,
2858 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
2859 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
2860 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2863 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2866 __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
2867 __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
2868 __glibcxx_requires_irreflexive_pred2(__first1, __last1, __comp);
2869 __glibcxx_requires_irreflexive_pred2(__first2, __last2, __comp);
2871 return std::__includes(__first1, __last1, __first2, __last2,
2872 __gnu_cxx::__ops::__iter_comp_iter(__comp));
2885 template<
typename _B
idirectionalIterator,
typename _Compare>
2886 _GLIBCXX20_CONSTEXPR
2888 __next_permutation(_BidirectionalIterator __first,
2889 _BidirectionalIterator __last, _Compare __comp)
2891 if (__first == __last)
2893 _BidirectionalIterator __i = __first;
2902 _BidirectionalIterator __ii = __i;
2904 if (__comp(__i, __ii))
2906 _BidirectionalIterator __j = __last;
2907 while (!__comp(__i, --__j))
2909 std::iter_swap(__i, __j);
2935 template<
typename _B
idirectionalIterator>
2936 _GLIBCXX20_CONSTEXPR
2938 next_permutation(_BidirectionalIterator __first,
2939 _BidirectionalIterator __last)
2942 __glibcxx_function_requires(_BidirectionalIteratorConcept<
2943 _BidirectionalIterator>)
2944 __glibcxx_function_requires(_LessThanComparableConcept<
2946 __glibcxx_requires_valid_range(__first, __last);
2947 __glibcxx_requires_irreflexive(__first, __last);
2949 return std::__next_permutation
2950 (__first, __last, __gnu_cxx::__ops::__iter_less_iter());
2968 template<
typename _B
idirectionalIterator,
typename _Compare>
2969 _GLIBCXX20_CONSTEXPR
2971 next_permutation(_BidirectionalIterator __first,
2972 _BidirectionalIterator __last, _Compare __comp)
2975 __glibcxx_function_requires(_BidirectionalIteratorConcept<
2976 _BidirectionalIterator>)
2977 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
2980 __glibcxx_requires_valid_range(__first, __last);
2981 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
2983 return std::__next_permutation
2984 (__first, __last, __gnu_cxx::__ops::__iter_comp_iter(__comp));
2987 template<
typename _B
idirectionalIterator,
typename _Compare>
2988 _GLIBCXX20_CONSTEXPR
2990 __prev_permutation(_BidirectionalIterator __first,
2991 _BidirectionalIterator __last, _Compare __comp)
2993 if (__first == __last)
2995 _BidirectionalIterator __i = __first;
3004 _BidirectionalIterator __ii = __i;
3006 if (__comp(__ii, __i))
3008 _BidirectionalIterator __j = __last;
3009 while (!__comp(--__j, __i))
3011 std::iter_swap(__i, __j);
3038 template<
typename _B
idirectionalIterator>
3039 _GLIBCXX20_CONSTEXPR
3041 prev_permutation(_BidirectionalIterator __first,
3042 _BidirectionalIterator __last)
3045 __glibcxx_function_requires(_BidirectionalIteratorConcept<
3046 _BidirectionalIterator>)
3047 __glibcxx_function_requires(_LessThanComparableConcept<
3049 __glibcxx_requires_valid_range(__first, __last);
3050 __glibcxx_requires_irreflexive(__first, __last);
3052 return std::__prev_permutation(__first, __last,
3053 __gnu_cxx::__ops::__iter_less_iter());
3071 template<
typename _B
idirectionalIterator,
typename _Compare>
3072 _GLIBCXX20_CONSTEXPR
3074 prev_permutation(_BidirectionalIterator __first,
3075 _BidirectionalIterator __last, _Compare __comp)
3078 __glibcxx_function_requires(_BidirectionalIteratorConcept<
3079 _BidirectionalIterator>)
3080 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
3083 __glibcxx_requires_valid_range(__first, __last);
3084 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
3086 return std::__prev_permutation(__first, __last,
3087 __gnu_cxx::__ops::__iter_comp_iter(__comp));
3093 template<
typename _InputIterator,
typename _OutputIterator,
3094 typename _Predicate,
typename _Tp>
3095 _GLIBCXX20_CONSTEXPR
3097 __replace_copy_if(_InputIterator __first, _InputIterator __last,
3098 _OutputIterator __result,
3099 _Predicate __pred,
const _Tp& __new_value)
3101 for (; __first != __last; ++__first, (void)++__result)
3102 if (__pred(__first))
3103 *__result = __new_value;
3105 *__result = *__first;
3123 template<
typename _InputIterator,
typename _OutputIterator,
typename _Tp>
3124 _GLIBCXX20_CONSTEXPR
3125 inline _OutputIterator
3126 replace_copy(_InputIterator __first, _InputIterator __last,
3127 _OutputIterator __result,
3128 const _Tp& __old_value,
const _Tp& __new_value)
3131 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3132 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
3134 __glibcxx_function_requires(_EqualOpConcept<
3136 __glibcxx_requires_valid_range(__first, __last);
3138 return std::__replace_copy_if(__first, __last, __result,
3139 __gnu_cxx::__ops::__iter_equals_val(__old_value),
3158 template<
typename _InputIterator,
typename _OutputIterator,
3159 typename _Predicate,
typename _Tp>
3160 _GLIBCXX20_CONSTEXPR
3161 inline _OutputIterator
3162 replace_copy_if(_InputIterator __first, _InputIterator __last,
3163 _OutputIterator __result,
3164 _Predicate __pred,
const _Tp& __new_value)
3167 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3168 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
3170 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
3172 __glibcxx_requires_valid_range(__first, __last);
3174 return std::__replace_copy_if(__first, __last, __result,
3175 __gnu_cxx::__ops::__pred_iter(__pred),
3179#if __cplusplus >= 201103L
3187 template<
typename _ForwardIterator>
3188 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
3190 is_sorted(_ForwardIterator __first, _ForwardIterator __last)
3191 {
return std::is_sorted_until(__first, __last) == __last; }
3202 template<
typename _ForwardIterator,
typename _Compare>
3203 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
3205 is_sorted(_ForwardIterator __first, _ForwardIterator __last,
3207 {
return std::is_sorted_until(__first, __last, __comp) == __last; }
3209 template<
typename _ForwardIterator,
typename _Compare>
3210 _GLIBCXX20_CONSTEXPR
3212 __is_sorted_until(_ForwardIterator __first, _ForwardIterator __last,
3215 if (__first == __last)
3218 _ForwardIterator __next = __first;
3219 for (++__next; __next != __last; __first = __next, (void)++__next)
3220 if (__comp(__next, __first))
3233 template<
typename _ForwardIterator>
3234 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
3235 inline _ForwardIterator
3236 is_sorted_until(_ForwardIterator __first, _ForwardIterator __last)
3239 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
3240 __glibcxx_function_requires(_LessThanComparableConcept<
3242 __glibcxx_requires_valid_range(__first, __last);
3243 __glibcxx_requires_irreflexive(__first, __last);
3245 return std::__is_sorted_until(__first, __last,
3246 __gnu_cxx::__ops::__iter_less_iter());
3258 template<
typename _ForwardIterator,
typename _Compare>
3259 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
3260 inline _ForwardIterator
3261 is_sorted_until(_ForwardIterator __first, _ForwardIterator __last,
3265 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
3266 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
3269 __glibcxx_requires_valid_range(__first, __last);
3270 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
3272 return std::__is_sorted_until(__first, __last,
3273 __gnu_cxx::__ops::__iter_comp_iter(__comp));
3284 template<
typename _Tp>
3285 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
3286 inline pair<const _Tp&, const _Tp&>
3290 __glibcxx_function_requires(_LessThanComparableConcept<_Tp>)
3292 return __b < __a ? pair<const _Tp&, const _Tp&>(__b, __a)
3305 template<
typename _Tp,
typename _Compare>
3306 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
3307 inline pair<const _Tp&, const _Tp&>
3308 minmax(
const _Tp& __a,
const _Tp& __b, _Compare __comp)
3314 template<
typename _ForwardIterator,
typename _Compare>
3315 _GLIBCXX14_CONSTEXPR
3316 pair<_ForwardIterator, _ForwardIterator>
3317 __minmax_element(_ForwardIterator __first, _ForwardIterator __last,
3320 _ForwardIterator __next = __first;
3321 if (__first == __last
3322 || ++__next == __last)
3323 return std::make_pair(__first, __first);
3325 _ForwardIterator __min{}, __max{};
3326 if (__comp(__next, __first))
3340 while (__first != __last)
3343 if (++__next == __last)
3345 if (__comp(__first, __min))
3347 else if (!__comp(__first, __max))
3352 if (__comp(__next, __first))
3354 if (__comp(__next, __min))
3356 if (!__comp(__first, __max))
3361 if (__comp(__first, __min))
3363 if (!__comp(__next, __max))
3371 return std::make_pair(__min, __max);
3385 template<
typename _ForwardIterator>
3386 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
3387 inline pair<_ForwardIterator, _ForwardIterator>
3388 minmax_element(_ForwardIterator __first, _ForwardIterator __last)
3391 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
3392 __glibcxx_function_requires(_LessThanComparableConcept<
3394 __glibcxx_requires_valid_range(__first, __last);
3395 __glibcxx_requires_irreflexive(__first, __last);
3397 return std::__minmax_element(__first, __last,
3398 __gnu_cxx::__ops::__iter_less_iter());
3413 template<
typename _ForwardIterator,
typename _Compare>
3414 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
3415 inline pair<_ForwardIterator, _ForwardIterator>
3416 minmax_element(_ForwardIterator __first, _ForwardIterator __last,
3420 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
3421 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
3424 __glibcxx_requires_valid_range(__first, __last);
3425 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
3427 return std::__minmax_element(__first, __last,
3428 __gnu_cxx::__ops::__iter_comp_iter(__comp));
3431 template<
typename _Tp>
3432 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
3433 inline pair<_Tp, _Tp>
3434 minmax(initializer_list<_Tp> __l)
3436 __glibcxx_requires_irreflexive(__l.begin(), __l.end());
3437 pair<const _Tp*, const _Tp*> __p =
3438 std::__minmax_element(__l.begin(), __l.end(),
3439 __gnu_cxx::__ops::__iter_less_iter());
3440 return std::make_pair(*__p.first, *__p.second);
3443 template<
typename _Tp,
typename _Compare>
3444 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
3445 inline pair<_Tp, _Tp>
3446 minmax(initializer_list<_Tp> __l, _Compare __comp)
3448 __glibcxx_requires_irreflexive_pred(__l.begin(), __l.end(), __comp);
3449 pair<const _Tp*, const _Tp*> __p =
3450 std::__minmax_element(__l.begin(), __l.end(),
3451 __gnu_cxx::__ops::__iter_comp_iter(__comp));
3452 return std::make_pair(*__p.first, *__p.second);
3469 template<
typename _ForwardIterator1,
typename _ForwardIterator2,
3470 typename _BinaryPredicate>
3471 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
3473 is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
3474 _ForwardIterator2 __first2, _BinaryPredicate __pred)
3477 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
3478 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
3479 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
3482 __glibcxx_requires_valid_range(__first1, __last1);
3484 return std::__is_permutation(__first1, __last1, __first2,
3485 __gnu_cxx::__ops::__iter_comp_iter(__pred));
3488#if __cplusplus > 201103L
3489 template<
typename _ForwardIterator1,
typename _ForwardIterator2,
3490 typename _BinaryPredicate>
3491 _GLIBCXX20_CONSTEXPR
3493 __is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
3494 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
3495 _BinaryPredicate __pred)
3498 =
typename iterator_traits<_ForwardIterator1>::iterator_category;
3500 =
typename iterator_traits<_ForwardIterator2>::iterator_category;
3501 using _It1_is_RA = is_same<_Cat1, random_access_iterator_tag>;
3502 using _It2_is_RA = is_same<_Cat2, random_access_iterator_tag>;
3503 constexpr bool __ra_iters = _It1_is_RA() && _It2_is_RA();
3514 for (; __first1 != __last1 && __first2 != __last2;
3515 ++__first1, (void)++__first2)
3516 if (!__pred(__first1, __first2))
3521 if (__first1 == __last1)
3528 if (__d1 == 0 && __d2 == 0)
3534 for (_ForwardIterator1 __scan = __first1; __scan != __last1; ++__scan)
3536 if (__scan != std::__find_if(__first1, __scan,
3537 __gnu_cxx::__ops::__iter_comp_iter(__pred, __scan)))
3540 auto __matches = std::__count_if(__first2, __last2,
3541 __gnu_cxx::__ops::__iter_comp_iter(__pred, __scan));
3543 || std::__count_if(__scan, __last1,
3544 __gnu_cxx::__ops::__iter_comp_iter(__pred, __scan))
3564 template<
typename _ForwardIterator1,
typename _ForwardIterator2>
3565 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
3567 is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
3568 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
3570 __glibcxx_requires_valid_range(__first1, __last1);
3571 __glibcxx_requires_valid_range(__first2, __last2);
3574 std::__is_permutation(__first1, __last1, __first2, __last2,
3575 __gnu_cxx::__ops::__iter_equal_to_iter());
3592 template<
typename _ForwardIterator1,
typename _ForwardIterator2,
3593 typename _BinaryPredicate>
3594 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
3596 is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
3597 _ForwardIterator2 __first2, _ForwardIterator2 __last2,
3598 _BinaryPredicate __pred)
3600 __glibcxx_requires_valid_range(__first1, __last1);
3601 __glibcxx_requires_valid_range(__first2, __last2);
3603 return std::__is_permutation(__first1, __last1, __first2, __last2,
3604 __gnu_cxx::__ops::__iter_comp_iter(__pred));
3608#ifdef __glibcxx_clamp
3620 template<
typename _Tp>
3621 [[nodiscard]]
constexpr const _Tp&
3622 clamp(
const _Tp& __val,
const _Tp& __lo,
const _Tp& __hi)
3624 __glibcxx_assert(!(__hi < __lo));
3640 template<
typename _Tp,
typename _Compare>
3641 [[nodiscard]]
constexpr const _Tp&
3642 clamp(
const _Tp& __val,
const _Tp& __lo,
const _Tp& __hi, _Compare __comp)
3644 __glibcxx_assert(!__comp(__hi, __lo));
3670 template<
typename _IntType,
typename _UniformRandomBitGenerator>
3671 pair<_IntType, _IntType>
3673 _UniformRandomBitGenerator&& __g)
3677 return std::make_pair(__x / __b1, __x % __b1);
3692 template<
typename _RandomAccessIterator,
3693 typename _UniformRandomNumberGenerator>
3695 shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
3696 _UniformRandomNumberGenerator&& __g)
3699 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
3700 _RandomAccessIterator>)
3701 __glibcxx_requires_valid_range(__first, __last);
3703 if (__first == __last)
3709 typedef typename std::make_unsigned<_DistanceType>::type __ud_type;
3711 typedef typename __distr_type::param_type __p_type;
3713 typedef typename remove_reference<_UniformRandomNumberGenerator>::type
3718 const __uc_type __urngrange = __g.max() - __g.min();
3719 const __uc_type __urange = __uc_type(__last - __first);
3721 if (__urngrange / __urange >= __urange)
3724 _RandomAccessIterator __i = __first + 1;
3730 if ((__urange % 2) == 0)
3732 __distr_type __d{0, 1};
3733 std::iter_swap(__i++, __first + __d(__g));
3740 while (__i != __last)
3742 const __uc_type __swap_range = __uc_type(__i - __first) + 1;
3747 std::iter_swap(__i++, __first + __pospos.
first);
3748 std::iter_swap(__i++, __first + __pospos.
second);
3756 for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
3757 std::iter_swap(__i, __first + __d(__g, __p_type(0, __i - __first)));
3761_GLIBCXX_BEGIN_NAMESPACE_ALGO
3775 template<
typename _InputIterator,
typename _Function>
3776 _GLIBCXX20_CONSTEXPR
3778 for_each(_InputIterator __first, _InputIterator __last, _Function __f)
3781 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3782 __glibcxx_requires_valid_range(__first, __last);
3783 for (; __first != __last; ++__first)
3788#if __cplusplus >= 201703L
3801 template<
typename _InputIterator,
typename _Size,
typename _Function>
3802 _GLIBCXX20_CONSTEXPR
3806 auto __n2 = std::__size_to_integer(__n);
3808 if constexpr (is_base_of_v<random_access_iterator_tag, _Cat>)
3812 auto __last = __first + __n2;
3813 std::for_each(__first, __last,
std::move(__f));
3837 template<
typename _InputIterator,
typename _Tp>
3838 _GLIBCXX20_CONSTEXPR
3839 inline _InputIterator
3840 find(_InputIterator __first, _InputIterator __last,
const _Tp& __val)
3843 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3844 __glibcxx_function_requires(_EqualOpConcept<
3846 __glibcxx_requires_valid_range(__first, __last);
3848#if __cpp_if_constexpr && __glibcxx_type_trait_variable_templates
3850 if constexpr (__can_use_memchr_for_find<_ValT, _Tp>)
3851 if constexpr (is_pointer_v<
decltype(std::__niter_base(__first))>
3852#if __cpp_lib_concepts
3853 || contiguous_iterator<_InputIterator>
3861 if (!(
static_cast<_ValT
>(__val) == __val))
3863 else if (!__is_constant_evaluated())
3865 const void* __p0 = std::__to_address(__first);
3866 const int __ival =
static_cast<int>(__val);
3868 if (
auto __p1 = __builtin_memchr(__p0, __ival, __n))
3869 return __first + ((
const char*)__p1 - (
const char*)__p0);
3875 return std::__find_if(__first, __last,
3876 __gnu_cxx::__ops::__iter_equals_val(__val));
3889 template<
typename _InputIterator,
typename _Predicate>
3890 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
3891 inline _InputIterator
3892 find_if(_InputIterator __first, _InputIterator __last,
3896 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3897 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
3899 __glibcxx_requires_valid_range(__first, __last);
3901 return std::__find_if(__first, __last,
3902 __gnu_cxx::__ops::__pred_iter(__pred));
3921 template<
typename _InputIterator,
typename _ForwardIterator>
3922 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
3924 find_first_of(_InputIterator __first1, _InputIterator __last1,
3925 _ForwardIterator __first2, _ForwardIterator __last2)
3928 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3929 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
3930 __glibcxx_function_requires(_EqualOpConcept<
3933 __glibcxx_requires_valid_range(__first1, __last1);
3934 __glibcxx_requires_valid_range(__first2, __last2);
3936 for (; __first1 != __last1; ++__first1)
3937 for (_ForwardIterator __iter = __first2; __iter != __last2; ++__iter)
3938 if (*__first1 == *__iter)
3962 template<
typename _InputIterator,
typename _ForwardIterator,
3963 typename _BinaryPredicate>
3964 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
3966 find_first_of(_InputIterator __first1, _InputIterator __last1,
3967 _ForwardIterator __first2, _ForwardIterator __last2,
3968 _BinaryPredicate __comp)
3971 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
3972 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
3973 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
3976 __glibcxx_requires_valid_range(__first1, __last1);
3977 __glibcxx_requires_valid_range(__first2, __last2);
3979 for (; __first1 != __last1; ++__first1)
3980 for (_ForwardIterator __iter = __first2; __iter != __last2; ++__iter)
3981 if (__comp(*__first1, *__iter))
3995 template<
typename _ForwardIterator>
3996 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
3997 inline _ForwardIterator
3998 adjacent_find(_ForwardIterator __first, _ForwardIterator __last)
4001 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
4002 __glibcxx_function_requires(_EqualityComparableConcept<
4004 __glibcxx_requires_valid_range(__first, __last);
4006 return std::__adjacent_find(__first, __last,
4007 __gnu_cxx::__ops::__iter_equal_to_iter());
4021 template<
typename _ForwardIterator,
typename _BinaryPredicate>
4022 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
4023 inline _ForwardIterator
4024 adjacent_find(_ForwardIterator __first, _ForwardIterator __last,
4025 _BinaryPredicate __binary_pred)
4028 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
4029 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
4032 __glibcxx_requires_valid_range(__first, __last);
4034 return std::__adjacent_find(__first, __last,
4035 __gnu_cxx::__ops::__iter_comp_iter(__binary_pred));
4047 template<
typename _InputIterator,
typename _Tp>
4048 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
4049 inline typename iterator_traits<_InputIterator>::difference_type
4050 count(_InputIterator __first, _InputIterator __last,
const _Tp& __value)
4053 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
4054 __glibcxx_function_requires(_EqualOpConcept<
4056 __glibcxx_requires_valid_range(__first, __last);
4058 return std::__count_if(__first, __last,
4059 __gnu_cxx::__ops::__iter_equals_val(__value));
4071 template<
typename _InputIterator,
typename _Predicate>
4072 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
4073 inline typename iterator_traits<_InputIterator>::difference_type
4074 count_if(_InputIterator __first, _InputIterator __last, _Predicate __pred)
4077 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
4078 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
4080 __glibcxx_requires_valid_range(__first, __last);
4082 return std::__count_if(__first, __last,
4083 __gnu_cxx::__ops::__pred_iter(__pred));
4112 template<
typename _ForwardIterator1,
typename _ForwardIterator2>
4113 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
4114 inline _ForwardIterator1
4115 search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
4116 _ForwardIterator2 __first2, _ForwardIterator2 __last2)
4119 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator1>)
4120 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator2>)
4121 __glibcxx_function_requires(_EqualOpConcept<
4124 __glibcxx_requires_valid_range(__first1, __last1);
4125 __glibcxx_requires_valid_range(__first2, __last2);
4127 return std::__search(__first1, __last1, __first2, __last2,
4128 __gnu_cxx::__ops::__iter_equal_to_iter());
4146 template<
typename _ForwardIterator,
typename _Integer,
typename _Tp>
4147 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
4148 inline _ForwardIterator
4149 search_n(_ForwardIterator __first, _ForwardIterator __last,
4150 _Integer __count,
const _Tp& __val)
4153 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
4154 __glibcxx_function_requires(_EqualOpConcept<
4156 __glibcxx_requires_valid_range(__first, __last);
4158 return std::__search_n(__first, __last, __count,
4159 __gnu_cxx::__ops::__iter_equals_val(__val));
4180 template<
typename _ForwardIterator,
typename _Integer,
typename _Tp,
4181 typename _BinaryPredicate>
4182 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
4183 inline _ForwardIterator
4184 search_n(_ForwardIterator __first, _ForwardIterator __last,
4185 _Integer __count,
const _Tp& __val,
4186 _BinaryPredicate __binary_pred)
4189 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
4190 __glibcxx_function_requires(_BinaryPredicateConcept<_BinaryPredicate,
4192 __glibcxx_requires_valid_range(__first, __last);
4194 return std::__search_n(__first, __last, __count,
4195 __gnu_cxx::__ops::__iter_comp_val(__binary_pred, __val));
4198#if __cplusplus >= 201703L
4206 template<
typename _ForwardIterator,
typename _Searcher>
4207 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
4208 inline _ForwardIterator
4209 search(_ForwardIterator __first, _ForwardIterator __last,
4210 const _Searcher& __searcher)
4211 {
return __searcher(__first, __last).first; }
4230 template<
typename _InputIterator,
typename _OutputIterator,
4231 typename _UnaryOperation>
4232 _GLIBCXX20_CONSTEXPR
4234 transform(_InputIterator __first, _InputIterator __last,
4235 _OutputIterator __result, _UnaryOperation __unary_op)
4238 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
4239 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4241 __typeof__(__unary_op(*__first))>)
4242 __glibcxx_requires_valid_range(__first, __last);
4244 for (; __first != __last; ++__first, (void)++__result)
4245 *__result = __unary_op(*__first);
4268 template<
typename _InputIterator1,
typename _InputIterator2,
4269 typename _OutputIterator,
typename _BinaryOperation>
4270 _GLIBCXX20_CONSTEXPR
4272 transform(_InputIterator1 __first1, _InputIterator1 __last1,
4273 _InputIterator2 __first2, _OutputIterator __result,
4274 _BinaryOperation __binary_op)
4277 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
4278 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
4279 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4281 __typeof__(__binary_op(*__first1,*__first2))>)
4282 __glibcxx_requires_valid_range(__first1, __last1);
4284 for (; __first1 != __last1; ++__first1, (void)++__first2, ++__result)
4285 *__result = __binary_op(*__first1, *__first2);
4302 template<
typename _ForwardIterator,
typename _Tp>
4303 _GLIBCXX20_CONSTEXPR
4305 replace(_ForwardIterator __first, _ForwardIterator __last,
4306 const _Tp& __old_value,
const _Tp& __new_value)
4309 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
4311 __glibcxx_function_requires(_EqualOpConcept<
4313 __glibcxx_function_requires(_ConvertibleConcept<_Tp,
4315 __glibcxx_requires_valid_range(__first, __last);
4317 for (; __first != __last; ++__first)
4318 if (*__first == __old_value)
4319 *__first = __new_value;
4335 template<
typename _ForwardIterator,
typename _Predicate,
typename _Tp>
4336 _GLIBCXX20_CONSTEXPR
4338 replace_if(_ForwardIterator __first, _ForwardIterator __last,
4339 _Predicate __pred,
const _Tp& __new_value)
4342 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
4344 __glibcxx_function_requires(_ConvertibleConcept<_Tp,
4346 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
4348 __glibcxx_requires_valid_range(__first, __last);
4350 for (; __first != __last; ++__first)
4351 if (__pred(*__first))
4352 *__first = __new_value;
4367 template<
typename _ForwardIterator,
typename _Generator>
4368 _GLIBCXX20_CONSTEXPR
4370 generate(_ForwardIterator __first, _ForwardIterator __last,
4374 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
4375 __glibcxx_function_requires(_GeneratorConcept<_Generator,
4377 __glibcxx_requires_valid_range(__first, __last);
4379 for (; __first != __last; ++__first)
4400 template<
typename _OutputIterator,
typename _Size,
typename _Generator>
4401 _GLIBCXX20_CONSTEXPR
4403 generate_n(_OutputIterator __first, _Size __n, _Generator __gen)
4406 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4408 __typeof__(__gen())>)
4410 typedef __decltype(std::__size_to_integer(__n)) _IntSize;
4411 for (_IntSize __niter = std::__size_to_integer(__n);
4412 __niter > 0; --__niter, (void) ++__first)
4435 template<
typename _InputIterator,
typename _OutputIterator>
4436 _GLIBCXX20_CONSTEXPR
4437 inline _OutputIterator
4438 unique_copy(_InputIterator __first, _InputIterator __last,
4439 _OutputIterator __result)
4442 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
4443 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4445 __glibcxx_function_requires(_EqualityComparableConcept<
4447 __glibcxx_requires_valid_range(__first, __last);
4449 if (__first == __last)
4452 __gnu_cxx::__ops::__iter_equal_to_iter(),
4475 template<
typename _InputIterator,
typename _OutputIterator,
4476 typename _BinaryPredicate>
4477 _GLIBCXX20_CONSTEXPR
4478 inline _OutputIterator
4479 unique_copy(_InputIterator __first, _InputIterator __last,
4480 _OutputIterator __result,
4481 _BinaryPredicate __binary_pred)
4484 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
4485 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4487 __glibcxx_requires_valid_range(__first, __last);
4489 if (__first == __last)
4492 __gnu_cxx::__ops::__iter_comp_iter(__binary_pred),
4497#if __cplusplus <= 201103L || _GLIBCXX_USE_DEPRECATED
4514 template<
typename _RandomAccessIterator>
4515 _GLIBCXX14_DEPRECATED_SUGGEST(
"std::shuffle")
4517 random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last)
4520 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4521 _RandomAccessIterator>)
4522 __glibcxx_requires_valid_range(__first, __last);
4524 if (__first == __last)
4527#if RAND_MAX < __INT_MAX__
4528 if (__builtin_expect((__last - __first) >= RAND_MAX / 4, 0))
4533 = (unsigned)std::rand() ^ ((unsigned)std::rand() << 15);
4534 for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
4537 __xss ^= __xss << 13;
4538 __xss ^= __xss >> 17;
4539 __xss ^= __xss << 5;
4540 _RandomAccessIterator __j = __first
4541 + (__xss % ((__i - __first) + 1));
4543 std::iter_swap(__i, __j);
4549 for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
4552 _RandomAccessIterator __j = __first
4553 + (std::rand() % ((__i - __first) + 1));
4555 std::iter_swap(__i, __j);
4577 template<
typename _RandomAccessIterator,
typename _RandomNumberGenerator>
4578 _GLIBCXX14_DEPRECATED_SUGGEST(
"std::shuffle")
4580 random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
4581#if __cplusplus >= 201103L
4582 _RandomNumberGenerator&& __rand)
4584 _RandomNumberGenerator& __rand)
4588 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4589 _RandomAccessIterator>)
4590 __glibcxx_requires_valid_range(__first, __last);
4592 if (__first == __last)
4594 for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
4596 _RandomAccessIterator __j = __first + __rand((__i - __first) + 1);
4598 std::iter_swap(__i, __j);
4619 template<
typename _ForwardIterator,
typename _Predicate>
4620 _GLIBCXX20_CONSTEXPR
4621 inline _ForwardIterator
4622 partition(_ForwardIterator __first, _ForwardIterator __last,
4626 __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
4628 __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
4630 __glibcxx_requires_valid_range(__first, __last);
4654 template<
typename _RandomAccessIterator>
4655 _GLIBCXX20_CONSTEXPR
4657 partial_sort(_RandomAccessIterator __first,
4658 _RandomAccessIterator __middle,
4659 _RandomAccessIterator __last)
4662 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4663 _RandomAccessIterator>)
4664 __glibcxx_function_requires(_LessThanComparableConcept<
4666 __glibcxx_requires_valid_range(__first, __middle);
4667 __glibcxx_requires_valid_range(__middle, __last);
4668 __glibcxx_requires_irreflexive(__first, __last);
4670 std::__partial_sort(__first, __middle, __last,
4671 __gnu_cxx::__ops::__iter_less_iter());
4693 template<
typename _RandomAccessIterator,
typename _Compare>
4694 _GLIBCXX20_CONSTEXPR
4696 partial_sort(_RandomAccessIterator __first,
4697 _RandomAccessIterator __middle,
4698 _RandomAccessIterator __last,
4702 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4703 _RandomAccessIterator>)
4704 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
4707 __glibcxx_requires_valid_range(__first, __middle);
4708 __glibcxx_requires_valid_range(__middle, __last);
4709 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
4711 std::__partial_sort(__first, __middle, __last,
4712 __gnu_cxx::__ops::__iter_comp_iter(__comp));
4730 template<
typename _RandomAccessIterator>
4731 _GLIBCXX20_CONSTEXPR
4733 nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth,
4734 _RandomAccessIterator __last)
4737 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4738 _RandomAccessIterator>)
4739 __glibcxx_function_requires(_LessThanComparableConcept<
4741 __glibcxx_requires_valid_range(__first, __nth);
4742 __glibcxx_requires_valid_range(__nth, __last);
4743 __glibcxx_requires_irreflexive(__first, __last);
4745 if (__first == __last || __nth == __last)
4748 std::__introselect(__first, __nth, __last,
4750 __gnu_cxx::__ops::__iter_less_iter());
4770 template<
typename _RandomAccessIterator,
typename _Compare>
4771 _GLIBCXX20_CONSTEXPR
4773 nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth,
4774 _RandomAccessIterator __last, _Compare __comp)
4777 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4778 _RandomAccessIterator>)
4779 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
4782 __glibcxx_requires_valid_range(__first, __nth);
4783 __glibcxx_requires_valid_range(__nth, __last);
4784 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
4786 if (__first == __last || __nth == __last)
4789 std::__introselect(__first, __nth, __last,
4791 __gnu_cxx::__ops::__iter_comp_iter(__comp));
4808 template<
typename _RandomAccessIterator>
4809 _GLIBCXX20_CONSTEXPR
4811 sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
4814 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4815 _RandomAccessIterator>)
4816 __glibcxx_function_requires(_LessThanComparableConcept<
4818 __glibcxx_requires_valid_range(__first, __last);
4819 __glibcxx_requires_irreflexive(__first, __last);
4821 std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());
4839 template<
typename _RandomAccessIterator,
typename _Compare>
4840 _GLIBCXX20_CONSTEXPR
4842 sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
4846 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
4847 _RandomAccessIterator>)
4848 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
4851 __glibcxx_requires_valid_range(__first, __last);
4852 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
4854 std::__sort(__first, __last, __gnu_cxx::__ops::__iter_comp_iter(__comp));
4857 template<
typename _InputIterator1,
typename _InputIterator2,
4858 typename _OutputIterator,
typename _Compare>
4859 _GLIBCXX20_CONSTEXPR
4861 __merge(_InputIterator1 __first1, _InputIterator1 __last1,
4862 _InputIterator2 __first2, _InputIterator2 __last2,
4863 _OutputIterator __result, _Compare __comp)
4865 while (__first1 != __last1 && __first2 != __last2)
4867 if (__comp(__first2, __first1))
4869 *__result = *__first2;
4874 *__result = *__first1;
4879 return std::copy(__first2, __last2,
4880 std::copy(__first1, __last1, __result));
4902 template<
typename _InputIterator1,
typename _InputIterator2,
4903 typename _OutputIterator>
4904 _GLIBCXX20_CONSTEXPR
4905 inline _OutputIterator
4906 merge(_InputIterator1 __first1, _InputIterator1 __last1,
4907 _InputIterator2 __first2, _InputIterator2 __last2,
4908 _OutputIterator __result)
4911 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
4912 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
4913 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4915 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4917 __glibcxx_function_requires(_LessThanOpConcept<
4920 __glibcxx_requires_sorted_set(__first1, __last1, __first2);
4921 __glibcxx_requires_sorted_set(__first2, __last2, __first1);
4922 __glibcxx_requires_irreflexive2(__first1, __last1);
4923 __glibcxx_requires_irreflexive2(__first2, __last2);
4925 return _GLIBCXX_STD_A::__merge(__first1, __last1,
4926 __first2, __last2, __result,
4927 __gnu_cxx::__ops::__iter_less_iter());
4953 template<
typename _InputIterator1,
typename _InputIterator2,
4954 typename _OutputIterator,
typename _Compare>
4955 _GLIBCXX20_CONSTEXPR
4956 inline _OutputIterator
4957 merge(_InputIterator1 __first1, _InputIterator1 __last1,
4958 _InputIterator2 __first2, _InputIterator2 __last2,
4959 _OutputIterator __result, _Compare __comp)
4962 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
4963 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
4964 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4966 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
4968 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
4971 __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
4972 __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
4973 __glibcxx_requires_irreflexive_pred2(__first1, __last1, __comp);
4974 __glibcxx_requires_irreflexive_pred2(__first2, __last2, __comp);
4976 return _GLIBCXX_STD_A::__merge(__first1, __last1,
4977 __first2, __last2, __result,
4978 __gnu_cxx::__ops::__iter_comp_iter(__comp));
4981 template<
typename _RandomAccessIterator,
typename _Compare>
4983 __stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
4986 typedef typename iterator_traits<_RandomAccessIterator>::value_type
4988 typedef typename iterator_traits<_RandomAccessIterator>::difference_type
4991 if (__first == __last)
4995 typedef _Temporary_buffer<_RandomAccessIterator, _ValueType> _TmpBuf;
4998 _TmpBuf __buf(__first, (__last - __first + 1) / 2);
5000 if (__builtin_expect(__buf.requested_size() == __buf.size(),
true))
5001 std::__stable_sort_adaptive(__first,
5002 __first + _DistanceType(__buf.size()),
5003 __last, __buf.begin(), __comp);
5004 else if (__builtin_expect(__buf.begin() == 0,
false))
5007 std::__stable_sort_adaptive_resize(__first, __last, __buf.begin(),
5008 _DistanceType(__buf.size()), __comp);
5031 template<
typename _RandomAccessIterator>
5033 stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
5036 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
5037 _RandomAccessIterator>)
5038 __glibcxx_function_requires(_LessThanComparableConcept<
5040 __glibcxx_requires_valid_range(__first, __last);
5041 __glibcxx_requires_irreflexive(__first, __last);
5043 _GLIBCXX_STD_A::__stable_sort(__first, __last,
5044 __gnu_cxx::__ops::__iter_less_iter());
5065 template<
typename _RandomAccessIterator,
typename _Compare>
5067 stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
5071 __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
5072 _RandomAccessIterator>)
5073 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5076 __glibcxx_requires_valid_range(__first, __last);
5077 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
5079 _GLIBCXX_STD_A::__stable_sort(__first, __last,
5080 __gnu_cxx::__ops::__iter_comp_iter(__comp));
5083 template<
typename _InputIterator1,
typename _InputIterator2,
5084 typename _OutputIterator,
5086 _GLIBCXX20_CONSTEXPR
5088 __set_union(_InputIterator1 __first1, _InputIterator1 __last1,
5089 _InputIterator2 __first2, _InputIterator2 __last2,
5090 _OutputIterator __result, _Compare __comp)
5092 while (__first1 != __last1 && __first2 != __last2)
5094 if (__comp(__first1, __first2))
5096 *__result = *__first1;
5099 else if (__comp(__first2, __first1))
5101 *__result = *__first2;
5106 *__result = *__first1;
5112 return std::copy(__first2, __last2,
5113 std::copy(__first1, __last1, __result));
5135 template<
typename _InputIterator1,
typename _InputIterator2,
5136 typename _OutputIterator>
5137 _GLIBCXX20_CONSTEXPR
5138 inline _OutputIterator
5139 set_union(_InputIterator1 __first1, _InputIterator1 __last1,
5140 _InputIterator2 __first2, _InputIterator2 __last2,
5141 _OutputIterator __result)
5144 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5145 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5146 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5148 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5150 __glibcxx_function_requires(_LessThanOpConcept<
5153 __glibcxx_function_requires(_LessThanOpConcept<
5156 __glibcxx_requires_sorted_set(__first1, __last1, __first2);
5157 __glibcxx_requires_sorted_set(__first2, __last2, __first1);
5158 __glibcxx_requires_irreflexive2(__first1, __last1);
5159 __glibcxx_requires_irreflexive2(__first2, __last2);
5161 return _GLIBCXX_STD_A::__set_union(__first1, __last1,
5162 __first2, __last2, __result,
5163 __gnu_cxx::__ops::__iter_less_iter());
5186 template<
typename _InputIterator1,
typename _InputIterator2,
5187 typename _OutputIterator,
typename _Compare>
5188 _GLIBCXX20_CONSTEXPR
5189 inline _OutputIterator
5190 set_union(_InputIterator1 __first1, _InputIterator1 __last1,
5191 _InputIterator2 __first2, _InputIterator2 __last2,
5192 _OutputIterator __result, _Compare __comp)
5195 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5196 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5197 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5199 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5201 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5204 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5207 __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
5208 __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
5209 __glibcxx_requires_irreflexive_pred2(__first1, __last1, __comp);
5210 __glibcxx_requires_irreflexive_pred2(__first2, __last2, __comp);
5212 return _GLIBCXX_STD_A::__set_union(__first1, __last1,
5213 __first2, __last2, __result,
5214 __gnu_cxx::__ops::__iter_comp_iter(__comp));
5217 template<
typename _InputIterator1,
typename _InputIterator2,
5218 typename _OutputIterator,
5220 _GLIBCXX20_CONSTEXPR
5222 __set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5223 _InputIterator2 __first2, _InputIterator2 __last2,
5224 _OutputIterator __result, _Compare __comp)
5226 while (__first1 != __last1 && __first2 != __last2)
5227 if (__comp(__first1, __first2))
5229 else if (__comp(__first2, __first1))
5233 *__result = *__first1;
5259 template<
typename _InputIterator1,
typename _InputIterator2,
5260 typename _OutputIterator>
5261 _GLIBCXX20_CONSTEXPR
5262 inline _OutputIterator
5263 set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5264 _InputIterator2 __first2, _InputIterator2 __last2,
5265 _OutputIterator __result)
5268 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5269 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5270 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5272 __glibcxx_function_requires(_LessThanOpConcept<
5275 __glibcxx_function_requires(_LessThanOpConcept<
5278 __glibcxx_requires_sorted_set(__first1, __last1, __first2);
5279 __glibcxx_requires_sorted_set(__first2, __last2, __first1);
5280 __glibcxx_requires_irreflexive2(__first1, __last1);
5281 __glibcxx_requires_irreflexive2(__first2, __last2);
5283 return _GLIBCXX_STD_A::__set_intersection(__first1, __last1,
5284 __first2, __last2, __result,
5285 __gnu_cxx::__ops::__iter_less_iter());
5309 template<
typename _InputIterator1,
typename _InputIterator2,
5310 typename _OutputIterator,
typename _Compare>
5311 _GLIBCXX20_CONSTEXPR
5312 inline _OutputIterator
5313 set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
5314 _InputIterator2 __first2, _InputIterator2 __last2,
5315 _OutputIterator __result, _Compare __comp)
5318 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5319 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5320 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5322 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5325 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5328 __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
5329 __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
5330 __glibcxx_requires_irreflexive_pred2(__first1, __last1, __comp);
5331 __glibcxx_requires_irreflexive_pred2(__first2, __last2, __comp);
5333 return _GLIBCXX_STD_A::__set_intersection(__first1, __last1,
5334 __first2, __last2, __result,
5335 __gnu_cxx::__ops::__iter_comp_iter(__comp));
5338 template<
typename _InputIterator1,
typename _InputIterator2,
5339 typename _OutputIterator,
5341 _GLIBCXX20_CONSTEXPR
5343 __set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5344 _InputIterator2 __first2, _InputIterator2 __last2,
5345 _OutputIterator __result, _Compare __comp)
5347 while (__first1 != __last1 && __first2 != __last2)
5348 if (__comp(__first1, __first2))
5350 *__result = *__first1;
5354 else if (__comp(__first2, __first1))
5361 return std::copy(__first1, __last1, __result);
5384 template<
typename _InputIterator1,
typename _InputIterator2,
5385 typename _OutputIterator>
5386 _GLIBCXX20_CONSTEXPR
5387 inline _OutputIterator
5388 set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5389 _InputIterator2 __first2, _InputIterator2 __last2,
5390 _OutputIterator __result)
5393 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5394 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5395 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5397 __glibcxx_function_requires(_LessThanOpConcept<
5400 __glibcxx_function_requires(_LessThanOpConcept<
5403 __glibcxx_requires_sorted_set(__first1, __last1, __first2);
5404 __glibcxx_requires_sorted_set(__first2, __last2, __first1);
5405 __glibcxx_requires_irreflexive2(__first1, __last1);
5406 __glibcxx_requires_irreflexive2(__first2, __last2);
5408 return _GLIBCXX_STD_A::__set_difference(__first1, __last1,
5409 __first2, __last2, __result,
5410 __gnu_cxx::__ops::__iter_less_iter());
5436 template<
typename _InputIterator1,
typename _InputIterator2,
5437 typename _OutputIterator,
typename _Compare>
5438 _GLIBCXX20_CONSTEXPR
5439 inline _OutputIterator
5440 set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5441 _InputIterator2 __first2, _InputIterator2 __last2,
5442 _OutputIterator __result, _Compare __comp)
5445 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5446 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5447 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5449 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5452 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5455 __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
5456 __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
5457 __glibcxx_requires_irreflexive_pred2(__first1, __last1, __comp);
5458 __glibcxx_requires_irreflexive_pred2(__first2, __last2, __comp);
5460 return _GLIBCXX_STD_A::__set_difference(__first1, __last1,
5461 __first2, __last2, __result,
5462 __gnu_cxx::__ops::__iter_comp_iter(__comp));
5465 template<
typename _InputIterator1,
typename _InputIterator2,
5466 typename _OutputIterator,
5468 _GLIBCXX20_CONSTEXPR
5470 __set_symmetric_difference(_InputIterator1 __first1,
5471 _InputIterator1 __last1,
5472 _InputIterator2 __first2,
5473 _InputIterator2 __last2,
5474 _OutputIterator __result,
5477 while (__first1 != __last1 && __first2 != __last2)
5478 if (__comp(__first1, __first2))
5480 *__result = *__first1;
5484 else if (__comp(__first2, __first1))
5486 *__result = *__first2;
5495 return std::copy(__first2, __last2,
5496 std::copy(__first1, __last1, __result));
5517 template<
typename _InputIterator1,
typename _InputIterator2,
5518 typename _OutputIterator>
5519 _GLIBCXX20_CONSTEXPR
5520 inline _OutputIterator
5521 set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5522 _InputIterator2 __first2, _InputIterator2 __last2,
5523 _OutputIterator __result)
5526 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5527 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5528 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5530 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5532 __glibcxx_function_requires(_LessThanOpConcept<
5535 __glibcxx_function_requires(_LessThanOpConcept<
5538 __glibcxx_requires_sorted_set(__first1, __last1, __first2);
5539 __glibcxx_requires_sorted_set(__first2, __last2, __first1);
5540 __glibcxx_requires_irreflexive2(__first1, __last1);
5541 __glibcxx_requires_irreflexive2(__first2, __last2);
5543 return _GLIBCXX_STD_A::__set_symmetric_difference(__first1, __last1,
5544 __first2, __last2, __result,
5545 __gnu_cxx::__ops::__iter_less_iter());
5569 template<
typename _InputIterator1,
typename _InputIterator2,
5570 typename _OutputIterator,
typename _Compare>
5571 _GLIBCXX20_CONSTEXPR
5572 inline _OutputIterator
5573 set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
5574 _InputIterator2 __first2, _InputIterator2 __last2,
5575 _OutputIterator __result,
5579 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
5580 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
5581 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5583 __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
5585 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5588 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5591 __glibcxx_requires_sorted_set_pred(__first1, __last1, __first2, __comp);
5592 __glibcxx_requires_sorted_set_pred(__first2, __last2, __first1, __comp);
5593 __glibcxx_requires_irreflexive_pred2(__first1, __last1, __comp);
5594 __glibcxx_requires_irreflexive_pred2(__first2, __last2, __comp);
5596 return _GLIBCXX_STD_A::__set_symmetric_difference(__first1, __last1,
5597 __first2, __last2, __result,
5598 __gnu_cxx::__ops::__iter_comp_iter(__comp));
5601 template<
typename _ForwardIterator,
typename _Compare>
5602 _GLIBCXX14_CONSTEXPR
5604 __min_element(_ForwardIterator __first, _ForwardIterator __last,
5607 if (__first == __last)
5609 _ForwardIterator __result = __first;
5610 while (++__first != __last)
5611 if (__comp(__first, __result))
5623 template<
typename _ForwardIterator>
5624 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
5626 inline min_element(_ForwardIterator __first, _ForwardIterator __last)
5629 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
5630 __glibcxx_function_requires(_LessThanComparableConcept<
5632 __glibcxx_requires_valid_range(__first, __last);
5633 __glibcxx_requires_irreflexive(__first, __last);
5635 return _GLIBCXX_STD_A::__min_element(__first, __last,
5636 __gnu_cxx::__ops::__iter_less_iter());
5648 template<
typename _ForwardIterator,
typename _Compare>
5649 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
5650 inline _ForwardIterator
5651 min_element(_ForwardIterator __first, _ForwardIterator __last,
5655 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
5656 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5659 __glibcxx_requires_valid_range(__first, __last);
5660 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
5662 return _GLIBCXX_STD_A::__min_element(__first, __last,
5663 __gnu_cxx::__ops::__iter_comp_iter(__comp));
5666 template<
typename _ForwardIterator,
typename _Compare>
5667 _GLIBCXX14_CONSTEXPR
5669 __max_element(_ForwardIterator __first, _ForwardIterator __last,
5672 if (__first == __last)
return __first;
5673 _ForwardIterator __result = __first;
5674 while (++__first != __last)
5675 if (__comp(__result, __first))
5687 template<
typename _ForwardIterator>
5688 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
5689 inline _ForwardIterator
5690 max_element(_ForwardIterator __first, _ForwardIterator __last)
5693 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
5694 __glibcxx_function_requires(_LessThanComparableConcept<
5696 __glibcxx_requires_valid_range(__first, __last);
5697 __glibcxx_requires_irreflexive(__first, __last);
5699 return _GLIBCXX_STD_A::__max_element(__first, __last,
5700 __gnu_cxx::__ops::__iter_less_iter());
5712 template<
typename _ForwardIterator,
typename _Compare>
5713 _GLIBCXX_NODISCARD _GLIBCXX14_CONSTEXPR
5714 inline _ForwardIterator
5715 max_element(_ForwardIterator __first, _ForwardIterator __last,
5719 __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
5720 __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
5723 __glibcxx_requires_valid_range(__first, __last);
5724 __glibcxx_requires_irreflexive_pred(__first, __last, __comp);
5726 return _GLIBCXX_STD_A::__max_element(__first, __last,
5727 __gnu_cxx::__ops::__iter_comp_iter(__comp));
5730#if __cplusplus >= 201103L
5732 template<
typename _Tp>
5733 _GLIBCXX14_CONSTEXPR
5735 min(initializer_list<_Tp> __l)
5737 __glibcxx_requires_irreflexive(__l.begin(), __l.end());
5738 return *_GLIBCXX_STD_A::__min_element(__l.begin(), __l.end(),
5739 __gnu_cxx::__ops::__iter_less_iter());
5742 template<
typename _Tp,
typename _Compare>
5743 _GLIBCXX14_CONSTEXPR
5745 min(initializer_list<_Tp> __l, _Compare __comp)
5747 __glibcxx_requires_irreflexive_pred(__l.begin(), __l.end(), __comp);
5748 return *_GLIBCXX_STD_A::__min_element(__l.begin(), __l.end(),
5749 __gnu_cxx::__ops::__iter_comp_iter(__comp));
5752 template<
typename _Tp>
5753 _GLIBCXX14_CONSTEXPR
5755 max(initializer_list<_Tp> __l)
5757 __glibcxx_requires_irreflexive(__l.begin(), __l.end());
5758 return *_GLIBCXX_STD_A::__max_element(__l.begin(), __l.end(),
5759 __gnu_cxx::__ops::__iter_less_iter());
5762 template<
typename _Tp,
typename _Compare>
5763 _GLIBCXX14_CONSTEXPR
5765 max(initializer_list<_Tp> __l, _Compare __comp)
5767 __glibcxx_requires_irreflexive_pred(__l.begin(), __l.end(), __comp);
5768 return *_GLIBCXX_STD_A::__max_element(__l.begin(), __l.end(),
5769 __gnu_cxx::__ops::__iter_comp_iter(__comp));
5773#if __cplusplus >= 201402L
5775 template<
typename _InputIterator,
typename _RandomAccessIterator,
5776 typename _Size,
typename _UniformRandomBitGenerator>
5777 _RandomAccessIterator
5780 _Size __n, _UniformRandomBitGenerator&& __g)
5783 using __param_type =
typename __distrib_type::param_type;
5784 __distrib_type __d{};
5785 _Size __sample_sz = 0;
5786 while (__first != __last && __sample_sz != __n)
5788 __out[__sample_sz++] = *__first;
5791 for (
auto __pop_sz = __sample_sz; __first != __last;
5792 ++__first, (void) ++__pop_sz)
5794 const auto __k = __d(__g, __param_type{0, __pop_sz});
5796 __out[__k] = *__first;
5798 return __out + __sample_sz;
5802 template<
typename _ForwardIterator,
typename _OutputIterator,
typename _Cat,
5803 typename _Size,
typename _UniformRandomBitGenerator>
5805 __sample(_ForwardIterator __first, _ForwardIterator __last,
5807 _OutputIterator __out, _Cat,
5808 _Size __n, _UniformRandomBitGenerator&& __g)
5811 using __param_type =
typename __distrib_type::param_type;
5816 if (__first == __last)
5819 __distrib_type __d{};
5821 __n =
std::min(__n, __unsampled_sz);
5826 const __uc_type __urngrange = __g.max() - __g.min();
5827 if (__urngrange / __uc_type(__unsampled_sz) >= __uc_type(__unsampled_sz))
5831 while (__n != 0 && __unsampled_sz >= 2)
5837 if (__p.
first < __n)
5839 *__out++ = *__first;
5845 if (__n == 0)
break;
5850 *__out++ = *__first;
5860 for (; __n != 0; ++__first)
5861 if (__d(__g, __param_type{0, --__unsampled_sz}) < __n)
5863 *__out++ = *__first;
5870#ifdef __glibcxx_sample
5872 template<typename _PopulationIterator, typename _SampleIterator,
5873 typename _Distance,
typename _UniformRandomBitGenerator>
5875 sample(_PopulationIterator __first, _PopulationIterator __last,
5876 _SampleIterator __out, _Distance __n,
5877 _UniformRandomBitGenerator&& __g)
5879 using __pop_cat =
typename
5881 using __samp_cat =
typename
5885 __or_<is_convertible<__pop_cat, forward_iterator_tag>,
5887 "output range must use a RandomAccessIterator when input range"
5888 " does not meet the ForwardIterator requirements");
5891 "sample size must be an integer type");
5894 return _GLIBCXX_STD_A::
5895 __sample(__first, __last, __pop_cat{}, __out, __samp_cat{}, __d,
5896 std::forward<_UniformRandomBitGenerator>(__g));
5900_GLIBCXX_END_NAMESPACE_ALGO
5901_GLIBCXX_END_NAMESPACE_VERSION
typename remove_reference< _Tp >::type remove_reference_t
Alias template for remove_reference.
typename make_unsigned< _Tp >::type make_unsigned_t
Alias template for make_unsigned.
typename common_type< _Tp... >::type common_type_t
Alias template for common_type.
constexpr std::remove_reference< _Tp >::type && move(_Tp &&__t) noexcept
Convert a value to an rvalue.
constexpr _InputIterator for_each_n(_InputIterator __first, _Size __n, _Function __f)
Apply a function to every element of a sequence.
constexpr const _Tp & clamp(const _Tp &, const _Tp &, const _Tp &)
Returns the value clamped between lo and hi.
constexpr const _Tp & max(const _Tp &, const _Tp &)
This does what you think it does.
constexpr pair< const _Tp &, const _Tp & > minmax(const _Tp &, const _Tp &)
Determines min and max at once as an ordered pair.
constexpr const _Tp & min(const _Tp &, const _Tp &)
This does what you think it does.
constexpr iterator_traits< _Iter >::iterator_category __iterator_category(const _Iter &)
ISO C++ entities toplevel namespace is std.
_BidirectionalIterator1 __rotate_adaptive(_BidirectionalIterator1 __first, _BidirectionalIterator1 __middle, _BidirectionalIterator1 __last, _Distance __len1, _Distance __len2, _BidirectionalIterator2 __buffer, _Distance __buffer_size)
This is a helper function for the merge routines.
_RandomAccessIterator __sample(_InputIterator __first, _InputIterator __last, input_iterator_tag, _RandomAccessIterator __out, random_access_iterator_tag, _Size __n, _UniformRandomBitGenerator &&__g)
Reservoir sampling algorithm.
void __merge_adaptive(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last, _Distance __len1, _Distance __len2, _Pointer __buffer, _Compare __comp)
This is a helper function for the merge routines.
constexpr _InputIterator __find_if_not_n(_InputIterator __first, _Distance &__len, _Predicate __pred)
Like find_if_not(), but uses and updates a count of the remaining range length instead of comparing a...
constexpr _OutputIterator __unique_copy(_ForwardIterator __first, _ForwardIterator __last, _OutputIterator __result, _BinaryPredicate __binary_pred, forward_iterator_tag, output_iterator_tag)
void __merge_without_buffer(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last, _Distance __len1, _Distance __len2, _Compare __comp)
This is a helper function for the merge routines.
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.
void __inplace_stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
This is a helper function for the stable sorting routines.
constexpr _Tp __lg(_Tp __n)
This is a helper function for the sort routines and for random.tcc.
constexpr _EuclideanRingElement __gcd(_EuclideanRingElement __m, _EuclideanRingElement __n)
constexpr _ForwardIterator __partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, forward_iterator_tag)
This is a helper function...
void __move_merge_adaptive(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
This is a helper function for the __merge_adaptive routines.
constexpr void __reverse(_BidirectionalIterator __first, _BidirectionalIterator __last, bidirectional_iterator_tag)
_SampleIterator sample(_PopulationIterator __first, _PopulationIterator __last, _SampleIterator __out, _Distance __n, _UniformRandomBitGenerator &&__g)
Take a random sample from a population.
constexpr void advance(_InputIterator &__i, _Distance __n)
A generalization of pointer arithmetic.
constexpr _ForwardIterator __rotate(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last, forward_iterator_tag)
This is a helper function for the rotate algorithm.
constexpr void __move_median_to_first(_Iterator __result, _Iterator __a, _Iterator __b, _Iterator __c, _Compare __comp)
Swaps the median value of *__a, *__b and *__c under __comp to *__result.
constexpr _ForwardIterator __search_n_aux(_ForwardIterator __first, _ForwardIterator __last, _Integer __count, _UnaryPredicate __unary_pred, std::forward_iterator_tag)
void __move_merge_adaptive_backward(_BidirectionalIterator1 __first1, _BidirectionalIterator1 __last1, _BidirectionalIterator2 __first2, _BidirectionalIterator2 __last2, _BidirectionalIterator3 __result, _Compare __comp)
This is a helper function for the __merge_adaptive routines.
_ForwardIterator __stable_partition_adaptive(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, _Distance __len, _Pointer __buffer, _Distance __buffer_size)
This is a helper function... Requires __first != __last and !__pred(__first) and __len == distance(__...
constexpr _InputIterator __find_if_not(_InputIterator __first, _InputIterator __last, _Predicate __pred)
Provided for stable_partition to use.
_OutputIterator __move_merge(_InputIterator __first1, _InputIterator __last1, _InputIterator __first2, _InputIterator __last2, _OutputIterator __result, _Compare __comp)
This is a helper function for the __merge_sort_loop routines.
Traits class for iterators.
Struct holding two objects of arbitrary type.
_T1 first
The first member.
_T2 second
The second member.
Marking output iterators.
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...