Spec-Zone.ru › C++

std::is_partitioned

Определено в заголовке <algorithm>
(1)
template< class InputIt, class UnaryPredicate >
bool is_partitioned( InputIt first, InputIt last, UnaryPredicate p );
(с C++11)
(до C++20)
template< class InputIt, class UnaryPredicate >
constexpr bool is_partitioned( InputIt first, InputIt last, UnaryPredicate p );
(с C++20)
template< class ExecutionPolicy, class ForwardIt, class UnaryPredicate >
bool is_partitioned( ExecutionPolicy&& policy,
                     ForwardIt first, ForwardIt last, UnaryPredicate p );
(2) (с C++17)
1) Возвращает true , если все элементы в диапазоне [first, last) , удовлетворяющие предикату p , предшествуют всем элементам, которые не удовлетворяют ему. Также возвращает true , если [first, last) пустой.
2) То же, что и (1), но выполняется согласно policy. Эта перегрузка не участвует в разрешении перегрузки, если

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> является true.

(до C++20)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> является true.

(с C++20)

Параметры

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

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

Требования к типу
-InputIt должно удовлетворять требованиям LegacyInputIterator.
-ForwardIt должно удовлетворять требованиям LegacyForwardIterator. и его тип значения должен быть приводим к типу аргумента UnaryPredicate.
-UnaryPredicate должно удовлетворять требованиям Predicate.

Возвращаемое значение

true , если диапазон [first, last) пустой или разбит предикатом p. false в противном случае.

Сложность

Максимально std::distance(first, last) применений p.

Исключения

Перегрузка с параметром шаблона под названием ExecutionPolicy сообщает об ошибках следующим образом:

  • Если выполнение функции, вызванной как часть алгоритма, вызывает исключение, и ExecutionPolicy является одной из стандартных политик, std::terminate вызывается. Для любой другой ExecutionPolicy, поведение определяется реализацией.
  • Если алгоритм не может выделить память, std::bad_alloc выбрасывается.

Возможная реализация

template<class InputIt, class UnaryPredicate>
bool is_partitioned(InputIt first, InputIt last, UnaryPredicate 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
разделяет диапазон элементов на две группы
(функция-шаблон)
partition_point
(C++11)
находит точку разбиения разделяемого диапазона
(функция-шаблон)
ranges::is_partitioned
(C++20)
определяет, является ли диапазон разделяемым данным предикатом
(niebloid)

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

Spec-Zone.ru

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