Namespaces
Variants

std::next_permutation

ja.cppreference.net より
 
 
アルゴリズムライブラリ
制約付きアルゴリズムおよび範囲アルゴリズム (C++20)
制約付きアルゴリズム、例: ranges::copy , ranges::sort , ...
非変更シーケンス操作     
一括操作
(C++17)
検索操作
変更シーケンス操作
コピー操作
(C++11)
(C++11)
スワップ操作
変換操作
生成操作
削除操作
順序変更操作
(C++17まで) (C++11)
(C++20) (C++20)
サンプリング操作
(C++17)

ソートおよび関連操作
分割操作
(C++11)     

ソート操作
二分探索操作
(分割された範囲に対する)
集合操作 (ソート済み範囲に対して)
マージ操作 (ソート済み範囲に対して)
ヒープ操作
最小/最大操作
(C++11)
(C++17)
辞書順比較操作
順列操作


 
ヘッダで定義 <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 を返します。

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

型要件
-
BidirIt は LegacyBidirectionalIterator の要件を満たさなければならない。

戻り値

true 新しい順列が辞書順で前の順列より大きい場合。 false 最後の順列に到達し、範囲が最初の順列にリセットされた場合。

計算量

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

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

上記のコードブロックは翻訳対象外の要素のみを含んでいるため、日本語への翻訳は行われていません。

注記

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

関連項目

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