std::stable_partition
| ヘッダ <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から) |
[first, last) 内の要素を、述語 p が true を返すすべての要素が、述語 p が false を返す要素よりも前に来るように並べ替えます。要素の相対順序は保持されます。policy に従って実行されます。true である場合にのみオーバーロード解決に参加します:
|
|
(C++20まで) |
|
|
(C++20から) |
次の条件のいずれかが満たされる場合、動作は未定義です:
|
(C++11まで) |
|
(C++11から) |
パラメータ
| first, last | - | 要素を並べ替える範囲を定義するイテレータのペア |
| policy | - | 使用する実行ポリシー |
| p | - |
要素が他の要素より前に順序付けられるべき場合に
true
を返す単項述語
式
p
(
v
)
は、
|
| 型要件 | ||
-
BidirIt
は
LegacyBidirectionalIterator
の要件を満たさなければならない
|
||
-
UnaryPred
は
Predicate
の要件を満たさなければならない
|
||
戻り値
2番目のグループの最初の要素へのイテレータ。
計算量
与えられた N を std:: distance ( first, last ) として:
例外
テンプレートパラメータExecutionPolicyを持つオーバーロードは、
以下のようにエラーを報告します:
-
アルゴリズムの一部として呼び出された関数の実行が例外をスローした場合、
ExecutionPolicyが 標準ポリシー のいずれかであるとき、 std::terminate が呼び出されます。その他のExecutionPolicyについては、動作は実装定義です。 - アルゴリズムがメモリの確保に失敗した場合、 std::bad_alloc がスローされます。
注記
この関数は一時バッファの割り当てを試みます。割り当てに失敗した場合、効率の低いアルゴリズムが選択されます。
libc++ および libstdc++ の実装では、拡張機能として LegacyForwardIterator s で示される範囲も受け入れます。
| 機能テスト マクロ | 値 | 標準 | 機能 |
|---|---|---|---|
__cpp_lib_constexpr_algorithms
|
202306L
|
(C++26) | constexpr 安定ソート ( 1 ) |
例
#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
欠陥報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| LWG 2150 | C++98 |
std::stable_partition
は条件を満たす1つの要素を
条件を満たさない1つの要素の前に配置する ことのみが要求されていた |
要件を修正 |
関連項目
| 範囲の要素を2つのグループに分割する (関数テンプレート & アルゴリズム関数オブジェクト) | |
(C++20) |
|
(C++20) |
要素を2つのグループに分割し、各グループ内での相対的な順序を保持する (アルゴリズム関数オブジェクト) |