NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
permutation.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_ALGORITHM_PERMUTATION_HPP__
2#define NEFORCE_CORE_ALGORITHM_PERMUTATION_HPP__
3
11
13NEFORCE_BEGIN_NAMESPACE__
14
20
26
45template <typename Iterator1, typename Iterator2, typename BinaryPred>
46constexpr bool is_permutation(Iterator1 first1, Iterator1 last1, Iterator2 first2, Iterator2 last2, BinaryPred pred) {
48 "Iterator must be forward_iterator");
49
50 for (; first1 != last1 && first2 != last2; ++first1, ++first2) {
51 if (!pred(*first1, *first2)) {
52 break;
53 }
54 }
55
56 if (first1 == last1 && first2 == last2) {
57 return true;
58 }
59 if (first1 == last1 || first2 == last2) {
60 return false;
61 }
62
63 for (Iterator1 i = first1; i != last1; ++i) {
64 bool already_counted = false;
65 for (Iterator1 j = first1; j != i; ++j) {
66 if (pred(*j, *i)) {
67 already_counted = true;
68 break;
69 }
70 }
71 if (!already_counted) {
72 size_t cnt2 = 0;
73 for (Iterator2 j = first2; j != last2; ++j) {
74 if (pred(*i, *j)) {
75 ++cnt2;
76 }
77 }
78 if (cnt2 == 0) {
79 return false;
80 }
81
82 size_t cnt1 = 1;
83 Iterator1 j = i;
84 for (++j; j != last1; ++j) {
85 if (pred(*i, *j)) {
86 ++cnt1;
87 }
88 }
89 if (cnt1 != cnt2) {
90 return false;
91 }
92 }
93 }
94 return true;
95}
96
107template <typename Iterator1, typename Iterator2>
108constexpr bool is_permutation(Iterator1 first1, Iterator1 last1, Iterator2 first2, Iterator2 last2) {
109 return _NEFORCE is_permutation(first1, last1, first2, last2, _NEFORCE equal_to<>());
110}
111
130template <typename Iterator, typename Compare>
131constexpr bool next_permutation(Iterator first, Iterator last, Compare comp) {
132 static_assert(is_ranges_bid_iter_v<Iterator>, "Iterator must be bidirectional_iterator");
133
134 if (first == last) {
135 return false;
136 }
137 Iterator i = first;
138 ++i;
139 if (i == last) {
140 return false;
141 }
142 i = last;
143 --i;
144 for (;;) {
145 Iterator ii = i;
146 --i;
147 if (comp(*i, *ii)) {
148 Iterator j = last;
149 while (!comp(*i, *--j)) {
150 }
151 _NEFORCE iter_swap(i, j);
152 _NEFORCE reverse(ii, last);
153 return true;
154 }
155 if (i == first) {
156 _NEFORCE reverse(first, last);
157 return false;
158 }
159 }
160}
161
169template <typename Iterator>
170constexpr bool next_permutation(Iterator first, Iterator last) {
171 return _NEFORCE next_permutation(first, last, _NEFORCE less<>());
172}
173
192template <typename Iterator, typename Compare>
193constexpr bool prev_permutation(Iterator first, Iterator last, Compare comp) {
194 static_assert(is_ranges_bid_iter_v<Iterator>, "Iterator must be bidirectional_iterator");
195
196 if (first == last) {
197 return false;
198 }
199 Iterator i = first;
200 ++i;
201 if (i == last) {
202 return false;
203 }
204 i = last;
205 --i;
206 for (;;) {
207 Iterator ii = i;
208 --i;
209 if (comp(*ii, *i)) {
210 Iterator j = last;
211 while (!comp(*--j, *i)) {
212 }
213 _NEFORCE iter_swap(i, j);
214 _NEFORCE reverse(ii, last);
215 return true;
216 }
217 if (i == first) {
218 _NEFORCE reverse(first, last);
219 return false;
220 }
221 }
222}
223
231template <typename Iterator>
232constexpr bool prev_permutation(Iterator first, Iterator last) {
233 return _NEFORCE prev_permutation(first, last, _NEFORCE less<>());
234}
235 // PermutationAlgorithms
237 // StandardAlgorithms
239
240NEFORCE_END_NAMESPACE__
241#endif // NEFORCE_CORE_ALGORITHM_PERMUTATION_HPP__
constexpr bool is_ranges_fwd_iter_v
检查是否为范围前向迭代器
constexpr bool is_ranges_bid_iter_v
检查是否为范围双向迭代器
constexpr bool prev_permutation(Iterator first, Iterator last, Compare comp)
生成上一个字典序排列
constexpr bool is_permutation(Iterator1 first1, Iterator1 last1, Iterator2 first2, Iterator2 last2, BinaryPred pred)
检查两个序列是否为排列关系
constexpr bool next_permutation(Iterator first, Iterator last, Compare comp)
生成下一个字典序排列
constexpr void iter_swap(Iterator1 a, Iterator2 b) noexcept(noexcept(_NEFORCE swap(*a, *b)))
交换迭代器指向的元素
移位和修改算法
相等比较仿函数
小于比较仿函数