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


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