Namespaces
Variants

std:: partition_point

From cppreference.net
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy , ranges::sort , ...
Execution policies (C++17)
Non-modifying sequence operations
Batch operations
(C++17)
Search operations
Modifying sequence operations
Copy operations
(C++11)
(C++11)
Swap operations
Transformation operations
Generation operations
Removing operations
Order-changing operations
(until C++17) (C++11)
(C++20) (C++20)
Sampling operations
(C++17)

Sorting and related operations
Partitioning operations
partition_point
(C++11)

Sorting operations
Binary search operations
(on partitioned ranges)
Set operations (on sorted ranges)
Merge operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Lexicographical comparison operations
Permutation operations
C library
Numeric operations
Operations on uninitialized memory
Definido en el encabezado <algorithm>
template < class ForwardIt, class UnaryPred >
ForwardIt partition_point ( ForwardIt first, ForwardIt last, UnaryPred p ) ;
(desde C++11)
(constexpr desde C++20)

Examina el rango particionado [ first , last ) y localiza el final de la primera partición, es decir, el primer elemento que no satisface p o last si todos los elementos satisfacen p .

Si los elementos elem de [ first , last ) no están particionados con respecto a la expresión bool ( p ( elem ) ) , el comportamiento es indefinido.

Contenidos

Parámetros

first, last - el par de iteradores que define el rango particionado de elementos a examinar
p - predicado unario que devuelve ​ true para los elementos encontrados al inicio del rango.

La expresión p ( v ) debe ser convertible a bool para cada argumento v de tipo (posiblemente const) VT , donde VT es el tipo de valor de ForwardIt , independientemente de la categoría de valor , y no debe modificar v . Por lo tanto, no se permite un tipo de parámetro VT & , ni VT a menos que para VT un movimiento sea equivalente a una copia (since C++11) . ​

Requisitos de tipo
-
ForwardIt debe cumplir con los requisitos de LegacyForwardIterator .
-
UnaryPred debe cumplir con los requisitos de Predicate .

Valor de retorno

El iterador después del final de la primera partición dentro de [ first , last ) o last si todos los elementos satisfacen p .

Complejidad

Dado N como std:: distance ( first, last ) , realiza O(log(N)) aplicaciones del predicado p .

Notas

Este algoritmo es una forma más general de std::lower_bound , que puede expresarse en términos de std::partition_point con el predicado [ & ] ( const auto & e ) { return e < value ; } ) ; .

Implementación posible

template<class ForwardIt, class UnaryPred>
constexpr //< desde C++20
ForwardIt partition_point(ForwardIt first, ForwardIt last, UnaryPred p)
{
    for (auto length = std::distance(first, last); 0 < length; )
    {
        auto half = length / 2;
        auto middle = std::next(first, half);
        if (p(*middle))
        {
            first = std::next(middle);
            length -= (half + 1);
        }
        else
            length = half;
    }
    return first;
}

Ejemplo

#include <algorithm>
#include <array>
#include <iostream>
#include <iterator>
auto print_seq = [](auto rem, auto first, auto last)
{
    for (std::cout << rem; first != last; std::cout << *first++ << ' ') {}
    std::cout << '\n';
};
int main()
{
    std::array v{1, 2, 3, 4, 5, 6, 7, 8, 9};
    auto is_even = [](int i) { return i % 2 == 0; };
    std::partition(v.begin(), v.end(), is_even);
    print_seq("After partitioning, v: ", v.cbegin(), v.cend());
    const auto pp = std::partition_point(v.cbegin(), v.cend(), is_even);
    const auto i = std::distance(v.cbegin(), pp);
    std::cout << "Partition point is at " << i << "; v[" << i << "] = " << *pp << '\n';
    print_seq("First partition (all even elements): ", v.cbegin(), pp);
    print_seq("Second partition (all odd elements): ", pp, v.cend());
}

Salida posible:

After partitioning, v: 8 2 6 4 5 3 7 1 9
Partition point is at 4; v[4] = 5
First partition (all even elements): 8 2 6 4
Second partition (all odd elements): 5 3 7 1 9

Véase también

encuentra el primer elemento que satisface criterios específicos
(plantilla de función)
(C++11)
verifica si un rango está ordenado en orden ascendente
(plantilla de función)
devuelve un iterador al primer elemento no menor que el valor dado
(plantilla de función)
localiza el punto de partición de un rango particionado
(objeto función de algoritmo)