| Defined in header <algorithm> | ||
|---|---|---|
template< class BidirIt, class UnaryPredicate > BidirIt stable_partition( BidirIt first, BidirIt last, UnaryPredicate p ); |
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.
Parameters
| first, last | - | the range of elements to reorder |
| p | - | unary predicate which returns true if the element should be ordered before other elements. The signature of the predicate function should be equivalent to the following:
The signature does not need to have |
| Type requirements | ||
- BidirIt must meet the requirements of ValueSwappable and BidirectionalIterator. | ||
-The type of dereferenced BidirIt must meet the requirements of MoveAssignable and MoveConstructible. | ||
- UnaryPredicate must meet the requirements of Predicate. | ||
Return value
Iterator to the first element of the second group.
Complexity
Exactly last-first applications of the predicate and at most (last-first)*log(last-first) swaps if there is insufficient memory or linear number of swaps if sufficient memory is available.
Notes
This function attempts to allocate a temporary buffer, typically by calling std::get_temporary_buffer. If the allocation fails, the less efficient algorithm is chosen.
Example
#include <iostream>
#include <algorithm>
#include <vector>
int main()
{
std::vector<int> v{0, 0, 3, 0, 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:
3 2 4 5 7 0 0 0 0
See also
| divides a range of elements into two groups (function template) | |
| std::experimental::parallel::stable_partition
(parallelism TS) | parallelized version of std::stable_partition (function template) |
Please login to continue.