std::is_partitioned
From cppreference.com
| Defined in header <algorithm>
|
||
template< class InputIt, class UnaryPred >
bool is_partitioned( InputIt first, InputIt last, UnaryPred p );
|
(1) | (since C++11) (constexpr since C++20) |
template< class ExecutionPolicy, class ForwardIt, class UnaryPred >
bool is_partitioned( ExecutionPolicy&& policy,
ForwardIt first, ForwardIt last, UnaryPred p );
|
(2) | (since C++17) |
1) Checks whether the elements
e in the source range [first, last) are partitioned with respect to the expression bool(p(e)): all elements satisfy p appear before all elements that do not.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:
|
|
(until C++20) |
|
|
(since C++20) |
Contents
Parameters
| first, last | - | the pair of iterators defining the source range |
| p | - | unary predicate which returns true for the elements before the partition point. The expression |
| policy | - | the execution policy to use |
| Type requirements | ||
-InputIt must meet the requirements of LegacyInputIterator.
| ||
-ForwardIt must meet the requirements of LegacyForwardIterator. and its value type must be convertible to UnaryPred's parameter type.
| ||
-UnaryPred must meet the requirements of Predicate.
|
Return value
true if the elements of the source range are partiationed as descibed above or the source range is empty, false otherwise.
Complexity
Given N as std::distance(first, last):
1) At most N applications of
p.2) 𝓞(N) applications of
p.Exceptions
2) During the execution process:
- If the temporary memory resources required for parallelization are not available, std::bad_alloc is thrown.
- If an uncaught exception is thrown while accessing objects via an algorithm argument, the behavior is determined by the execution policy (for standard policies, std::terminate is invoked).
Possible implementation
template<class InputIt, class UnaryPred>
bool is_partitioned(InputIt first, InputIt last, UnaryPred p)
{
for (; first != last; ++first)
if (!p(*first))
break;
for (; first != last; ++first)
if (p(*first))
return false;
return true;
}
|
Example
Run this code
#include <algorithm>
#include <array>
#include <iostream>
int main()
{
std::array<int, 9> v{1, 2, 3, 4, 5, 6, 7, 8, 9};
auto is_even = [](int i) { return i % 2 == 0; };
std::cout.setf(std::ios_base::boolalpha);
std::cout << std::is_partitioned(v.begin(), v.end(), is_even) << ' ';
std::partition(v.begin(), v.end(), is_even);
std::cout << std::is_partitioned(v.begin(), v.end(), is_even) << ' ';
std::reverse(v.begin(), v.end());
std::cout << std::is_partitioned(v.cbegin(), v.cend(), is_even) << ' ';
std::cout << std::is_partitioned(v.crbegin(), v.crend(), is_even) << '\n';
}
Output:
false true false true
See also
(C++20) |
determines if the range is partitioned by the given predicate (algorithm function object) |
| divides a range of elements into two groups (function template & algorithm function object) | |
(C++20) |
|
(C++11) |
locates the partition point of a partitioned range (function template & algorithm function object) |
(C++20) |