1#ifndef MSTL_CORE_ALGORITHM_PERMUTATION_HPP__
2#define MSTL_CORE_ALGORITHM_PERMUTATION_HPP__
39template <
typename Iterator1,
typename Iterator2,
typename BinaryPred,
41constexpr bool is_permutation(Iterator1 first1, Iterator1 last1, Iterator2 first2, Iterator2 last2, BinaryPred pred) {
44 if (len1 != len2)
return false;
46 for (; first1 != last1 && first2 != last2; ++first1, ++first2) {
47 if (!pred(*first1, *first2))
break;
49 if (first1 == last1)
return true;
51 for (Iterator1 i = first1; i != last1; ++i) {
52 bool is_repeated =
false;
53 for (Iterator1 j = first1; j != i; ++j) {
61 for (Iterator2 j = first2; j != last2; ++j) {
62 if (pred(*i, *j)) ++c2;
64 if (c2 == 0)
return false;
67 for (++j; j != last1; ++j) {
68 if (pred(*i, *j)) ++c1;
70 if (c1 != c2)
return false;
86template <
typename Iterator1,
typename Iterator2>
87constexpr bool is_permutation(Iterator1 first1, Iterator1 last1, Iterator2 first2, Iterator2 last2) {
109template <
typename Iterator,
typename Compare, enable_if_t<is_ranges_b
id_iter_v<Iterator>,
int> = 0>
111 if (first == last)
return false;
114 if (i == last)
return false;
122 while (!comp(*i, *--j)) {}
141template <
typename Iterator>
164template <
typename Iterator,
typename Compare, enable_if_t<is_ranges_b
id_iter_v<Iterator>,
int> = 0>
166 if (first == last)
return false;
169 if (i == last)
return false;
177 while (!comp(*--j, *i)) {}
196template <
typename Iterator>
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的便捷别名