stl 全排列函数 next_permutation
做题时,遇到了,记录一下
一、基础概念
next_permutation需要头文件<algorithm>
next_permutation的时间复杂度是O(n)
next_permutation可以有两个或三个参数,类似于sort函数
next_permutation函数
返回值:如果没有下一个排列组合,返回false,否则返+回true。
注意,如果想获得所有的排列组合,那么我们的数据初始排列应该是升序的
二、实验
实验1
#include <iostream> #include <algorithm> #include <vector> using namespace std; vector<int> ve; int main(){ ve.push_back(10); ve.push_back(20); ve.push_back(30); do { cout<<ve[0]<<"\t"<<ve[1]<<"\t"<<ve[2]<<endl; }while(next_permutation(ve.begin() , ve.end() ) ); return 0; }
全的全排列
再看非升序实验
实验2
#include <iostream> #include <algorithm> #include <vector> using namespace std; vector<int> ve; int main(){ ve.push_back(30); ve.push_back(10); ve.push_back(20); do { cout<<ve[0]<<"\t"<<ve[1]<<"\t"<<ve[2]<<endl; }while(next_permutation(ve.begin() , ve.end() ) ); return 0; }
只有两例
实验3
简单的实现了一下3个参数的next_permutation函数
#include <iostream> #include <algorithm> using namespace std; typedef struct _TEST { int num; string name; } TEST,pTEST; int main(){ TEST test[3]; test[0] = {1,"刘备"}; test[1] = {2,"关羽"}; test[2] = {3,"张飞"}; do { cout<<test[0].name<<"\t"<<test[1].name<<"\t"<<test[2].name<<endl; cout<<test[0].num<<"\t"<<test[1].num<<"\t"<<test[2].num<<endl; }while(next_permutation(test,test+3,[=](const TEST &a,const TEST &b){ return a.num > b.num; })); return 0; }