std::is_partitioned
Объявлено в заголовочном файле <algorithm> | ||
|---|---|---|
template< class InputIt, class UnaryPred > bool is_partitioned( InputIt first, InputIt last, UnaryPred p ); | (1) | (начиная с C++11) (constexpr начиная с C++20) |
template< class ExecutionPolicy, class ForwardIt, class UnaryPred >
bool is_partitioned( ExecutionPolicy&& policy,
ForwardIt first, ForwardIt last, UnaryPred p );
| (2) | (начиная с C++17) |
[first, last) предикатом p: все элементы, удовлетворяющие p, расположены перед всеми элементами, которые ему не удовлетворяют.policy.true: |
| (до C++20) |
|
| (начиная с C++20) |
Параметры
| first, last | - | пара итераторов, задающих диапазон проверяемых элементов |
| policy | - | политика выполнения, которую следует использовать |
| p | - | унарный предикат, возвращающий true для элементов, которые должны находиться в начале диапазона. Для каждого аргумента |
| Требования к типам | ||
-InputIt должен соответствовать требованиям LegacyInputIterator. |
||
-ForwardIt должен соответствовать требованиям LegacyForwardIterator, а его тип значения должен быть преобразуем в тип параметра UnaryPred. |
||
-UnaryPred должен соответствовать требованиям Predicate. |
||
Возвращаемое значение
true, если элементы e из [first, last) разбиты на группы относительно выражения p(e). В противном случае — false.
Сложность
Не более std::distance(first, last) применений p.
Исключения
Перегрузка с параметром шаблона с именем ExecutionPolicy сообщает об ошибках следующим образом:
- Если при выполнении функции, вызванной в рамках алгоритма, выбрасывается исключение и
ExecutionPolicyявляется одной из стандартных политик, вызываетсяstd::terminate. Для любого другогоExecutionPolicyповедение определяется реализацией. - Если алгоритму не удаётся выделить память, выбрасывается
std::bad_alloc.
Возможная реализация
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;
}
|
Пример
#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';
}
Вывод:
false true false true
См. также
| разделяет диапазон элементов на две группы (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) | |
|
(C++11) | находит точку разделения в разбитом на группы диапазоне (шаблон функции и функциональный объект алгоритма) |
|
(C++20) | |
|
(C++20) | проверяет, разбит ли диапазон на группы заданным предикатом (функциональный объект алгоритма) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/algorithm/is_partitioned