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


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


C++ 算法 prev_permutation() 函数用于将 [first, last) 范围内的元素重新排序为之前的字典序排列。

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

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

用法

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

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

参数

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

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

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

返回值

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

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

复杂度

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

数据竞争

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

异常

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

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

例子1

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

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

using namespace std;

int main()
{
    string s="abc";
    sort(s.begin(), s.end(), greater<char>());
    do {
        cout << s << ' ';
    } while(prev_permutation(s.begin(), s.end()));
    cout << '\n';
    
    return 0;
}

输出:

cba cab bca bac acb abc

例子2

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

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

using namespace std;

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

  sort (myints,myints+3);
  reverse (myints,myints+3);

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

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

  return 0;
}

输出:

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

例子3

让我们看另一个简单的例子来演示使用默认版本的 prev_permutation 的使用:

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

using namespace std;

int main()
{
    string s;

    cout << "Enter the String:";
    cin >> s;
    sort(s.rbegin(), s.rend());
    cout << "Permutations of " << s << endl;
    do
    {
        cout << s << "\t";
    }
    while (prev_permutation(s.begin(), s.end()));
    return 0;
}

输出:

Enter the String:NIK
Permutations of NKI
NKI	NIK	KNI	KIN	INK	IKN

示例 4

让我们看一个简单的例子来演示使用比较函数的 prev_permutation() 的使用:

#include <iostream>
#include <algorithm>
using namespace std;
// Function to rearrange the specified string as lexicographically smaller
// permutation. It returns false if the string cannot be rearranged as
// lexicographically smaller permutation, else it returns true
bool prevPermutation(string &s, int n)
{
    // Find largest index i such that s[i-1] is more than s[i]
    int i = n-1;
    while (i > 0 && s[i-1] <= s[i])
    {
        // Return false if i is at first index of the string
        // This means we're already at lowest possible permutation
        if (--i == 0)
            return false;
    }

    // s[i..n-1] is now sorted in natural order

    // Find highest index j such that j >= i and s[j] < s[i-1]
    int j = i;
    while (j < n && s[j] <= s[i-1])
        j++;

    j--;

    // Swap characters at index i-1 with index j
    swap(s[i-1], s[j]);

    // Reverse the substring s[i..n-1] and return true
    reverse (s.begin() + i, s.end());

    return true;
}

// Program to find lexicographically smaller permutations of a string
int main()
{
    string s = "231";

    // std::sort(rbegin(s), rend(s));

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

        // find previous permutation in lexicographic order
        if (!prevPermutation(s, s.length()))
            break;
    }

    return 0;
}

输出:

231 213 132 123





相关用法


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