c++STL中的全排列函数next_permutation详解
在 C++ 的 库中,next_permutation 是一个用于计算给定范围内元素的下一个排列的函数。这个函数特别适用于对整数序列或可以比较的元素进行全排列的生成。
参数
first, last:表示范围的迭代器,即要重新排列的序列的开始和结束。
cmp(可选):一个自定义的比较函数或函数对象,用于确定元素之间的顺序。
返回值
如果存在下一个排列,则返回 true 并重新排列序列。如果不存在下一个排列(即序列已经是最大排列),则函数将序列重置为最小排列并返回 false。
使用示例1(没有cmp)
#include <iostream>
#include <algorithm>
#include <vector>
int main() {
std::vector<int> v = {1, 2, 3};
// 打印所有排列
do {
for (int n : v) {
std::cout << n << ' ';
}
std::cout << '\n';
} while (std::next_permutation(v.begin(), v.end()));
return 0;
}
使用示例2(有cmp)
#include <iostream>
#include <algorithm>
#include <vector>
#include <functional> // 对于std::greater
int main() {
std::vector<int> v = {3, 2, 1};
// 使用std::greater作为比较函数对象,它将产生降序排列
do {
for (int n : v) {
std::cout << n << ' ';
}
std::cout << '\n';
} while (std::next_permutation(v.begin(), v.end(), std::greater()));
// 注意:由于我们使用了std::greater,所以排列将是降序的,
// 当没有更多降序排列时,它将重置为最大降序排列(即最小升序排列)
return 0;
}
使用示例3(结构体全排列—必须要有全排列函数)
#include<iostream>
#include<algorithm>//使用 next_permutation()和sort()需要导入的头文件
using namespace std;
struct test{//结构体test
int val;
};
bool cmp(test t1,test t2){//自定义的排列
return t1.val<t2.val;
}
int main(){
test t[4];//结构体数组
t[0].val=1;
t[1].val=2;
t[2].val=3;
t[3].val=4;
do{
for(int i=0;i<4;i++){//打印排列
cout<<t[i].val<<' ';
}
cout<<endl;
}while(next_permutation(t,t+4,cmp));//获取下一个排列
}
注意事项
next_permutation 假定序列中的元素是唯一的(即没有重复)。如果有重复元素,并且你希望考虑所有可能的排列(包括重复的),那么你需要使用其他方法或库。
next_permutation 是原地(in-place)算法,即它会修改传入的序列。
如果传入的序列已经是最大排列(即按字典序排序),那么 next_permutation 会将其重置为最小排列。
如果你需要生成所有排列,并希望它们按字典序排序,那么可以使用 do-while 循环,如上面的示例所示。
如果你只想检查是否存在下一个排列,而不需要实际生成它,那么可以检查 next_permutation 的返回值。