排列组合

这两个函数都包含在algorithm库中。STL提供了两个用来计算排列组合关系的算法,分别是next_permutation和prev_permutation。

一、函数原型

首先我们来看看这两个函数的函数原型:

  • next_permutation:
1 template< class BidirIt >bool next_permutation( BidirIt first, BidirIt last );
2 template< class BidirIt, class Compare >bool next_permutation( BidirIt first, BidirIt last, Compare comp );
  • prev_permutation:
1 template< class BidirIt >bool prev_permutation( BidirIt first, BidirIt last);
2 template< class BidirIt, class Compare >bool prev_permutation( BidirIt first, BidirIt last, Compare comp);

1.参数

first,end ——重新排序的元素范围

comp —— 自定义比较函数

顾名思义,next_permutation就是求下一个排列组合,而prev_permutation就是求上一个排列组合。首先我们必须了解什么是“下一个”排列组合,什么是“前一个”排列组合。考虑由三个字符所组成的序列{a,b,c}。

那么按照字典序排升序他们一共有下面这几种排列方式:

  • abc
  • acb
  • bac
  • bca
  • cab
  • cba

如果给定排列方式P,令P为{acb},那么next_permutation即求P+1也就是{bac},prev_permutation也就是求P-1即为{abc}。当然也可以自定义谓词函数进行自定义的“下一个排列组合”。

二、代码演示

下面是示范代码:

#include <algorithm>
using namespace std;

int main() {
    int a[] = { 1,2,3 };
    do {
        for (int i = 0; i < 3; i++) cout << a[i] << ' ';
        cout << endl;
    } while (next_permutation(a, a + 3));

    cout << endl;
    do {
        for (int i = 0; i < 3; i++) cout << a[i] << ' ';
        cout << endl;
    } while (prev_permutation(a, a + 3));
    return 0;
}

预计上面代码的运行结果应该是输出两组1,2,3的排列组合方式,共12行,但实际运行结果如下:

Why?

我们试着输出第一个循环后a数组的排列方式,结果会得到1 2 3,这是因为当next_permutation去找下一个排列组合P+1,找到则排列为下一个排列组合返回true,否则数组变成字典序最小的排列组合(即为重置排列)并返回false,prev_permutation也同理。

https://www.cnblogs.com/xenny/p/10192983.html

原文地址:https://www.cnblogs.com/leijiangtao/p/3608888.html