排列组合
这两个函数都包含在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也同理。