在C++开发中,生成一组元素的所有全排列是很多算法场景下的基础需求,比如组合优化、密码枚举、状态遍历等。STL标准库提供的next_permutation函数可以快速实现这个功能,不需要开发者手动编写复杂的递归逻辑。

next_permutation函数基本说明
next_permutation是C++标准库<algorithm>头文件中的函数,作用是生成当前序列的下一个排列,按照字典序升序排列。它的函数原型如下:
#include <algorithm> // 两个迭代器版本,使用默认小于比较 template<class BidirectionalIterator> bool next_permutation(BidirectionalIterator first, BidirectionalIterator last); // 三个迭代器版本,使用自定义比较函数 template<class BidirectionalIterator, class Compare> bool next_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp);
函数的两个参数first和last表示需要生成全排列的区间,是左闭右开区间[first, last)。返回值类型是bool,如果存在下一个排列,函数会将区间内的元素调整为下一个排列并返回true;如果当前已经是最后一个排列(字典序最大的排列),函数会将区间内的元素重置为第一个排列(字典序最小的排列)并返回false。
基础用法示例
下面是最简单的使用示例,对一个数组生成所有全排列:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
vector<int> nums = {1, 2, 3};
// 先排序,保证从第一个排列开始
sort(nums.begin(), nums.end());
cout << "所有全排列结果:" << endl;
do {
for (int num : nums) {
cout << num << " ";
}
cout << endl;
} while (next_permutation(nums.begin(), nums.end()));
return 0;
}
这段代码的输出结果是1 2 3、1 3 2、2 1 3、2 3 1、3 1 2、3 2 1,共6种排列,符合3个元素的全排列总数。需要注意的是,使用next_permutation前最好先对序列排序,否则只会输出当前序列之后的排列,可能遗漏前面的排列。
自定义比较函数的用法
如果序列中的元素不是基本类型,或者需要按照自定义的规则生成排列,可以使用带比较函数的版本。比如下面的例子对字符串按照长度降序生成排列:
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;
// 自定义比较函数,按字符串长度降序
bool cmp(const string& a, const string& b) {
return a.size() > b.size();
}
int main() {
vector<string> strs = {"a", "bb", "ccc"};
// 先按自定义规则排序,得到第一个排列
sort(strs.begin(), strs.end(), cmp);
cout << "自定义规则下的全排列:" << endl;
do {
for (const string& s : strs) {
cout << s << " ";
}
cout << endl;
} while (next_permutation(strs.begin(), strs.end(), cmp));
return 0;
}
输出结果会按照字符串长度从长到短的顺序生成所有排列,符合自定义的比较规则。
手动实现全排列的递归方法
如果不想依赖STL函数,也可以手动用递归实现全排列,核心思路是固定第一个位置的元素,然后递归生成剩余元素的全排列,直到只剩下一个元素。示例代码如下:
#include <iostream>
#include <vector>
using namespace std;
void permute(vector<int>& nums, int start, vector<vector<int>>& res) {
if (start == nums.size() - 1) {
res.push_back(nums);
return;
}
for (int i = start; i < nums.size(); i++) {
// 交换当前位置和i位置的元素
swap(nums[start], nums[i]);
// 递归生成剩余元素的排列
permute(nums, start + 1, res);
// 回溯,恢复原来的顺序
swap(nums[start], nums[i]);
}
}
int main() {
vector<int> nums = {1, 2, 3};
vector<vector<int>> res;
permute(nums, 0, res);
cout << "手动递归实现的全排列:" << endl;
for (const auto& v : res) {
for (int num : v) {
cout << num << " ";
}
cout << endl;
}
return 0;
}
两种实现方式对比
| 实现方式 | 优点 | 缺点 |
|---|---|---|
| next_permutation函数 | 代码简洁,不需要手动处理递归和回溯,不易出错,效率高 | 依赖STL库,自定义排列规则需要额外写比较函数 |
| 手动递归实现 | 逻辑灵活,可自由控制排列的生成过程,不依赖外部库 | 代码复杂度高,容易写错回溯逻辑,效率略低于STL实现 |
实际开发中,如果没有特殊需求,优先使用next_permutation函数实现全排列,能大幅减少代码量和出错概率。如果需要定制非常特殊的排列逻辑,再考虑手动实现递归方案。
next_permutationC++全排列STL修改时间:2026-07-06 11:57:28