next_permutation只计算当前排列的字典序后继,非全排列生成;必须先sort排序,否则跳过更小排列;含重复元素时自动去重;vector比原生数组更安全;需包含且用可修改迭代器。

为什么 next_permutation 不按你预期生成字典序?
它只对「当前排列」做一次字典序后继计算,不是从头生成全部排列。如果你传入的数组不是升序起始状态(比如 {3,1,2}),它会跳过前面所有更小的排列,直接返回下一个合法后继——这常被误认为“漏了排列”或“顺序乱”。
- 必须先对容器排序(
std::sort),否则next_permutation只在当前局部有序范围内工作 - 函数返回
false表示已到字典序最大排列(如降序),此时不会修改原序列 - 对含重复元素的序列(如
{1,1,2}),它仍能正确去重生成唯一字典序排列,无需额外处理
next_permutation 在 vector 和 array 上的行为差异
行为一致,但初始化和迭代方式影响出错概率。用 std::vector 更安全:可动态排序、长度明确;用原生 array 或 C 风格数组时,容易传错迭代器范围。
- 正确写法:
next_permutation(v.begin(), v.end()) - 错误高发点:对
int arr[3]写成next_permutation(arr, arr+2)(少算一个元素) -
std::array需显式用arr.begin(), arr.end(),不能直接传arr - 性能无实质差异,但
vector的begin()/end()更难写错
遇到 “no matching function” 编译错误怎么办?
基本是迭代器类型不匹配或没包含头文件。这个错误不报在 next_permutation 调用行,而是在模板实例化失败处,容易定位偏移。
- 确认已
#include <algorithm></algorithm>—— 少这一行是最高频原因 - 检查容器元素是否支持
比较:自定义 struct 必须重载 <code>operator,且应为 <code>const成员函数 - 避免用
const_iterator调用:该函数需要可修改的双向迭代器,cbegin()会编译失败 - 字符串特例:用
std::string直接调没问题,但const char*必须转成std::string或std::vector<char></char>
想生成全部排列却死循环或少输出?
典型写法是先排序,再用 do-while 循环,但很多人用 while + 一次调用,导致首项丢失或末项重复。
立即学习“C++免费学习笔记(深入)”;
- 安全模式:
sort(v.begin(), v.end()); do { // 处理 v } while (next_permutation(v.begin(), v.end())); - 错误模式:
while (next_permutation(...)) { /* 处理 */ }—— 会跳过初始排序后的第一种排列 - 如果需逆字典序,先降序排序,再用
prev_permutation,别试图反转结果 - 大数据量(n > 10)时注意阶乘爆炸,
next_permutation本身很快,但循环体里的操作可能成瓶颈
实际用的时候,最常卡住的不是算法逻辑,而是忘记排序、传错迭代器边界、或者把 while 写成 do-while 的反向习惯。这几个点错一个,输出就对不上眼。










