std::stable_partition - cppreference.com (original) (raw)
Reorders the elements in the range
[first,last)in such a way that all elements for which the predicate p returns true precede the elements for which predicate p returns false. Relative order of the elements is preserved.Same as (1), but executed according to policy.
This overload participates in overload resolution only if all following conditions are satisfied:
If any of the following conditions is satisfied, the behavior is undefined:
Contents
[edit] Parameters
| first, last | - | the pair of iterators defining the range of elements to reorder |
|---|---|---|
| policy | - | the execution policy to use |
| p | - | unary predicate which returns true if the element should be ordered before other elements. 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 value category, 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). |
| Type requirements | ||
| -BidirIt must meet the requirements of LegacyBidirectionalIterator. | ||
| -UnaryPred must meet the requirements of Predicate. |
[edit] Return value
Iterator to the first element of the second group.
[edit] Complexity
Given \(\scriptsize N\)N as std::distance(first, last):
- Exactly \(\scriptsize N\)N applications of p.
\(\scriptsize O(N)\)O(N) swaps if there is enough extra memory, otherwise at most \(\scriptsize N \cdot log_{2}(N)\)N⋅log2(N) swaps.
- \(\scriptsize O(N)\)O(N) applications of p.
\(\scriptsize N \cdot log(N)\)N⋅log(N) swaps.
[edit] Exceptions
The overload with a template parameter named ExecutionPolicy reports errors as follows:
- If execution of a function invoked as part of the algorithm throws an exception and
ExecutionPolicyis one of the standard policies, std::terminate is called. For any otherExecutionPolicy, the behavior is implementation-defined. - If the algorithm fails to allocate memory, std::bad_alloc is thrown.
[edit] Notes
This function attempts to allocate a temporary buffer. If the allocation fails, the less efficient algorithm is chosen.
Implementations in libc++ and libstdc++ also accept ranges denoted by LegacyForwardIterators as an extension.
| Feature-test macro | Value | Std | Feature |
|---|---|---|---|
| __cpp_lib_constexpr_algorithms | 202306L | (C++26) | constexpr stable sorting (1) |
[edit] Example
#include #include #include int main() { std::vector 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'; }
Output:
[edit] Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 2150 | C++98 | std::stable_partition was only required to place oneelement satisfying p before one element not satisfying p | corrected therequirement |