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の要件を満たすオブジェクト)。最初の引数が2番目の引数より小さい場合にtrueを返す。 比較関数のシグネチャは、以下と同等でなければならない。 bool cmp(const Type1& a, const Type2& b); シグネチャにconst&は必須ではないが、関数は渡されたオブジェクトを変更してはならず、値カテゴリに関係なく、 |
| 型要件 | ||
-BidirIt は、ValueSwappable および LegacyBidirectionalIterator の要件を満たす必要があります。 | ||
[編集] 戻り値
新しい順列が辞書順で古い順列より前にある場合は true を返します。最初の順列に到達し、範囲が最後の順列にリセットされた場合は false を返します。
[編集] 例外
イテレータ操作または要素のスワップからスローされるすべての例外。
[編集] 計算量
std::distance(first, last) を N とする
| 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) |
要素の範囲の次に小さい辞書順の順列を生成する (アルゴリズム関数オブジェクト) |