From cppreference.com
Defined in header
template<classBidirIt,classUnaryPred>BidirItstable_partition(BidirItfirst,BidirItlast,UnaryPredp); (1)(constexpr since C++26)template<classExecutionPolicy,classBidirIt,classUnaryPred>BidirItstable_partition(ExecutionPolicy&&policy,BidirItfirst,BidirItlast,UnaryPredp); (2) (since C++17)1)
the elements e in the target range [first, last) with respect to the expression bool(p(e)): all elements satisfy p appear before all elements that do not. The relative order of the elements in both groups is preserved.
2) Same as (1), but executed according to policy.
This overload participates in overload resolution only if the value of the following expression is true:
std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>
(until C++20)std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>
(since C++20)If any of the following conditions is satisfied, the behavior is undefined:
Parameters
first, last - the pair of iterators defining the target
p - unary predicate which returns true for the elements before the partition point. The expression p(v) must be convertible to bool for every argument v of type (possibly const) VT, where VT is the value type of BidirIt, regardless of
, and must not modify v. Thus, a parameter type of VT&is not allowed, nor is VT unless for VT a move is equivalent to a copy(since C++11).
policy - the
to use Type requirements -BidirIt must meet the requirements of
. -UnaryPred must meet the requirements of
. Return value
The iterator iter indicating the partition point: all elements before iter satisfy p, while all elements starting from iter do not.
Complexity
Given N as std::distance(first,last):
1) At most N⋅log2(N) swaps (or only 𝓞(N) swaps if there is enough extra memory), and exactly N applications of p.
2)𝓞(N·log(N)) swaps, and 𝓞(N) applications of p.
Exceptions
2) During the execution process:
If the temporary memory resources required for parallelization are not available,
is thrown.
If an uncaught exception is thrown while accessing objects via an algorithm argument, the behavior is determined by the execution policy (for
,
is invoked).
Notes
This function attempts to allocate a temporary buffer. If the allocation fails, the less efficient algorithm is chosen.
Implementations in
and
also accept ranges denoted by
as an extension.
macroValueStdFeature
__cpp_lib_constexpr_algorithms
(C++26)constexpr stable sorting (
)Example
Run this code
#include<algorithm>#include<print>#include<vector>intmain(){std::vector<int>v{0,0,3,-1,2,4,5,0,7};std::stable_partition(v.begin(),v.end(),[](intn){returnn>0;});std::println("v = {}",v);}Output:
v = [3, 2, 4, 5, 7, 0, 0, -1, 0] Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR Applied to Behavior as published Correct behavior
C++98 std::stable_partition was only required to place one
element satisfying p before one element not satisfying pcorrected the
requirement See also