std::next_permutation
| ヘッダで定義
<algorithm>
|
||
template< class BidirIt >
bool next_permutation( BidirIt first, BidirIt last );
|
(1) | (constexpr C++20から) |
template< class BidirIt, class Compare >
bool next_permutation( BidirIt first, BidirIt last, Compare comp );
|
(2) | (constexpr C++20から) |
範囲 [first, last) を次の 順列 に並べ替えます。そのような「次の順列」が存在する場合は true を返し、そうでない場合は範囲を辞書順で最初の順列 (昇順) に変換して false を返します。
operator<(C++20まで) および std::less{}(C++20から) に関して辞書順に並べられます。
comp に関して辞書順に並べられます。
もし の型が *first でない Swappable(C++11まで)BidirIt でない ValueSwappable(C++11から)、動作は未定義です。
パラメータ
| first, last | - | 要素を並べ替える範囲を定義するイテレータのペア |
| comp | - |
比較関数オブジェクト(つまり
Compare
の要件を満たすオブジェクト)。最初の引数が2番目の引数より
小さい
場合に
true
を返す。
比較関数のシグネチャは以下と同等であるべき: bool cmp ( const Type1 & a, const Type2 & b ) ;
シグネチャが
const
&
を持つ必要はないが、関数は渡されたオブジェクトを変更してはならず、
値カテゴリ
に関係なく型(おそらくconst)
|
| 型要件 | ||
-
BidirIt
は
LegacyBidirectionalIterator
の要件を満たさなければならない。
|
||
戻り値
true 新しい順列が辞書順で前の順列より大きい場合。 false 最後の順列に到達し、範囲が最初の順列にリセットされた場合。
計算量
与えられた N を std:: distance ( first, last ) として:
| N |
| 2 |
例外
イテレータ操作または要素の交換からスローされる例外。
実装例
template<class BidirIt> bool next_permutation(BidirIt first, BidirIt last) { auto r_first = std::make_reverse_iterator(last); auto r_last = std::make_reverse_iterator(first); auto left = std::is_sorted_until(r_first, r_last); if (left != r_last) { auto right = std::upper_bound(r_first, left, *left); std::iter_swap(left, right); } std::reverse(left.base(), last); return left != r_last; } |
`, ``, `
注記
順列の全シーケンスにわたって平均すると、典型的な実装では呼び出しごとに約3回の比較と1.5回のスワップが使用されます。
実装(例:
MSVC STL
)は、イテレータ型が
LegacyContiguousIterator
を満たし、その値型の交換が非自明な特殊メンバ関数も
ADL
で見つかった
swap
も呼び出さない場合に、ベクトル化を有効化する可能性があります。
例
以下のコードは、文字列 "aba" の3つの順列をすべて出力します。
#include <algorithm> #include <iostream> #include <string> int main() { std::string s = "aba"; do { std::cout << s << '\n'; } while (std::next_permutation(s.begin(), s.end())); std::cout << s << '\n'; }
出力:
aba baa aab
関連項目
(C++11) |
シーケンスが別のシーケンスの置換であるかどうかを判定する (関数テンプレート & アルゴリズム関数オブジェクト) |
(C++20) |
|
| 範囲の要素の辞書順で次に小さい置換を生成する (関数テンプレート & アルゴリズム関数オブジェクト) | |
(C++20) |
|
(C++20) |
範囲の要素の辞書順で次に大きい置換を生成する (アルゴリズム関数オブジェクト) |