MSTL 1.4.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
permutation.hpp
浏览该文件的文档.
1#ifndef MSTL_CORE_ALGORITHM_PERMUTATION_HPP__
2#define MSTL_CORE_ALGORITHM_PERMUTATION_HPP__
3
11
14
20
39template <typename Iterator1, typename Iterator2, typename BinaryPred,
41constexpr bool is_permutation(Iterator1 first1, Iterator1 last1, Iterator2 first2, Iterator2 last2, BinaryPred pred) {
42 iter_difference_t<Iterator1> len1 = _MSTL distance(first1, last1);
43 iter_difference_t<Iterator2> len2 = _MSTL distance(first2, last2);
44 if (len1 != len2) return false;
45
46 for (; first1 != last1 && first2 != last2; ++first1, ++first2) {
47 if (!pred(*first1, *first2)) break;
48 }
49 if (first1 == last1) return true;
50
51 for (Iterator1 i = first1; i != last1; ++i) {
52 bool is_repeated = false;
53 for (Iterator1 j = first1; j != i; ++j) {
54 if (pred(*j, *i)) {
55 is_repeated = true;
56 break;
57 }
58 }
59 if (!is_repeated) {
60 size_t c2 = 0;
61 for (Iterator2 j = first2; j != last2; ++j) {
62 if (pred(*i, *j)) ++c2;
63 }
64 if (c2 == 0) return false;
65 size_t c1 = 1;
66 Iterator1 j = i;
67 for (++j; j != last1; ++j) {
68 if (pred(*i, *j)) ++c1;
69 }
70 if (c1 != c2) return false;
71 }
72 }
73 return true;
74}
75
86template <typename Iterator1, typename Iterator2>
87constexpr bool is_permutation(Iterator1 first1, Iterator1 last1, Iterator2 first2, Iterator2 last2) {
88 return _MSTL is_permutation(first1, last1, first2, last2, _MSTL equal_to<iter_value_t<Iterator1>>());
89}
90
109template <typename Iterator, typename Compare, enable_if_t<is_ranges_bid_iter_v<Iterator>, int> = 0>
110constexpr bool next_permutation(Iterator first, Iterator last, Compare comp) {
111 if (first == last) return false;
112 Iterator i = first;
113 ++i;
114 if (i == last) return false;
115 i = last;
116 --i;
117 for (;;) {
118 Iterator ii = i;
119 --i;
120 if (comp(*i, *ii)) {
121 Iterator j = last;
122 while (!comp(*i, *--j)) {}
123 _MSTL iter_swap(i, j);
124 _MSTL reverse(ii, last);
125 return true;
126 }
127 if (i == first) {
128 _MSTL reverse(first, last);
129 return false;
130 }
131 }
132}
133
141template <typename Iterator>
142constexpr bool next_permutation(Iterator first, Iterator last) {
144}
145
164template <typename Iterator, typename Compare, enable_if_t<is_ranges_bid_iter_v<Iterator>, int> = 0>
165constexpr bool prev_permutation(Iterator first, Iterator last, Compare comp) {
166 if (first == last) return false;
167 Iterator i = first;
168 ++i;
169 if (i == last) return false;
170 i = last;
171 --i;
172 for (;;) {
173 Iterator ii = i;
174 --i;
175 if (comp(*ii, *i)) {
176 Iterator j = last;
177 while (!comp(*--j, *i)) {}
178 _MSTL iter_swap(i, j);
179 _MSTL reverse(ii, last);
180 return true;
181 }
182 if (i == first) {
183 _MSTL reverse(first, last);
184 return false;
185 }
186 }
187}
188
196template <typename Iterator>
197constexpr bool prev_permutation(Iterator first, Iterator last) {
199}
200 // PermutationAlgorithms
202
204#endif // MSTL_CORE_ALGORITHM_PERMUTATION_HPP__
MSTL_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
获取迭代器的值类型
typename iterator_traits< Iterator >::difference_type iter_difference_t
获取迭代器的差值类型
#define _MSTL
全局命名空间MSTL前缀
#define MSTL_END_NAMESPACE__
结束全局命名空间MSTL
#define MSTL_BEGIN_NAMESPACE__
开始全局命名空间MSTL
constexpr bool is_permutation(Iterator1 first1, Iterator1 last1, Iterator2 first2, Iterator2 last2, BinaryPred pred)
检查两个序列是否为排列关系
constexpr bool prev_permutation(Iterator first, Iterator last, Compare comp)
生成上一个字典序排列
constexpr bool next_permutation(Iterator first, Iterator last, Compare comp)
生成下一个字典序排列
constexpr void iter_swap(Iterator1 a, Iterator2 b) noexcept(noexcept(_MSTL swap(*a, *b)))
交换迭代器指向的元素
constexpr void reverse(Iterator first, Iterator last)
反转范围元素顺序
typename enable_if< Test, T >::type enable_if_t
enable_if的便捷别名
MSTL移位和修改算法
相等比较仿函数
小于比较仿函数