NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
partition.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_ALGORITHM_PARTITION_HPP__
2#define NEFORCE_CORE_ALGORITHM_PARTITION_HPP__
3
11
13NEFORCE_BEGIN_NAMESPACE__
14
20
26
45template <typename Iterator, typename Predicate>
46constexpr Iterator partition(Iterator first, Iterator last, Predicate pred) {
47 static_assert(is_ranges_bid_iter_v<Iterator>, "Iterator must be bidirectional_iterator");
48 static_assert(is_invocable_v<Predicate, decltype(*first)>, "Predicate must be invocable");
49
50 while (true) {
51 while (true) {
52 if (first == last) {
53 return first;
54 }
55
56 if (pred(*first)) {
57 ++first;
58 } else {
59 break;
60 }
61 }
62 --last;
63 while (true) {
64 if (first == last) {
65 return first;
66 }
67
68 if (!pred(*last)) {
69 --last;
70 } else {
71 break;
72 }
73 }
74 _NEFORCE iter_swap(first, last);
75 ++first;
76 }
77}
78
80NEFORCE_BEGIN_INNER__
81
82template <typename Iterator, typename Compare>
83constexpr Iterator median_iter(Iterator a, Iterator b, Iterator c, Compare comp) {
84 if (comp(*a, *b)) {
85 if (comp(*b, *c)) {
86 return b;
87 } else if (comp(*a, *c)) {
88 return c;
89 } else {
90 return a;
91 }
92 } else {
93 if (comp(*a, *c)) {
94 return a;
95 } else if (comp(*b, *c)) {
96 return c;
97 } else {
98 return b;
99 }
100 }
101}
102
103NEFORCE_END_INNER__
105
118template <typename Iterator, typename Compare>
119constexpr Iterator lomuto_partition(Iterator first, Iterator last, Compare comp) {
120 static_assert(is_ranges_rnd_iter_v<Iterator>, "Iterator must be random_access_iterator");
121
122 if (last - first < 2) {
123 return first;
124 }
125
126 Iterator mid = first + (last - first) / 2;
127 Iterator piv_iter = inner::median_iter(first, mid, last - 1, comp);
128 _NEFORCE iter_swap(first, piv_iter);
129 auto pivot = *first;
130
131 Iterator i = first + 1;
132 Iterator j = first;
133
134 while (i != last) {
135 if (comp(*i, pivot)) {
136 ++j;
137 if (i != j) {
138 _NEFORCE iter_swap(i, j);
139 }
140 }
141 ++i;
142 }
143 _NEFORCE iter_swap(first, j);
144 return j;
145}
146
154template <typename Iterator>
155constexpr Iterator lomuto_partition(Iterator first, Iterator last) {
156 return _NEFORCE lomuto_partition(first, last, less<>{});
157}
158 // PartitionAlgorithms
160 // StandardAlgorithms
162
163NEFORCE_END_NAMESPACE__
164#endif // NEFORCE_CORE_ALGORITHM_PARTITION_HPP__
constexpr bool is_invocable_v
is_invocable的便捷变量模板
constexpr bool is_ranges_rnd_iter_v
检查是否为范围随机访问迭代器
constexpr bool is_ranges_bid_iter_v
检查是否为范围双向迭代器
constexpr Iterator lomuto_partition(Iterator first, Iterator last, Compare comp)
Lomuto 分区算法(基准值归位)
constexpr Iterator partition(Iterator first, Iterator last, Predicate pred)
分区算法
constexpr void iter_swap(Iterator1 a, Iterator2 b) noexcept(noexcept(_NEFORCE swap(*a, *b)))
交换迭代器指向的元素
移位和修改算法
小于比较仿函数