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 bidirectional_iterator");
49
50 const auto len1 = _NEFORCE distance(first1, last1);
51 const auto len2 = _NEFORCE distance(first2, last2);
52 if (len1 != len2) {
53 return false;
54 }
55
56 for (; first1 != last1 && first2 != last2; ++first1, ++first2) {
57 if (!pred(*first1, *first2)) {
58 break;
59 }
60 }
61 if (first1 == last1) {
62 return true;
63 }
64
65 for (Iterator1 i = first1; i != last1; ++i) {
66 bool is_repeated = false;
67 for (Iterator1 j = first1; j != i; ++j) {
68 if (pred(*j, *i)) {
69 is_repeated = true;
70 break;
71 }
72 }
73 if (!is_repeated) {
74 size_t c2 = 0;
75 for (Iterator2 j = first2; j != last2; ++j) {
76 if (pred(*i, *j)) {
77 ++c2;
78 }
79 }
80 if (c2 == 0) {
81 return false;
82 }
83 size_t c1 = 1;
84 Iterator1 j = i;
85 for (++j; j != last1; ++j) {
86 if (pred(*i, *j)) {
87 ++c1;
88 }
89 }
90 if (c1 != c2) {
91 return false;
92 }
93 }
94 }
95 return true;
96}
97
108template <typename Iterator1, typename Iterator2>
109constexpr bool is_permutation(Iterator1 first1, Iterator1 last1, Iterator2 first2, Iterator2 last2) {
110 return _NEFORCE is_permutation(first1, last1, first2, last2, _NEFORCE equal_to<iter_value_t<Iterator1>>());
111}
112
131template <typename Iterator, typename Compare>
132constexpr bool next_permutation(Iterator first, Iterator last, Compare comp) {
133 static_assert(is_ranges_bid_iter_v<Iterator>, "Iterator must be bidirectional_iterator");
134
135 if (first == last) {
136 return false;
137 }
138 Iterator i = first;
139 ++i;
140 if (i == last) {
141 return false;
142 }
143 i = last;
144 --i;
145 for (;;) {
146 Iterator ii = i;
147 --i;
148 if (comp(*i, *ii)) {
149 Iterator j = last;
150 while (!comp(*i, *--j)) {
151 }
152 _NEFORCE iter_swap(i, j);
153 _NEFORCE reverse(ii, last);
154 return true;
155 }
156 if (i == first) {
157 _NEFORCE reverse(first, last);
158 return false;
159 }
160 }
161}
162
170template <typename Iterator>
171constexpr bool next_permutation(Iterator first, Iterator last) {
172 return _NEFORCE next_permutation(first, last, _NEFORCE less<iter_value_t<Iterator>>());
173}
174
193template <typename Iterator, typename Compare>
194constexpr bool prev_permutation(Iterator first, Iterator last, Compare comp) {
195 static_assert(is_ranges_bid_iter_v<Iterator>, "Iterator must be bidirectional_iterator");
196
197 if (first == last) {
198 return false;
199 }
200 Iterator i = first;
201 ++i;
202 if (i == last) {
203 return false;
204 }
205 i = last;
206 --i;
207 for (;;) {
208 Iterator ii = i;
209 --i;
210 if (comp(*ii, *i)) {
211 Iterator j = last;
212 while (!comp(*--j, *i)) {
213 }
214 _NEFORCE iter_swap(i, j);
215 _NEFORCE reverse(ii, last);
216 return true;
217 }
218 if (i == first) {
219 _NEFORCE reverse(first, last);
220 return false;
221 }
222 }
223}
224
232template <typename Iterator>
233constexpr bool prev_permutation(Iterator first, Iterator last) {
234 return _NEFORCE prev_permutation(first, last, _NEFORCE less<iter_value_t<Iterator>>());
235}
236 // PermutationAlgorithms
238 // StandardAlgorithms
240
241NEFORCE_END_NAMESPACE__
242#endif // NEFORCE_CORE_ALGORITHM_PERMUTATION_HPP__
NEFORCE_INLINE17 constexpr bool is_ranges_bid_iter_v
检查是否为范围双向迭代器
constexpr iter_difference_t< Iterator > distance(Iterator first, Iterator last)
计算两个迭代器之间的距离
typename iterator_traits< Iterator >::value_type iter_value_t
获取迭代器的值类型
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)))
交换迭代器指向的元素
移位和修改算法
相等比较仿函数
小于比较仿函数