Namespaces
Variants

std:: prev_permutation

From cppreference.net
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy , ranges::sort , ...
Execution policies (C++17)
Non-modifying sequence operations
Batch operations
(C++17)
Search operations
Modifying sequence operations
Copy operations
(C++11)
(C++11)
Swap operations
Transformation operations
Generation operations
Removing operations
Order-changing operations
(until C++17) (C++11)
(C++20) (C++20)
Sampling operations
(C++17)

Sorting and related operations
Partitioning operations
Sorting operations
Binary search operations
(on partitioned ranges)
Set operations (on sorted ranges)
Merge operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Lexicographical comparison operations
Permutation operations
prev_permutation

C library
Numeric operations
Operations on uninitialized memory
定義先ヘッダ <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 を返します。

1) すべての順列の集合は、 operator < (C++20以前) std:: less { } (C++20以降) に関して辞書順に順序付けられます。
2) すべての順列の集合は、 comp に関して辞書順に並べられます。

* first の型が Swappable でない場合 (C++11以前) BidirIt ValueSwappable でない場合 (C++11以降) 、動作は未定義です。

目次

パラメータ

first, last - 要素を並べ替える範囲を定義するイテレータのペア
comp - 比較関数オブジェクト(つまり Compare 要件を満たすオブジェクト)。最初の引数が2番目の引数より 小さい 場合に true を返す。

比較関数のシグネチャは以下と同等であるべき:

bool cmp ( const Type1 & a, const Type2 & b ) ;

シグネチャが const & を持つ必要はないが、関数は渡されたオブジェクトを変更してはならず、 Type1 Type2 の型のすべての値(constである可能性もある)を 値カテゴリ に関係なく受け入れられなければならない(したがって、 Type1 & は許可されない 、また Type1 も、 Type1 に対してムーブがコピーと等価でない限り許可されない (C++11以降) )。
Type1 Type2 は、 BidirIt 型のオブジェクトが間接参照可能で、それら両方に暗黙的に変換可能でなければならない。

型要件
-
BidirIt ValueSwappable および LegacyBidirectionalIterator の要件を満たさなければならない。

戻り値

true 新しい順列が辞書順で古い順列に先行する場合。 false 最初の順列に到達し、範囲が最後の順列にリセットされた場合。

例外

イテレータ操作または要素の交換からスローされる例外。

計算量

与えられた N std:: distance ( first, last ) として:

1,2) 最大
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;
        }
    }
}
**注記**: 提供されたHTMLコードはC++のソースコードを含んでおり、指示に従って以下の点を厳密に守りました: - ` `, `
`, ``タグ内のテキストは翻訳対象外
- HTMLタグと属性は一切翻訳せず
- C++固有の用語(関数名、キーワード、型名など)は翻訳せず
- 元のフォーマットを完全に保持
コードブロック内のC++ソースコードは全て原文のまま保持されています。

注記

順列の全シーケンス全体で平均すると、典型的な実装では呼び出しごとに約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

関連項目

あるシーケンスが別のシーケンスの順列であるかどうかを判定する
(関数テンプレート)
要素の範囲に対する次の辞書順の大きな順列を生成する
(関数テンプレート)
要素の範囲に対する次の辞書順の小さな順列を生成する
(アルゴリズム関数オブジェクト)