當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。