Spec-Zone.ru › C++

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)
1) Проверяет, разбит ли [first, last) предикатом p: все элементы, удовлетворяющие p, расположены перед всеми элементами, которые ему не удовлетворяют.
2) То же, что и (1), но выполняется в соответствии с policy.
Эта перегрузка участвует в разрешении перегрузки, только если значение следующего выражения равно true:

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>

(до C++20)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>

(начиная с C++20)

Параметры

first, last - пара итераторов, задающих диапазон проверяемых элементов
policy - политика выполнения, которую следует использовать
p - унарный предикат, возвращающий ​true для элементов, которые должны находиться в начале диапазона.

Для каждого аргумента v типа (возможно, const) VT, где VT — тип значения InputIt, выражение p(v) должно быть преобразуемо в bool независимо от категории значения и не должно изменять v. Таким образом, тип параметра VT&не допускается; также не допускается VT, если только для VT перемещение не эквивалентно копированию(начиная с C++11). ​

Требования к типам
-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

См. также

partition
разделяет диапазон элементов на две группы
(шаблон функции и функциональный объект алгоритма)
ranges::partition
(C++20)
partition_point
(C++11)
находит точку разделения в разбитом на группы диапазоне
(шаблон функции и функциональный объект алгоритма)
ranges::partition_point
(C++20)
ranges::is_partitioned
(C++20)
проверяет, разбит ли диапазон на группы заданным предикатом
(функциональный объект алгоритма)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/algorithm/is_partitioned

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API