std::stable_partition
來自 cppreference.com
定義於標頭檔案 <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, |
(2) | (C++17 起) |
1) 重新排列範圍
[
first,
last)
中的元素,使得謂詞 p 返回 true 的所有元素都在謂詞 p 返回 false 的元素之前。元素間的相對順序保持不變。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 起) |
如果滿足以下任何條件,則行為是未定義的:
|
(C++11 前) |
|
(C++11 起) |
目錄 |
[編輯] 引數
first, last | - | 定義要重新排序的元素範圍的迭代器對 |
policy | - | 要使用的 執行策略 |
p | - | 一元謂詞,若元素應排在其他元素之前則返回 true。 表示式 p(v) 必須可轉換為 bool,對於型別為 (可能為 const) |
型別要求 | ||
-BidirIt 必須滿足 舊版雙向迭代器 (LegacyBidirectionalIterator) 的要求。 | ||
-UnaryPred 必須滿足 Predicate 的要求。 |
[編輯] 返回值
指向第二組第一個元素的迭代器。
[編輯] 複雜度
給定 N 作為 std::distance(first, last)
1) 對 p 進行精確 N 次呼叫。
如果有足夠的額外記憶體,則進行 O(N) 次交換,否則最多 N⋅log2(N) 次交換。
2) 對 p 進行 O(N) 次呼叫。
N⋅log(N) 次交換。
[編輯] 異常
帶有名為 ExecutionPolicy
的模板引數的過載會按如下方式報告錯誤:
- 如果作為演算法一部分呼叫的函式執行時丟擲異常且
ExecutionPolicy
是標準策略之一,則呼叫 std::terminate。對於任何其他ExecutionPolicy
,行為是實現定義的。 - 如果演算法未能分配記憶體,則丟擲 std::bad_alloc。
[編輯] 注意
此函式嘗試分配臨時緩衝區。如果分配失敗,則選擇效率較低的演算法。
libc++ 和 libstdc++ 中的實現也作為擴充套件接受由舊版前向迭代器 (LegacyForwardIterator) 表示的範圍。
特性測試宏 | 值 | 標準 | 特性 |
---|---|---|---|
__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++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
LWG 2150 | C++98 | std::stable_partition 只要求將一個滿足 p 的元素放在一個不滿足 p 的元素之前 |
已更正 要求 |
[編輯] 參閱
將一個範圍的元素分成兩組 (函式模板) | |
(C++20) |
將元素分成兩組,同時保留它們的相對順序 (演算法函式物件) |