重排区间中的元素,使得原序列变成按字典次序的下一个序列。其中的“下一个”的定义可以由用户自己定制。
加载头文件:
#include<iostream>
函数原型:
template<class BidirectionalIterator>
bool next_permutation(
BidirectionalIterator _First,
BidirectionalIterator _Last
);
template<class BidirectionalIterator, class BinaryPredicate>
bool next_permutation(
BidirectionalIterator _First,
BidirectionalIterator _Last,
BinaryPredicate _Comp
);
传入参数说明:
_First 要改变的第一个序列的起始位置
_Last 要改变的第一个序列的结束位置
_Comp 自定义的大小关系函数对象,根据两元素的大小返回true或者false
函数返回值:
若字典次序的下一个序列存在且已经替换排序成功则返回true,否则返回false,同时排序方案被转换成按字典次序最小的排序。
对于第二个重载函数的第三个参数,默认比较顺序为小于。如果找到下一个序列,则返回真,否则返回假。
说明:
默认的大小关系由小于运算符定义,区间中的元素必须是能够进行大小判断的。该算法的时间复杂性事线性的,最多进行(_Last-_First)/2次交换。
下面给出例子学习next_permutation的使用:序列{a, d, c, e, b}的下一个序列是什么呢?请利用前面的分析推出答案,并用代码验证。
我这里分别用数组和vector来表示序列,用next_permutation得到下一个序列.
#include <iostream> #include <algorithm> #include <vector> using namespace std; void TestArray() { char chs[] = { 'a', 'd', 'c', 'e', 'b' }; int count = sizeof(chs) / sizeof(char); next_permutation(chs, chs + count); cout << "TestArray:" << endl; for (int i = 0; i < count; i++) cout << chs[i] << " "; cout << endl; } void TestVector() { char chs[] = { 'a', 'd', 'c', 'e', 'b' }; int count = sizeof(chs) / sizeof(char); vector<char> vChs(chs, chs + count); next_permutation(vChs.begin(), vChs.end()); cout << "TestArray:" << endl; vector<char>::iterator itr; for (itr = vChs.begin(); itr != vChs.end(); itr++) cout << *itr << " "; cout << endl; } int main() { TestArray(); cout << endl; TestVector(); cout << endl; return 0; }