std:: prev_permutation
|
定義先ヘッダ
<algorithm>
|
||
|
template
<
class
BidirIt
>
bool prev_permutation ( BidirIt first, BidirIt last ) ; |
(1) | (constexpr since C++20) |
|
template
<
class
BidirIt,
class
Compare
>
bool prev_permutation ( BidirIt first, BidirIt last, Compare comp ) ; |
(2) | (constexpr since C++20) |
範囲
[
first
,
last
)
を前の
順列
に変換します。そのような順列が存在する場合は
true
を返し、それ以外の場合は範囲を最後の順列(
std::sort
と
std::reverse
を適用した場合と同様)に変換して
false
を返します。
*
first
の型が
Swappable
でない場合
(C++11以前)
BidirIt
が
ValueSwappable
でない場合
(C++11以降)
、動作は未定義です。
目次 |
パラメータ
| first, last | - | 要素を並べ替える範囲を定義するイテレータのペア |
| comp | - |
比較関数オブジェクト(つまり
Compare
要件を満たすオブジェクト)。最初の引数が2番目の引数より
小さい
場合に
true
を返す。
比較関数のシグネチャは以下と同等であるべき: bool cmp ( const Type1 & a, const Type2 & b ) ;
シグネチャが
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" の6つの順列すべてを逆順に出力します。
#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)
|
要素の範囲に対する次の辞書順の小さな順列を生成する
(アルゴリズム関数オブジェクト) |