std::prev_permutation 返回 false 且不修改序列,是因为当前序列已是字典序最小排列(如{1,2,3}),它仅生成前一个合法排列,不绕回最大排列。

std::prev_permutation 为什么返回 false 却没变出上一个排列
根本原因:它只对「当前序列的字典序前一个排列」有效,且要求输入序列本身是某个排列的「合法中间态」。如果当前序列已是字典序最小(如 {1,2,3}),调用 std::prev_permutation 不会修改容器,直接返回 false。
常见错误现象:
std::vector<int> v = {1,2,3};
bool ok = std::prev_permutation(v.begin(), v.end()); // ok == false,v 仍是 {1,2,3}</int>
这不是 bug,是设计行为——它不负责“绕回”到最大排列(比如 {3,2,1}),那得你自己处理。
- 必须确保容器元素支持
比较,且已按升序/降序排好基础结构 - 若想枚举全部排列(含“绕回”),应先用
std::sort得到最大排列,再反复调用prev_permutation - 它修改的是原容器,不是返回新排列;别误以为它像 Python 的
itertools.permutations那样惰性生成
如何用 std::prev_permutation 枚举所有排列(从大到小)
关键步骤是「先排成最大字典序,再持续求前一个」。这和 next_permutation(从小到大)正好对称。
3 2 1
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











