NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
shift.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_ALGORITHM_SHIFT_HPP__
2#define NEFORCE_CORE_ALGORITHM_SHIFT_HPP__
3
11
15NEFORCE_BEGIN_NAMESPACE__
16
22
28
30NEFORCE_BEGIN_INNER__
31
43template <typename Iterator1, typename Iterator2>
45__copy_aux(Iterator1 first, Iterator1 last,
47 auto n = _NEFORCE distance(first, last);
48 for (; n > 0; --n, ++first, ++result) {
49 *result = *first;
50 }
51 return result;
52}
53
65template <typename Iterator1, typename Iterator2>
67__copy_aux(Iterator1 first, Iterator1 last, Iterator2 result) noexcept {
68 const auto n = static_cast<size_t>(last - first);
69 const auto bytes = n * sizeof(iter_value_t<Iterator1>);
70 _NEFORCE memory_move(_NEFORCE addressof(*result), _NEFORCE addressof(*first), bytes);
71 return _NEFORCE next(result, n);
72}
73
74NEFORCE_END_INNER__
76
89template <typename Iterator1, typename Iterator2>
90constexpr Iterator2 copy(Iterator1 first, Iterator1 last,
91 Iterator2 result) noexcept(noexcept(inner::__copy_aux(first, last, result))) {
92 static_assert(is_ranges_input_iter_v<Iterator1>, "Iterator1 must be input_iterator");
93 static_assert(is_iter_v<Iterator2>, "Iterator2 must be iterator");
94 if (first == last) {
95 return result;
96 }
97 return inner::__copy_aux(first, last, result);
98}
99
101NEFORCE_BEGIN_INNER__
102
112template <typename Iterator1, typename Iterator2>
114__copy_n_aux(Iterator1 first, iter_difference_t<Iterator1> count, Iterator2 result) {
115 return _NEFORCE copy(first, _NEFORCE next(first, count), result);
116}
117
127template <typename Iterator1, typename Iterator2>
129__copy_n_aux(Iterator1 first, iter_difference_t<Iterator1> count, Iterator2 result) {
130 for (; count > 0; --count, ++first, ++result) {
131 *result = *first;
132 }
133 return result;
134}
135NEFORCE_END_INNER__
137
150template <typename Iterator1, typename Iterator2>
151constexpr Iterator2 copy_n(Iterator1 first, iter_difference_t<Iterator1> count, Iterator2 result) {
152 static_assert(is_ranges_input_iter_v<Iterator1>, "Iterator1 must be input_iterator");
153 static_assert(is_iter_v<Iterator2>, "Iterator2 must be iterator");
154 return inner::__copy_n_aux(first, count, result);
155}
156
170template <typename Iterator1, typename Iterator2, typename Pred>
171constexpr Iterator2 copy_if(Iterator1 first, Iterator1 last, Iterator2 result, Pred pred) {
172 static_assert(is_ranges_input_iter_v<Iterator1>, "Iterator1 must be input_iterator");
173 static_assert(is_iter_v<Iterator2>, "Iterator2 must be iterator");
174
175 for (; first != last; ++first) {
176 if (pred(*first)) {
177 *result++ = *first;
178 }
179 }
180 return result;
181}
182
184NEFORCE_BEGIN_INNER__
185
197template <typename Iterator1, typename Iterator2>
199__copy_backward_aux(Iterator1 first, Iterator1 last,
200 Iterator2 result) noexcept(is_nothrow_copy_assignable_v<iter_value_t<Iterator1>>) {
201 iter_difference_t<Iterator1> n = _NEFORCE distance(first, last);
202 for (; n > 0; --n) {
203 *--result = *--last;
204 }
205 return result;
206}
207
219template <typename Iterator1, typename Iterator2>
220constexpr enable_if_t<is_ranges_cot_iter_v<Iterator1>, Iterator2> __copy_backward_aux(Iterator1 first, Iterator1 last,
221 Iterator2 result) noexcept {
222 const auto n = static_cast<size_t>(last - first);
223 auto dest = _NEFORCE prev(result, n);
224 _NEFORCE memory_move(_NEFORCE addressof(*dest), _NEFORCE addressof(*first), n * sizeof(iter_value_t<Iterator1>));
225 return dest;
226}
227
228NEFORCE_END_INNER__
230
243template <typename Iterator1, typename Iterator2>
244constexpr Iterator2
245copy_backward(Iterator1 first, Iterator1 last,
246 Iterator2 result) noexcept(noexcept(inner::__copy_backward_aux(first, last, result))) {
248 "Iterators must be bidirectional_iterator");
249
250 if (first == last) {
251 return result;
252 }
253 return inner::__copy_backward_aux(first, last, result);
254}
255
257NEFORCE_BEGIN_INNER__
258
268template <typename Iterator1, typename Iterator2>
270__move_aux(Iterator1 first, Iterator1 last,
271 Iterator2 result) noexcept(is_nothrow_move_assignable_v<iter_value_t<Iterator1>>) {
272 iter_difference_t<Iterator1> n = _NEFORCE distance(first, last);
273 for (; n > 0; --n, ++first, ++result) {
274 *result = _NEFORCE move(*first);
275 }
276 return result;
277}
278
288template <typename Iterator1, typename Iterator2>
290__move_aux(Iterator1 first, Iterator1 last, Iterator2 result) noexcept {
291 const auto n = static_cast<size_t>(last - first);
292 _NEFORCE memory_move(_NEFORCE addressof(*result), _NEFORCE addressof(*first), n * sizeof(iter_value_t<Iterator1>));
293 return result + n;
294}
295
296NEFORCE_END_INNER__
298
311template <typename Iterator1, typename Iterator2>
312constexpr Iterator2 move(Iterator1 first, Iterator1 last,
313 Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result))) {
315 "Iterators must be input_iterator");
316
317 if (first == last) {
318 return result;
319 }
320 return inner::__move_aux(first, last, result);
321}
322
324NEFORCE_BEGIN_INNER__
325
335template <typename Iterator1, typename Iterator2>
337__move_backward_aux(Iterator1 first, Iterator1 last, Iterator2 result) {
338 for (size_t n = _NEFORCE distance(first, last); n > 0; --n) {
339 *--result = _NEFORCE move(*--last);
340 }
341 return result;
342}
343
353template <typename Iterator1, typename Iterator2>
355__move_backward_aux(Iterator1 first, Iterator1 last, Iterator2 result) noexcept {
356 const auto n = static_cast<size_t>(last - first);
357 auto dest = result - n;
358 _NEFORCE memory_move(_NEFORCE addressof(*dest), _NEFORCE addressof(*first), n * sizeof(iter_value_t<Iterator1>));
359 return dest;
360}
361NEFORCE_END_INNER__
363
376template <typename Iterator1, typename Iterator2>
377constexpr Iterator2 move_backward(Iterator1 first, Iterator1 last, Iterator2 result) {
379 "Iterators must be bidirectional_iterator");
380 if (first == last) {
381 return result;
382 }
383 return inner::__move_backward_aux(first, last, result);
384}
385
386
397template <typename Iterator, typename T>
398constexpr void fill(Iterator first, Iterator last,
399 const T& value) noexcept(is_nothrow_assignable_v<iter_value_t<Iterator>, T>) {
400 static_assert(is_ranges_input_iter_v<Iterator>, "Iterators must be input_iterator");
401 static_assert(is_assignable_v<decltype(*first), T>, "Iterators must be assignable from T");
402
403 for (; first != last; ++first) {
404 *first = value;
405 }
406}
407
417template <typename Iterator, typename T>
418constexpr Iterator fill_n(Iterator first, iter_difference_t<Iterator> n,
419 const T& value) noexcept(is_nothrow_assignable_v<iter_value_t<Iterator>, T>) {
420 static_assert(is_ranges_input_iter_v<Iterator>, "Iterators must be input_iterator");
421 static_assert(is_assignable_v<decltype(*first), T>, "Iterators must be assignable from T");
422
423 for (; n > 0; --n, ++first) {
424 *first = value;
425 }
426 return first;
427}
428
429
439template <typename Iterator1, typename Iterator2>
440constexpr void iter_swap(Iterator1 a, Iterator2 b) noexcept(noexcept(_NEFORCE swap(*a, *b))) {
442 "Iterators must be input_iterator");
443 _NEFORCE swap(*a, *b);
444}
445
457template <typename Iterator1, typename Iterator2>
458constexpr Iterator2 swap_ranges(Iterator1 first1, Iterator1 last1, Iterator2 first2) {
459 for (; first1 != last1; ++first1, ++first2) {
460 _NEFORCE iter_swap(first1, first2);
461 }
462 return first2;
463}
464
465
477template <typename Iterator, typename Function>
478constexpr Function for_each(Iterator first, Iterator last, Function f) {
479 static_assert(is_ranges_input_iter_v<Iterator>, "Iterator must be input_iterator");
480 static_assert(is_invocable_v<Function, decltype(*first)>, "Function must be invocable");
481
482 for (; first != last; ++first) {
483 f(*first);
484 }
485 return f;
486}
487
497template <typename Iterator, typename Function>
498constexpr Iterator for_each_n(Iterator first, iter_difference_t<Iterator> n, Function f) {
499 static_assert(is_ranges_input_iter_v<Iterator>, "Iterator must be input_iterator");
500 static_assert(is_invocable_v<Function, decltype(*first)>, "Function must be invocable");
501
502 for (iter_difference_t<Iterator> i = 0; i < n; ++i) {
503 f(*first);
504 ++first;
505 }
506 return first;
507}
508
509
520template <typename Iterator, typename Generator>
521constexpr void generate(Iterator first, Iterator last, Generator gen) {
522 static_assert(is_ranges_input_iter_v<Iterator>, "Iterator must be input_iterator");
523 static_assert(is_invocable_v<Generator>, "Generator must be invocable");
524 static_assert(is_assignable_v<decltype(*first), invoke_result_t<Generator>>,
525 "Generator must be assignable from invoke_result");
526
527 for (; first != last; ++first) {
528 *first = gen();
529 }
530}
531
541template <typename Iterator, typename Generator>
542constexpr Iterator generate_n(Iterator first, iter_difference_t<Iterator> n, Generator gen) {
543 static_assert(is_ranges_input_iter_v<Iterator>, "Iterator must be input_iterator");
544 static_assert(is_invocable_v<Generator>, "Generator must be invocable");
545 static_assert(is_assignable_v<decltype(*first), invoke_result_t<Generator>>,
546 "Generator must be assignable from invoke_result");
547
548 for (; n > 0; --n, ++first) {
549 *first = gen();
550 }
551 return first;
552}
553
554
569template <typename Iterator1, typename Iterator2, typename T>
570constexpr Iterator2 replace_copy(Iterator1 first, Iterator1 last, Iterator2 result, const T& old_value,
571 const T& new_value) {
573 "Iterators must be forward_iterator");
574 static_assert(is_assignable_v<decltype(*result), const T&>, "*result must be assignable from const T");
575
576 for (; first != last; ++first, ++result) {
577 *result = *first == old_value ? new_value : *first;
578 }
579 return result;
580}
581
597template <typename Iterator1, typename Iterator2, typename Predicate, typename T>
598constexpr Iterator2 replace_copy_if(Iterator1 first, Iterator1 last, Iterator2 result, Predicate pred,
599 const T& new_value) {
601 "Iterators must be forward_iterator");
602 static_assert(is_invocable_v<Predicate, decltype(*first)>, "Predicate must be invocable");
603 static_assert(is_assignable_v<decltype(*result), const T&>, "*result must be assignable from const T");
604
605 for (; first != last; ++first, ++result) {
606 *result = pred(*first) ? new_value : *first;
607 }
608 return result;
609}
610
622template <typename Iterator, typename T>
623constexpr void replace(Iterator first, Iterator last, const T& old_value, const T& new_value) {
624 static_assert(is_ranges_fwd_iter_v<Iterator>, "Iterators must be forward_iterator");
625 static_assert(is_assignable_v<decltype(*first), const T&>, "*result must be assignable from const T");
626
627 for (; first != last; ++first) {
628 if (*first == old_value) {
629 *first = new_value;
630 }
631 }
632}
633
646template <typename Iterator, typename Predicate, typename T>
647constexpr void replace_if(Iterator first, Iterator last, Predicate pred, const T& new_value) {
648 static_assert(is_ranges_fwd_iter_v<Iterator>, "Iterators must be forward_iterator");
649 static_assert(is_invocable_v<Predicate, decltype(*first)>, "Predicate must be invocable");
650 static_assert(is_assignable_v<decltype(*first), const T&>, "*result must be assignable from const T");
651
652 for (; first != last; ++first) {
653 if (pred(*first)) {
654 *first = new_value;
655 }
656 }
657}
658
659#ifndef NEFORCE_STANDARD_17
661NEFORCE_BEGIN_INNER__
662
669template <typename Iterator>
670enable_if_t<is_ranges_rnd_iter_v<Iterator>> __reverse_aux(Iterator first, Iterator last) {
671 while (first < last) {
672 --last;
673 _NEFORCE iter_swap(first, last);
674 ++first;
675 }
676 return;
677}
678
685template <typename Iterator>
686enable_if_t<!is_ranges_rnd_iter_v<Iterator>> __reverse_aux(Iterator first, Iterator last) {
687 while (true) {
688 if (first == last || first == --last) {
689 return;
690 }
691 --last;
692 _NEFORCE iter_swap(first, last);
693 ++first;
694 }
695 return;
696}
697
698NEFORCE_END_INNER__
700#endif // NEFORCE_STANDARD_17
701
710template <typename Iterator>
711constexpr void reverse(Iterator first, Iterator last) {
712 static_assert(is_ranges_bid_iter_v<Iterator>, "Iterators must be bidirectional_iterator");
713
714#ifdef NEFORCE_STANDARD_17
715 if constexpr (is_ranges_rnd_iter_v<Iterator>) {
716 while (first < last) {
717 --last;
718 _NEFORCE iter_swap(first, last);
719 ++first;
720 }
721 } else {
722 while (first != last) {
723 --last;
724 if (first == last) {
725 break;
726 }
727 _NEFORCE iter_swap(first, last);
728 ++first;
729 }
730 }
731#else
732 inner::__reverse_aux(first, last);
733#endif
734}
735
737NEFORCE_BEGIN_INNER__
738
739template <typename Iterator>
740constexpr enable_if_t<!is_ranges_bid_iter_v<Iterator>> __rotate_aux_dispatch(Iterator first, Iterator middle,
741 Iterator last) {
742 for (Iterator i = middle;;) {
743 _NEFORCE iter_swap(first, i);
744 ++first;
745 ++i;
746 if (first == middle) {
747 if (i == last) {
748 return;
749 }
750 middle = i;
751 } else if (i == last) {
752 i = middle;
753 }
754 }
755}
756
757template <typename Iterator>
758constexpr enable_if_t<is_ranges_bid_iter_v<Iterator>> __rotate_aux_dispatch(Iterator first, Iterator middle,
759 Iterator last) {
760 _NEFORCE reverse(first, middle);
761 _NEFORCE reverse(middle, last);
762 _NEFORCE reverse(first, last);
763}
764
772template <typename Iterator>
773constexpr enable_if_t<!is_ranges_rnd_iter_v<Iterator>> __rotate_aux(Iterator first, Iterator middle, Iterator last) {
774 if (first == middle || middle == last) {
775 return;
776 }
777 inner::__rotate_aux_dispatch(first, middle, last);
778}
779
788template <typename Iterator>
789constexpr void __rotate_cycle_aux(Iterator first, Iterator last, Iterator initial, iter_difference_t<Iterator> shift) {
790 iter_value_t<Iterator> value = *initial;
791 Iterator ptr1 = initial;
792 Iterator ptr2 = ptr1 + shift;
793 while (ptr2 != initial) {
794 *ptr1 = *ptr2;
795 ptr1 = ptr2;
796 if (last - ptr2 > shift) {
797 ptr2 += shift;
798 } else {
799 ptr2 = first + (shift - (last - ptr2));
800 }
801 }
802 *ptr1 = _NEFORCE move(value);
803}
804
814template <typename Iterator>
815constexpr enable_if_t<is_ranges_rnd_iter_v<Iterator>> __rotate_aux(Iterator first, Iterator middle, Iterator last) {
816 auto n = _NEFORCE gcd(last - first, middle - first);
817 while (n--) {
818 inner::__rotate_cycle_aux(first, last, first + n, middle - first);
819 }
820 return;
821}
822
823NEFORCE_END_INNER__
825
837template <typename Iterator>
838constexpr Iterator rotate(Iterator first, Iterator middle, Iterator last) {
839 static_assert(is_ranges_fwd_iter_v<Iterator>, "Iterators must be forward_iterator");
840
841 if (first == middle) {
842 return last;
843 }
844 if (middle == last) {
845 return first;
846 }
847
848 auto dist = _NEFORCE distance(middle, last);
849 inner::__rotate_aux(first, middle, last);
850 return _NEFORCE next(first, dist);
851}
852
865template <typename Iterator1, typename Iterator2>
866constexpr Iterator2 rotate_copy(Iterator1 first, Iterator1 middle, Iterator1 last, Iterator2 result) {
867 return _NEFORCE copy(first, middle, _NEFORCE copy(middle, last, result));
868}
869
870
883template <typename Iterator>
884constexpr Iterator shift_left(Iterator first, Iterator last, iter_difference_t<Iterator> n) {
885 static_assert(is_ranges_fwd_iter_v<Iterator>, "Iterators must be forward_iterator");
886
887 if (n <= 0) {
888 return last;
889 }
890
891 auto dist = _NEFORCE distance(first, last);
892 if (static_cast<decltype(dist)>(n) >= dist) {
893 return first;
894 }
895
896 Iterator new_last = _NEFORCE next(first, dist - n);
897 _NEFORCE move(_NEFORCE next(first, n), last, first);
898 return new_last;
899}
900
901
914template <typename Iterator>
915constexpr Iterator shift_right(Iterator first, Iterator last, iter_difference_t<Iterator> n) {
916 static_assert(is_ranges_bid_iter_v<Iterator>, "Iterators must be bidirectional_iterator");
917
918 if (n <= 0) {
919 return first;
920 }
921
922 auto dist = _NEFORCE distance(first, last);
923 if (static_cast<decltype(dist)>(n) >= dist) {
924 return last;
925 }
926
927 Iterator new_first = _NEFORCE next(first, n);
928 _NEFORCE move_backward(first, _NEFORCE next(first, dist - n), last);
929 return new_first;
930}
931
932
946template <typename Iterator1, typename Iterator2, typename UnaryOperation>
947constexpr Iterator2 transform(Iterator1 first, Iterator1 last, Iterator2 result,
948 UnaryOperation op) noexcept(noexcept(++first) && noexcept(++result) &&
949 noexcept(*result = op(*first))) {
951 "Iterators must be forward_iterator");
952 static_assert(is_invocable_v<UnaryOperation, decltype(*first)>, "UnaryOperation must be invocable");
953 static_assert(is_assignable_v<decltype(*result), invoke_result_t<UnaryOperation, decltype(*first)>>,
954 "*result must be assignable");
955
956 for (; first != last; ++first, ++result) {
957 *result = op(*first);
958 }
959 return result;
960}
961
978template <typename Iterator1, typename Iterator2, typename Iterator3, typename BinaryOperation>
979constexpr Iterator3 transform(Iterator1 first1, Iterator1 last1, Iterator2 first2, Iterator3 result,
980 BinaryOperation binary_op) noexcept(noexcept(++first1) && noexcept(first2) &&
981 noexcept(++result) &&
982 noexcept(*result = binary_op(*first1, *first2))) {
984 "Iterators must be forward_iterator");
985 static_assert(is_invocable_v<BinaryOperation, decltype(*first1), decltype(*first2)>,
986 "UnaryOperation must be invocable");
987 static_assert(
988 is_assignable_v<decltype(*result), invoke_result_t<BinaryOperation, decltype(*first1), decltype(*first2)>>,
989 "*result must be assignable");
990
991 for (; first1 != last1; ++first1, ++first2, ++result) {
992 *result = binary_op(*first1, *first2);
993 }
994 return result;
995}
996
997
1012template <typename Iterator1, typename Iterator2, typename BinaryPredicate>
1013constexpr Iterator2 unique_copy(Iterator1 first, Iterator1 last, Iterator2 result, BinaryPredicate binary_pred) {
1015 "Iterators must be forward_iterator");
1016 static_assert(is_invocable_v<BinaryPredicate, decltype(*result), decltype(*first)>,
1017 "BinaryPredicate must be invocable");
1018
1019 if (first == last) {
1020 return result;
1021 }
1022
1023 *result = *first;
1024
1025 while (++first != last) {
1026 if (!binary_pred(*result, *first)) {
1027 *++result = *first;
1028 }
1029 }
1030 return ++result;
1031}
1032
1042template <typename Iterator1, typename Iterator2>
1043constexpr Iterator2 unique_copy(Iterator1 first, Iterator1 last, Iterator2 result) {
1044 return _NEFORCE unique_copy(first, last, result, _NEFORCE equal_to<iter_value_t<Iterator1>>());
1045}
1046
1058template <typename Iterator, typename BinaryPredicate>
1059constexpr Iterator unique(Iterator first, Iterator last, BinaryPredicate binary_pred) {
1060 first = _NEFORCE adjacent_find(first, last, binary_pred);
1061 if (first == last) {
1062 return last;
1063 }
1064
1065 Iterator result = first;
1066 while (++first != last) {
1067 if (!binary_pred(*result, *first)) {
1068 *++result = _NEFORCE move(*first);
1069 }
1070 }
1071 return ++result;
1072}
1073
1083template <typename Iterator>
1084constexpr Iterator unique(Iterator first, Iterator last) {
1085 return _NEFORCE unique(first, last, _NEFORCE equal_to<iter_value_t<Iterator>>{});
1086}
1087 // ShiftAlgorithms
1089 // StandardAlgorithms
1091
1092NEFORCE_END_NAMESPACE__
1093#endif // NEFORCE_CORE_ALGORITHM_SHIFT_HPP__
constexpr Iterator adjacent_find(Iterator first, Iterator last, BinaryPredicate binary_pred)
查找第一对满足条件的相邻元素
constexpr T * addressof(T &x) noexcept
获取对象的地址
constexpr iter_difference_t< Iterator > count(Iterator first, Iterator last, const T &value)
统计范围内等于指定值的元素数量
constexpr bool is_invocable_v
is_invocable的便捷变量模板
typename inner::__invoke_result_aux< F, Args... >::type invoke_result_t
invoke_result的便捷别名
constexpr bool is_ranges_cot_iter_v
检查是否为范围连续迭代器
constexpr bool is_ranges_fwd_iter_v
检查是否为范围前向迭代器
constexpr bool is_ranges_input_iter_v
检查是否为范围输入迭代器
constexpr bool is_ranges_rnd_iter_v
检查是否为范围随机访问迭代器
constexpr bool is_iter_v
检查类型是否为迭代器
constexpr bool is_ranges_bid_iter_v
检查是否为范围双向迭代器
constexpr Iterator next(Iterator iter, iter_difference_t< Iterator > n=1)
获取迭代器的后一个位置
constexpr iter_difference_t< Iterator > distance(Iterator first, Iterator last)
计算两个迭代器之间的距离
constexpr Iterator prev(Iterator iter, iter_difference_t< Iterator > n=1)
获取迭代器的前一个位置
typename iterator_traits< Iterator >::value_type iter_value_t
获取迭代器的值类型
typename iterator_traits< Iterator >::difference_type iter_difference_t
获取迭代器的差值类型
constexpr T gcd(const T &m, const T &n) noexcept
计算最大公约数
constexpr void * memory_move(void *dest, const void *src, size_t count) noexcept
从源内存移动数据到目标内存
constexpr Iterator2 transform(Iterator1 first, Iterator1 last, Iterator2 result, UnaryOperation op) noexcept(noexcept(++first) &&noexcept(++result) &&noexcept(*result=op(*first)))
对范围元素应用一元变换
constexpr Iterator shift_right(Iterator first, Iterator last, iter_difference_t< Iterator > n)
向右移位
constexpr Iterator2 copy_n(Iterator1 first, iter_difference_t< Iterator1 > count, Iterator2 result)
复制指定数量的元素
constexpr Iterator2 unique_copy(Iterator1 first, Iterator1 last, Iterator2 result, BinaryPredicate binary_pred)
复制唯一元素
constexpr void replace(Iterator first, Iterator last, const T &old_value, const T &new_value)
替换范围元素
constexpr void fill(Iterator first, Iterator last, const T &value) noexcept(is_nothrow_assignable_v< iter_value_t< Iterator >, T >)
填充范围元素
constexpr Iterator for_each_n(Iterator first, iter_difference_t< Iterator > n, Function f)
对指定数量的元素应用函数
constexpr Iterator rotate(Iterator first, Iterator middle, Iterator last)
旋转范围元素
constexpr Iterator2 copy_backward(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__copy_backward_aux(first, last, result)))
反向复制范围元素
constexpr Function for_each(Iterator first, Iterator last, Function f)
对范围元素应用函数
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
constexpr Iterator2 copy(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__copy_aux(first, last, result)))
复制范围元素
constexpr Iterator2 copy_if(Iterator1 first, Iterator1 last, Iterator2 result, Pred pred)
复制满足谓词的元素
constexpr Iterator generate_n(Iterator first, iter_difference_t< Iterator > n, Generator gen)
用生成器的值填充指定数量的元素
constexpr Iterator2 move_backward(Iterator1 first, Iterator1 last, Iterator2 result)
反向移动范围元素
constexpr Iterator unique(Iterator first, Iterator last, BinaryPredicate binary_pred)
根据谓词移除连续重复元素
constexpr void replace_if(Iterator first, Iterator last, Predicate pred, const T &new_value)
根据谓词替换范围元素
constexpr Iterator shift_left(Iterator first, Iterator last, iter_difference_t< Iterator > n)
向左移位
constexpr void reverse(Iterator first, Iterator last)
反转范围元素顺序
constexpr void generate(Iterator first, Iterator last, Generator gen)
用生成器的值填充范围
constexpr Iterator2 rotate_copy(Iterator1 first, Iterator1 middle, Iterator1 last, Iterator2 result)
旋转并复制元素
constexpr Iterator2 swap_ranges(Iterator1 first1, Iterator1 last1, Iterator2 first2)
交换两个范围的元素
constexpr Iterator2 replace_copy(Iterator1 first, Iterator1 last, Iterator2 result, const T &old_value, const T &new_value)
替换并复制元素
constexpr void iter_swap(Iterator1 a, Iterator2 b) noexcept(noexcept(_NEFORCE swap(*a, *b)))
交换迭代器指向的元素
constexpr Iterator fill_n(Iterator first, iter_difference_t< Iterator > n, const T &value) noexcept(is_nothrow_assignable_v< iter_value_t< Iterator >, T >)
填充指定数量的元素
constexpr Iterator2 replace_copy_if(Iterator1 first, Iterator1 last, Iterator2 result, Predicate pred, const T &new_value)
根据谓词替换并复制元素
void swap()=delete
删除无参数的swap重载
constexpr bool is_nothrow_copy_assignable_v
is_nothrow_copy_assignable的便捷变量模板
constexpr bool is_assignable_v
is_assignable的便捷变量模板
constexpr bool is_nothrow_assignable_v
is_nothrow_assignable的便捷变量模板
constexpr bool is_nothrow_move_assignable_v
is_nothrow_move_assignable的便捷变量模板
constexpr bool is_trivially_copyable_v
is_trivially_copyable的便捷变量模板
typename enable_if< Test, T >::type enable_if_t
enable_if的便捷别名
统一调用接口
数学函数库
查找和搜索算法
相等比较仿函数