名稱空間
變體
操作

std::stable_partition

來自 cppreference.com
< cpp‎ | 演算法
 
 
演算法庫
有約束演算法與針對範圍的演算法 (C++20)
有約束的演算法,例如 ranges::copyranges::sort 等……
執行策略 (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) 重新排列範圍 [firstlast) 中的元素,使得謂詞 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) VT 的每個引數 v,其中 VTBidirIt 的值型別,無論其值類別如何,且不得修改 v。因此,不允許引數型別為 VT&,除非對於 VT,移動等同於複製,否則也不允許 VT(C++11 起)

型別要求
-
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 的元素之前
已更正
要求

[編輯] 參閱

將一個範圍的元素分成兩組
(函式模板) [編輯]
將元素分成兩組,同時保留它們的相對順序
(演算法函式物件)[編輯]