std:: prev_permutation
|
定义于头文件
<algorithm>
|
||
|
template
<
class
BidirIt
>
bool prev_permutation ( BidirIt first, BidirIt last ) ; |
(1) | (自 C++20 起为 constexpr) |
|
template
<
class
BidirIt,
class
Compare
>
bool prev_permutation ( BidirIt first, BidirIt last, Compare comp ) ; |
(2) | (自 C++20 起为 constexpr) |
将范围
[
first
,
last
)
转换为前一个
排列
。若存在这样的排列则返回
true
,否则将范围转换为最后一个排列(如同通过
std::sort
后接
std::reverse
实现)并返回
false
。
如果
*
first
的类型不满足
Swappable
要求
(C++11 前)
BidirIt
不满足
ValueSwappable
要求
(C++11 起)
,则行为未定义。
目录 |
参数
| first, last | - | 定义待排列元素 范围 的迭代器对 |
| comp | - |
比较函数对象(即满足
Compare
要求的对象),当第一个参数
小于
第二个参数时返回
true
。
比较函数的签名应等价于如下形式: bool cmp ( const Type1 & a, const Type2 & b ) ;
虽然签名不需要包含
const
&
,但函数不得修改传递给它的对象,且必须能够接受(可能为const的)
|
| 类型要求 | ||
-
BidirIt
必须满足
ValueSwappable
与
LegacyBidirectionalIterator
的要求。
|
||
返回值
若新排列在字典序中位于旧排列之前,则为 true 。若已到达首个排列且范围被重置为末位排列,则为 false 。
异常
任何从迭代器操作或元素交换抛出的异常。
复杂度
给定 \(\scriptsize N\) N 为 std:: distance ( first, last ) :
| N |
| 2 |
可能的实现
template<class BidirIt> bool prev_permutation(BidirIt first, BidirIt last) { if (first == last) return false; BidirIt i = last; if (first == --i) return false; while (1) { BidirIt i1, i2; i1 = i; if (*i1 < *--i) { i2 = last; while (!(*--i2 < *i)) ; std::iter_swap(i, i2); std::reverse(i1, last); return true; } if (i == first) { std::reverse(first, last); return false; } } } |
注释
在整个排列序列的平均情况下,典型实现每次调用大约使用3次比较和1.5次交换。
实现(例如
MSVC STL
)可在迭代器类型满足
LegacyContiguousIterator
且交换其值类型时既不调用非平凡特殊成员函数,也不调用
ADL
查找到的
swap
时启用向量化。
示例
以下代码按逆序输出字符串 "cab" 的全部六种排列。
#include <algorithm> #include <iostream> #include <string> int main() { std::string s = "cab"; do { std::cout << s << ' '; } while (std::prev_permutation(s.begin(), s.end())); std::cout << s << '\n'; }
输出:
cab bca bac acb abc cba
参见
|
(C++11)
|
判断一个序列是否为另一个序列的排列
(函数模板) |
|
生成元素范围的下一个更大字典序排列
(函数模板) |
|
|
(C++20)
|
生成元素范围的下一个更小字典序排列
(算法函数对象) |