名前空間
変種
操作

std::stable_partition

From cppreference.com
< cpp‎ | algorithm
 
 
アルゴリズムライブラリ
制約付きアルゴリズムとRangeアルゴリズム (C++20)
制約付きアルゴリズム、例: ranges::copy, ranges::sort, ...
実行ポリシー (C++17)
シーケンスを変更しない操作
一括操作
(C++17)
検索操作
(C++11)                (C++11)(C++11)

シーケンスを変更する操作
コピー操作
(C++11)
(C++11)
スワップ操作
変換操作
生成操作
削除操作
順序変更操作
(C++17まで)(C++11)
(C++20)(C++20)
サンプリング操作
(C++17)

ソートおよび関連操作
パーティション操作
(C++11)  
stable_partition
ソート操作
二分探索操作
(パーティション化された範囲)
集合操作 (ソート済み範囲)
マージ操作 (ソート済み範囲)
ヒープ操作
最小/最大操作
(C++11)
(C++17)
辞書順比較操作
順列操作
Cライブラリ
数値演算
未初期化メモリに対する操作
 
ヘッダー <algorithm> で定義
template< class BidirIt, class UnaryPred >
BidirIt stable_partition( BidirIt first, BidirIt last, UnaryPred p );
(1) (C++26 以降 constexpr)
template< class ExecutionPolicy, class BidirIt, class UnaryPred >

BidirIt stable_partition( ExecutionPolicy&& policy,

                          BidirIt first, BidirIt last, UnaryPred p );
(2) (C++17以降)
1) 要素を、述語 ptrue を返す要素が、述語 pfalse を返す要素の前に来るように、範囲 [firstlast) 内の要素を並べ替えます。要素の相対的な順序は保持されます。
2) (1) と同じですが、policy に従って実行されます。
このオーバーロードは、以下のすべての条件が満たされた場合にのみオーバーロード解決に参加します。

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>true である。

(C++20まで)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>true です。

(C++20以降)

次のいずれかの条件が満たされる場合、動作は未定義です。

  • *first の型は Swappable ではありません。
(C++11まで)
(C++11以降)

目次

[edit] パラメータ

first, last - 並べ替える要素の 範囲 を定義するイテレータのペア
policy - 使用する 実行ポリシー
p - 要素が他の要素より前に配置されるべき場合に ​true を返す単項述語。

p(v) は、VT の値型(const である可能性も含む)のすべての引数 v に対して、値カテゴリに関係なく bool に変換可能であり、v を変更してはなりません。したがって、パラメータ型 VT& は許可されません。また、VT も、VT に対してムーブがコピーと同等である場合を除き、許可されません(since C++11)

型要件
-
BidirItLegacyBidirectionalIterator の要件を満たしている必要があります。
-
UnaryPredPredicate の要件を満たさなければなりません。

[edit] 戻り値

2番目のグループの最初の要素へのイテレータ。

[edit] 計算量

std::distance(first, last)N とする

1) N 回の p の適用。
十分な空きメモリがある場合は O(N) 回のスワップ、それ以外の場合は最大 N⋅log2(N) 回のスワップ。
2) O(N) 回の p の適用。
N⋅log(N) 回のスワップ。

[edit] 例外

テンプレートパラメータ ExecutionPolicy を持つオーバーロードは、次のようにエラーを報告します。

  • アルゴリズムの一部として呼び出された関数の実行が例外をスローし、ExecutionPolicy標準ポリシー のいずれかである場合、std::terminate が呼び出されます。その他の ExecutionPolicy の場合、動作は実装定義です。
  • アルゴリズムがメモリの割り当てに失敗した場合、std::bad_alloc がスローされます。

[edit] 注記

この関数は一時バッファの割り当てを試みます。割り当てに失敗した場合、より効率の悪いアルゴリズムが選択されます。

libc++ および libstdc++ の実装では、拡張として LegacyForwardIterator で表される範囲も受け入れます。

機能テストマクロ 規格 機能
__cpp_lib_constexpr_algorithms 202306L (C++26) constexpr 安定ソート (1)

[edit]

#include <algorithm>
#include <iostream>
#include <vector>
 
int main()
{
    std::vector<int> v{0, 0, 3, -1, 2, 4, 5, 0, 7};
    std::stable_partition(v.begin(), v.end(), [](int n) { return n > 0; });
    for (int n : v)
        std::cout << n << ' ';
    std::cout << '\n';
}

出力

3 2 4 5 7 0 0 -1 0

[edit] 不具合報告

以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
LWG 2150 C++98 std::stable_partition は、p を満たす要素を1つ、p を満たさない要素の前に配置することのみが要求されていました。
要素が p を満たす場合、その要素は p を満たさない要素の前に配置されます。
修正されました。
要件

[edit] 関連項目

要素の範囲を2つのグループに分割する
(関数テンプレート) [編集]
相対的な順序を維持しながら要素を2つのグループに分割する
(アルゴリズム関数オブジェクト)[編集]
English 日本語 中文(简体) 中文(繁體)