当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


C++ Algorithm next_permutation()用法及代码示例


C++ 算法 next_permutation() 函数用于将范围 [first, last) 中的元素重新排序为下一个字典序更大的排列。

排列被指定为可以对一组或多个事物进行排序或排列的几种可能方式中的每一种。它表示为N!其中 N = 范围内的元素数。

对于第一个版本使用运算符 < 比较元素,或者对于第二个版本使用给定的二进制比较函数 comp 比较元素。

用法

default (1)    template <class BidirectionalIterator>
         bool next_permutation (BidirectionalIterator first, BidirectionalIterator last);

custom (2)    template <class BidirectionalIterator, class Compare>
                     bool next_permutation (BidirectionalIterator first, BidirectionalIterator last, 
                                                              Compare comp);

参数

first: 一个双向迭代器,指向要排列的范围内的第一个元素。

last:一个输入迭代器,指向要排列的范围中最后一个位置。

comp: 一个用户定义的二元谓词函数,它接受两个参数,如果两个参数按顺序返回真,否则返回假。它遵循严格的弱排序来对元素进行排序。

返回值

如果函数可以将对象重新排序为字典序更大的排列,则返回 true。

否则,该函数返回 false 以指示排列不大于先前的排列,而是可能的最低排列(按升序排序)。

复杂度

复杂性在第一个和最后一个之间的距离的一半内达到线性。

数据竞争

范围 [first, last) 中的对象被修改。

异常

如果任一元素被交换或迭代器上的操作引发异常,则此函数将引发异常。

注意:无效的参数会导致未定义的行为。

例子1

让我们看一个简单的例子来演示 next_permutation() 的使用:

#include <algorithm>
#include <string>
#include <iostream>

using namespace std;
 
int main()
{
    string s = "aba";
    sort(s.begin(), s.end());
    do {
        cout << s << '\n';
    } while(next_permutation(s.begin(), s.end()));
    
    return 0;
}

输出:

aab
aba 
baa

例子2

让我们看另一个简单的例子:

#include <iostream>     // std::cout
#include <algorithm>    // std::next_permutation, std::sort

using namespace std;

int main () {
  int myints[] = {1,2,3};

  sort (myints,myints+3);

  cout << "The 3! possible permutations with 3 elements:\n";
  do {
    cout << myints[0] << ' ' << myints[1] << ' ' << myints[2] << '\n';
  } while ( next_permutation(myints,myints+3) );

  cout << "After loop:" << myints[0] << ' ' << myints[1] << ' ' << myints[2] << '\n';

  return 0;
}

输出:

The 3! possible permutations with 3 elements:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
After loop:1 2 3

例子3

让我们看另一个简单的例子:

#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;

template<typename It>
bool next_permutation(It begin, It end)
{
        if (begin == end)
                return false;

        It i = begin;
        ++i;
        if (i == end)
                return false;

        i = end;
        --i;

        while (true)
        {
                It j = i;
                --i;

                if (*i < *j)
                {
                        It k = end;

                        while (!(*i < *--k))
                                /* pass */;

                        iter_swap(i, k);
                        reverse(j, end);
                        return true;
                }

                if (i == begin)
                {
                        reverse(begin, end);
                        return false;
                }
        }
}

int main()
{
        vector<int> v = { 1, 2, 3, 4 };

        do
        {
                for (int i = 0; i < 4; i++)
                {
                        cout << v[i] << " ";
                }
                cout << endl;
        }
        while (::next_permutation(v.begin(), v.end()));
}

输出:

1 2 3 4 
1 2 4 3 
1 3 2 4 
1 3 4 2 
1 4 2 3 
1 4 3 2 
2 1 3 4 
2 1 4 3 
2 3 1 4 
2 3 4 1 
2 4 1 3 
2 4 3 1 
3 1 2 4 
3 1 4 2 
3 2 1 4 
3 2 4 1 
3 4 1 2 
3 4 2 1 
4 1 2 3 
4 1 3 2 
4 2 1 3 
4 2 3 1 
4 3 1 2 
4 3 2 1 

示例 4

让我们看一个简单的例子:

#include <iostream>
#include <algorithm>

using namespace std;

// Program to find all lexicographically next permutations
int main()
{
    string s = "231";
    
    // Optional:sort the string in natural order before calling
    // std::next_permutation inside a loop to print all permutations,
    // not just the ones that follows specified string lexicographically

    // std::sort(begin(s), end(s));

    // find all lexicographically next permutations using 
    // std::next_permutation
    while (1)
    {
        // print current permutation
        cout << s << " ";

        // find next permutation in lexicographic order
        if (!next_permutation(begin(s), end(s)))
            break;
    }

    return 0;
}

输出:

231 312 321





相关用法


注:本文由纯净天空筛选整理自 C++ Algorithm next_permutation ()。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。