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
16NEFORCE_BEGIN_NAMESPACE__
17
23
29
31NEFORCE_BEGIN_INNER__
32
44template <typename Iterator1, typename Iterator2>
46__copy_aux(Iterator1 first, Iterator1 last,
48 auto n = _NEFORCE distance(first, last);
49 for (; n > 0; --n, ++first, ++result) {
50 *result = *first;
51 }
52 return result;
53}
54
66template <typename Iterator1, typename Iterator2>
67constexpr enable_if_t<is_ranges_cot_iter_v<Iterator1>, Iterator2> __copy_aux(Iterator1 first, Iterator1 last,
68 Iterator2 result) noexcept {
69 const auto n = static_cast<size_t>(last - first);
70 const auto bytes = n * sizeof(iter_value_t<Iterator1>);
71 _NEFORCE memory_move(_NEFORCE addressof(*result), _NEFORCE addressof(*first), bytes);
72 return result + n;
73}
74
75NEFORCE_END_INNER__
77
90template <typename Iterator1, typename Iterator2>
91constexpr Iterator2 copy(Iterator1 first, Iterator1 last,
92 Iterator2 result) noexcept(noexcept(inner::__copy_aux(first, last, result))) {
94 "Iterators must be input_iterator");
95 if (first == last) {
96 return result;
97 }
98 return inner::__copy_aux(first, last, result);
99}
100
102NEFORCE_BEGIN_INNER__
103
113template <typename Iterator1, typename Iterator2>
115__copy_n_aux(Iterator1 first, iter_difference_t<Iterator1> count, Iterator2 result) {
116 Iterator1 last = first + count;
117 return pair<Iterator1, Iterator2>(last, _NEFORCE copy(first, last, result));
118}
119
129template <typename Iterator1, typename Iterator2>
131__copy_n_aux(Iterator1 first, iter_difference_t<Iterator1> count, Iterator2 result) {
132 for (; count > 0; --count, ++first, ++result) {
133 *result = *first;
134 }
135 return pair<Iterator1, Iterator2>(first, result);
136}
137NEFORCE_END_INNER__
139
152template <typename Iterator1, typename Iterator2>
153constexpr pair<Iterator1, Iterator2> copy_n(Iterator1 first, iter_difference_t<Iterator1> count, Iterator2 result) {
155 "Iterators must be input_iterator");
156 return inner::__copy_n_aux(first, count, result);
157}
158
172template <typename Iterator1, typename Iterator2, typename Pred>
173constexpr Iterator2 copy_if(Iterator1 first, Iterator1 last, Iterator2 result, Pred pred) {
175 "Iterators must be input_iterator");
176
177 for (; first != last; ++first) {
178 if (pred(*first)) {
179 *result++ = *first;
180 }
181 }
182 return result;
183}
184
186NEFORCE_BEGIN_INNER__
187
199template <typename Iterator1, typename Iterator2>
201__copy_backward_aux(Iterator1 first, Iterator1 last,
202 Iterator2 result) noexcept(is_nothrow_copy_assignable_v<iter_value_t<Iterator1>>) {
203 iter_difference_t<Iterator1> n = _NEFORCE distance(first, last);
204 for (; n > 0; --n) {
205 *--result = *--last;
206 }
207 return result;
208}
209
221template <typename Iterator1, typename Iterator2>
222constexpr enable_if_t<is_ranges_cot_iter_v<Iterator1>, Iterator2> __copy_backward_aux(Iterator1 first, Iterator1 last,
223 Iterator2 result) noexcept {
224 const auto n = static_cast<size_t>(last - first);
225 _NEFORCE memory_move(_NEFORCE addressof(*result), _NEFORCE addressof(*first), n * sizeof(iter_value_t<Iterator1>));
226 return result;
227}
228
229NEFORCE_END_INNER__
231
244template <typename Iterator1, typename Iterator2>
245constexpr Iterator2
246copy_backward(Iterator1 first, Iterator1 last,
247 Iterator2 result) noexcept(noexcept(inner::__copy_backward_aux(first, last, result))) {
249 "Iterators must be bidirectional_iterator");
250
251 if (first == last) {
252 return result;
253 }
254 return inner::__copy_backward_aux(first, last, result);
255}
256
258NEFORCE_BEGIN_INNER__
259
269template <typename Iterator1, typename Iterator2>
271__move_aux(Iterator1 first, Iterator1 last,
272 Iterator2 result) noexcept(is_nothrow_move_assignable_v<iter_value_t<Iterator1>>) {
273 iter_difference_t<Iterator1> n = _NEFORCE distance(first, last);
274 for (; n > 0; --n, ++first, ++result) {
275 *result = _NEFORCE move(*first);
276 }
277 return result;
278}
279
289template <typename Iterator1, typename Iterator2>
290constexpr enable_if_t<is_ranges_cot_iter_v<Iterator1>, Iterator2> __move_aux(Iterator1 first, Iterator1 last,
291 Iterator2 result) noexcept {
292 const auto n = static_cast<size_t>(last - first);
293 _NEFORCE memory_move(_NEFORCE addressof(*result), _NEFORCE addressof(*first), n * sizeof(iter_value_t<Iterator1>));
294 return result + n;
295}
296
297NEFORCE_END_INNER__
299
312template <typename Iterator1, typename Iterator2>
313constexpr Iterator2 move(Iterator1 first, Iterator1 last,
314 Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result))) {
316 "Iterators must be input_iterator");
317
318 if (first == last) {
319 return result;
320 }
321 return inner::__move_aux(first, last, result);
322}
323
325NEFORCE_BEGIN_INNER__
326
336template <typename Iterator1, typename Iterator2>
337constexpr enable_if_t<!is_ranges_cot_iter_v<Iterator1>, Iterator2> __move_backward_aux(Iterator1 first, Iterator1 last,
338 Iterator2 result) {
339 for (size_t n = _NEFORCE distance(first, last); n > 0; --n) {
340 *--result = _NEFORCE move(*--last);
341 }
342 return result;
343}
344
354template <typename Iterator1, typename Iterator2>
355constexpr enable_if_t<is_ranges_cot_iter_v<Iterator1>, Iterator2> __move_backward_aux(Iterator1 first, Iterator1 last,
356 Iterator2 result) noexcept {
357 const auto n = static_cast<size_t>(last - first);
358 _NEFORCE memory_move(_NEFORCE addressof(*result), _NEFORCE addressof(*first), n * sizeof(iter_value_t<Iterator1>));
359 return result;
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 (size_t 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 (true) {
723 if (first == last || first == --last) {
724 return;
725 }
726 --last;
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
836template <typename Iterator>
837constexpr void rotate(Iterator first, Iterator middle, Iterator last) {
838 static_assert(is_ranges_fwd_iter_v<Iterator>, "Iterators must be forward_iterator");
839
840 if (first == middle || middle == last) {
841 return;
842 }
843 inner::__rotate_aux(first, middle, last);
844}
845
858template <typename Iterator1, typename Iterator2>
859constexpr Iterator2 rotate_copy(Iterator1 first, Iterator1 middle, Iterator1 last, Iterator2 result) {
860 return _NEFORCE copy(first, middle, _NEFORCE copy(middle, last, result));
861}
862
863
874template <typename Iterator>
875constexpr void shift_left(Iterator first, Iterator last, iter_difference_t<Iterator> n) {
876 static_assert(is_ranges_fwd_iter_v<Iterator>, "Iterators must be forward_iterator");
877 static_assert(is_assignable_v<decltype(*first), add_rvalue_reference_t<iter_value_t<Iterator>>>,
878 "*first must be assignable");
879
880 if (first == last || n == 0) {
881 return;
882 }
883 if (n >= _NEFORCE distance(first, last)) {
884 for (; first != last; ++first) {
885 *first = _NEFORCE move(_NEFORCE initialize<iter_value_t<Iterator>>());
886 }
887 return;
888 }
889 Iterator new_first = _NEFORCE next(first, n);
890 _NEFORCE copy(new_first, last, first);
891 Iterator end = _NEFORCE prev(last, -n);
892 for (; end != last; ++end) {
893 *end = _NEFORCE move(_NEFORCE initialize<iter_value_t<Iterator>>());
894 }
895}
896
897
908template <typename Iterator>
909constexpr void shift_right(Iterator first, Iterator last, iter_difference_t<Iterator> n) {
910 static_assert(is_ranges_bid_iter_v<Iterator>, "Iterators must be bidirectional_iterator");
911 static_assert(is_assignable_v<decltype(*first), add_rvalue_reference_t<iter_value_t<Iterator>>>,
912 "*first must be assignable");
913
914 if (first == last || n == 0) {
915 return;
916 }
917 if (n >= _NEFORCE distance(first, last)) {
918 for (; first != last; ++first) {
919 *first = _NEFORCE move(_NEFORCE initialize<iter_value_t<Iterator>>());
920 }
921 return;
922 }
923 auto new_last = _NEFORCE prev(last, -n);
924 _NEFORCE move_backward(first, new_last, last);
925 auto end = _NEFORCE next(first, n);
926 for (; first != end; ++first) {
927 *first = _NEFORCE move(_NEFORCE initialize<iter_value_t<Iterator>>());
928 }
929}
930
931
945template <typename Iterator1, typename Iterator2, typename UnaryOperation>
946constexpr Iterator2 transform(Iterator1 first, Iterator1 last, Iterator2 result,
947 UnaryOperation op) noexcept(noexcept(++first) && noexcept(++result) &&
948 noexcept(*result = op(*first))) {
950 "Iterators must be forward_iterator");
951 static_assert(is_invocable_v<UnaryOperation, decltype(*first)>, "UnaryOperation must be invocable");
952 static_assert(is_assignable_v<decltype(*result), invoke_result_t<UnaryOperation, decltype(*first)>>,
953 "*result must be assignable");
954
955 for (; first != last; ++first, ++result) {
956 *result = op(*first);
957 }
958 return result;
959}
960
977template <typename Iterator1, typename Iterator2, typename Iterator3, typename BinaryOperation>
978constexpr Iterator3 transform(Iterator1 first1, Iterator1 last1, Iterator2 first2, Iterator3 result,
979 BinaryOperation binary_op) noexcept(noexcept(++first1) && noexcept(first2) &&
980 noexcept(++result) &&
981 noexcept(*result = binary_op(*first1, *first2))) {
983 "Iterators must be forward_iterator");
984 static_assert(is_invocable_v<BinaryOperation, decltype(*first1), decltype(*first2)>,
985 "UnaryOperation must be invocable");
986 static_assert(
987 is_assignable_v<decltype(*result), invoke_result_t<BinaryOperation, decltype(*first1), decltype(*first2)>>,
988 "*result must be assignable");
989
990 for (; first1 != last1; ++first1, ++first2, ++result) {
991 *result = binary_op(*first1, *first2);
992 }
993 return result;
994}
995
996
1011template <typename Iterator1, typename Iterator2, typename BinaryPredicate>
1012constexpr Iterator2 unique_copy(Iterator1 first, Iterator1 last, Iterator2 result, BinaryPredicate binary_pred) {
1014 "Iterators must be forward_iterator");
1015 static_assert(is_invocable_v<BinaryPredicate, decltype(*result), decltype(*first)>,
1016 "BinaryPredicate must be invocable");
1017
1018 if (first == last) {
1019 return result;
1020 }
1021
1022 *result = *first;
1023
1024 while (++first != last) {
1025 if (!binary_pred(*result, *first)) {
1026 *++result = *first;
1027 }
1028 }
1029 return ++result;
1030}
1031
1041template <typename Iterator1, typename Iterator2>
1042constexpr Iterator2 unique_copy(Iterator1 first, Iterator1 last, Iterator2 result) {
1043 return _NEFORCE unique_copy(first, last, result, _NEFORCE equal_to<iter_value_t<Iterator1>>());
1044}
1045
1055template <typename Iterator>
1056constexpr Iterator unique(Iterator first, Iterator last) {
1057 first = _NEFORCE adjacent_find(first, last);
1058 return _NEFORCE unique_copy(first, last, first);
1059}
1060
1072template <typename Iterator, typename BinaryPredicate>
1073constexpr Iterator unique(Iterator first, Iterator last, BinaryPredicate binary_pred) {
1074 first = _NEFORCE adjacent_find(first, last, binary_pred);
1075 return _NEFORCE unique_copy(first, last, first, binary_pred);
1076}
1077 // ShiftAlgorithms
1079 // StandardAlgorithms
1081
1082NEFORCE_END_NAMESPACE__
1083#endif // NEFORCE_CORE_ALGORITHM_SHIFT_HPP__
typename add_reference< T >::rvalue add_rvalue_reference_t
add_rvalue_reference的便捷别名
constexpr Iterator adjacent_find(Iterator first, Iterator last, BinaryPredicate binary_pred)
查找第一对满足条件的相邻元素
NEFORCE_NODISCARD constexpr T * addressof(T &x) noexcept
获取对象的地址
constexpr iter_difference_t< Iterator > count(Iterator first, Iterator last, const T &value)
统计范围内等于指定值的元素数量
NEFORCE_INLINE17 constexpr bool is_invocable_v
is_invocable的便捷变量模板
typename inner::__invoke_result_aux< F, Args... >::type invoke_result_t
invoke_result的便捷别名
NEFORCE_INLINE17 constexpr bool is_ranges_input_iter_v
检查是否为范围输入迭代器
NEFORCE_INLINE17 constexpr bool is_ranges_fwd_iter_v
检查是否为范围前向迭代器
NEFORCE_INLINE17 constexpr bool is_ranges_bid_iter_v
检查是否为范围双向迭代器
NEFORCE_INLINE17 constexpr bool is_ranges_rnd_iter_v
检查是否为范围随机访问迭代器
constexpr Iterator prev(Iterator iter, iter_difference_t< Iterator > n=-1)
获取迭代器的前一个位置
constexpr Iterator next(Iterator iter, iter_difference_t< Iterator > n=1)
获取迭代器的后一个位置
constexpr iter_difference_t< Iterator > distance(Iterator first, Iterator last)
计算两个迭代器之间的距离
typename iterator_traits< Iterator >::value_type iter_value_t
获取迭代器的值类型
typename iterator_traits< Iterator >::difference_type iter_difference_t
获取迭代器的差值类型
NEFORCE_CONST_FUNCTION NEFORCE_CONSTEXPR14 T gcd(const T &m, const T &n) noexcept
计算最大公约数
NEFORCE_CONSTEXPR14 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 unique(Iterator first, Iterator last)
移除连续重复元素
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 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 void shift_right(Iterator first, Iterator last, iter_difference_t< Iterator > n)
向右移位
constexpr Iterator generate_n(Iterator first, iter_difference_t< Iterator > n, Generator gen)
用生成器的值填充指定数量的元素
constexpr pair< Iterator1, Iterator2 > copy_n(Iterator1 first, iter_difference_t< Iterator1 > count, Iterator2 result)
复制指定数量的元素
constexpr Iterator2 move_backward(Iterator1 first, Iterator1 last, Iterator2 result)
反向移动范围元素
constexpr void replace_if(Iterator first, Iterator last, Predicate pred, const T &new_value)
根据谓词替换范围元素
constexpr void 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 void rotate(Iterator first, Iterator middle, Iterator last)
旋转范围元素
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重载
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) end(Container &cont) noexcept(noexcept(cont.end()))
获取容器的结束迭代器
NEFORCE_ALWAYS_INLINE constexpr T initialize() noexcept(is_nothrow_default_constructible< T >::value)
返回类型T的默认初始化值
NEFORCE_INLINE17 constexpr bool is_nothrow_assignable_v
is_nothrow_assignable的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_nothrow_copy_assignable_v
is_nothrow_copy_assignable的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_nothrow_move_assignable_v
is_nothrow_move_assignable的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_assignable_v
is_assignable的便捷变量模板
typename enable_if< Test, T >::type enable_if_t
enable_if的便捷别名
统一调用接口
数学函数库
键值对
查找和搜索算法
相等比较仿函数
存储两个值的元组对