必须先排序,因为next_permutation从当前排列找字典序下一个,若未从最小排列开始则会遗漏前面所有排列;正确做法是先sort再循环调用。

next_permutation 是 C++ 标准库中生成字典序下一个排列的函数,它不“生成全排列”,而是“就地推进到下一个排列”——你得自己循环调用它,从初始升序开始,直到返回 false 为止。
为什么第一次调用前必须排序?
next_permutation 假设输入是当前排列,然后按字典序找“严格大于它的最小排列”。如果数组不是升序起始(比如 {3,1,2}),它只会从这个状态往后推,跳过前面所有更小的排列,结果不全。
- 正确做法:先用
sort(v.begin(), v.end())把容器排成最小字典序 - 错误写法:
vector→ 只得到v = {2,1,3}; next_permutation(v.begin(), v.end()); {2,3,1},漏掉{1,2,3}、{1,3,2}等 - 注意:它只依赖元素的
比较,所以自定义类型要重载operator 或传比较器
怎么安全遍历全部排列?
标准写法是先排序,再用 do-while,因为第一个排列本身也要处理:
while (next_permutation(...))
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











