1#ifndef NEFORCE_CORE_ALGORITHM_PERMUTATION_HPP__
2#define NEFORCE_CORE_ALGORITHM_PERMUTATION_HPP__
13NEFORCE_BEGIN_NAMESPACE__
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");
50 const auto len1 = _NEFORCE
distance(first1, last1);
51 const auto len2 = _NEFORCE
distance(first2, last2);
56 for (; first1 != last1 && first2 != last2; ++first1, ++first2) {
57 if (!pred(*first1, *first2)) {
61 if (first1 == last1) {
65 for (Iterator1 i = first1; i != last1; ++i) {
66 bool is_repeated =
false;
67 for (Iterator1 j = first1; j != i; ++j) {
75 for (Iterator2 j = first2; j != last2; ++j) {
85 for (++j; j != last1; ++j) {
108template <
typename Iterator1,
typename Iterator2>
109constexpr bool is_permutation(Iterator1 first1, Iterator1 last1, Iterator2 first2, Iterator2 last2) {
131template <
typename Iterator,
typename Compare>
150 while (!comp(*i, *--j)) {
153 _NEFORCE reverse(ii, last);
157 _NEFORCE reverse(first, last);
170template <
typename Iterator>
193template <
typename Iterator,
typename Compare>
212 while (!comp(*--j, *i)) {
215 _NEFORCE reverse(ii, last);
219 _NEFORCE reverse(first, last);
232template <
typename Iterator>
241NEFORCE_END_NAMESPACE__
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)))
交换迭代器指向的元素