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


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


std::next_permutation()

next_permutation() 是一个 STL 函数,用于查找给定排列的下一个字典排列。

排列是一组给定数字的特定排列。比如说,我们有一个包含 n 个数字的集合,其中 n!排列是可能的。例如,如果一组数字是 {1, 2, 3} 那么,

按字典顺序排列的排列将是,

排列 1:1, 2, 3
排列 2:1, 3, 2
排列 3:2, 1, 3
排列 4:2, 3, 1
排列 5:3, 1, 2
排列 6:3, 2, 1

以上是可以从上述示例集生成的六个排列。此外,排列是按字典顺序排列的,这意味着排列 1 的下一个排列是排列 2,而排列 6 没有下一个排列,因为它是最高的。

STL 函数 next_permutation() 帮助我们找到给定排列的下一个排列。下面是 next_permutation() 的语法

bool next_permutation(
    BidirectionalIterator first, 
    BidirectionalIterator last
    );

参数:

  • BidirectionalIterator first- 开始置换序列的迭代器
  • BidirectionalIterator last- 结束置换序列的迭代器

返回类型: bool

如果找到下一个置换并将当前置换序列就地更改为下一个置换序列,则返回 true。如果未找到下一个排列,则返回 false。

示例和用法:

下面是我们使用上述 STL 函数计算下一个排列的示例程序。

1) 找到下一个排列

在下面的程序中,我们将使用上面讨论的 STL 函数找到下一个排列。

#include <bits/stdc++.h>
using namespace std;

void print(vector<int>& nums)
{
    for (auto it:nums)
        cout << it << " ";
    cout << endl;
}

int main()
{
    cout << "Enter number of elements in the permutation\n";
    int n;
    cin >> n;
 
    cout << "Input the permutations\n";
    vector<int> nums(n);
    for (int i = 0; i < n; i++)
        cin >> nums[i];
 
    //next_permutation returns true if it's 
    //able to find the next permutation
    //changes the permutation in place to the 
    //next permutation
    if (next_permutation(nums.begin(), nums.end())) {
        cout << "The next permutation is:\n";
        print(nums);
    }
    else
        cout << "No next permutation found\n";

    return 0;
}

输出:

Enter number of elements in the permutation
3
Input the permutations
2 1 3
The next permutation is:
2 3 1 

2)按字典顺序查找所有排列

我们还可以使用 next_permutation() 按字典顺序查找所有排列。例如,按字典顺序排列的 n=3 的所有排列都是

排列 1:1, 2, 3
排列 2:1, 3, 2
排列 3:2, 1, 3
排列 4:2, 3, 1
排列 5:3, 1, 2
排列 6:3, 2, 1

#include <bits/stdc++.h>
using namespace std;

void print(vector<int>& nums)
{
    for (auto it:nums)
        cout << it << " ";
    cout << endl;
}

int main()
{
    cout << "Enter number of elements in the permutation\n";
    int n;
    cin >> n;

    //first permutation is 1,2,3,4...,n
    vector<int> nums(n);
    for (int i = 0; i < n; i++)
        nums[i] = i + 1;

    int count = 1;

    //the while loop will break when no more 
    //next Permutation is possible
    //as the function next_permutation will 
    //return false then
    do {
        cout << "Permutation " << count++ << endl;
        print(nums);
    } //in places converts to next permutation if there exists the next permutation
    while (next_permutation(nums.begin(), nums.end()));

    return 0;
}

输出:

Enter number of elements in the permutation
3
Permutation 1
1 2 3 
Permutation 2
1 3 2 
Permutation 3
2 1 3 
Permutation 4
2 3 1 
Permutation 5
3 1 2 
Permutation 6
3 2 1 

上面的 next_permutation() 比较基于 '>' 运算符,而我们可以通过添加用户定义的比较器函数来扩展语法来处理用户定义的对象。

bool next_permutation(
    BidirectionalIterator first, 
    BidirectionalIterator last, 
    Comparator comp);


相关用法


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