Namespaces
Variants

std::partition_point

De fr.cppreference.net
 
 
Bibliothèque d'algorithmes
Algorithmes contraints et algorithmes sur plages (C++20)
Algorithmes contraints, par ex. ranges::copy, ranges::sort, ...
Opérations de séquence non modificatrices    
Opérations par lot
(C++17)
Opérations de recherche
Opérations de séquence modificatrices
Opérations de copie
(C++11)
(C++11)
Opérations d'échange
Opérations de transformation
Opérations de génération
Opérations de suppression
Opérations de changement d'ordre
(jusqu'à C++17)(C++11)
(C++20)(C++20)
Opérations d'échantillonnage
(C++17)

Opérations de tri et connexes
Opérations de partitionnement
(C++11)    

Opérations de tri
Opérations de recherche binaire
(sur des plages partitionnées)
Opérations d'ensemble (sur des plages triées)
Opérations de fusion (sur des plages triées)
Opérations de tas
Opérations de minimum/maximum
(C++11)
(C++17)
Opérations de comparaison lexicographique
Opérations de permutation


 
Défini dans l'en-tête <algorithm>
template< class ForwardIt, class UnaryPred >
ForwardIt partition_point( ForwardIt first, ForwardIt last, UnaryPred p );
(depuis C++11)
(constexpr depuis C++20)

Examine la plage partitionnée [firstlast) et localise la fin de la première partition, c'est-à-dire le premier élément qui ne satisfait pas p ou last si tous les éléments satisfont p.

Si les éléments elem de [firstlast) ne sont pas partitionnés par rapport à l'expression bool(p(elem)), le comportement est indéfini.

Paramètres

first, last - la paire d'itérateurs définissant la plage partitionnée range d'éléments à examiner
p - prédicat unaire qui retourne ​true pour les éléments trouvés au début de la plage.

L'expression p(v) doit être convertible en bool pour chaque argument v de type (peut-être const) VT, où VT est le type de valeur de ForwardIt, indépendamment de la catégorie de valeur, et ne doit pas modifier v. Ainsi, un type de paramètre de VT&n'est pas autorisé, ni VT sauf si pour VT un déplacement équivaut à une copie(depuis C++11). ​

Exigences de type
-
ForwardIt doit satisfaire aux exigences de LegacyForwardIterator.
-
UnaryPred doit satisfaire aux exigences de Predicate.

Valeur de retour

L'itérateur au-delà de la fin de la première partition dans [firstlast) ou last si tous les éléments satisfont p.

Complexité

Étant donné N comme std::distance(first, last), effectue O(log(N)) applications du prédicat p.

Notes

Cet algorithme est une forme plus générale de std::lower_bound, qui peut être exprimé en fonction de std::partition_point avec le prédicat [&](const auto& e) { return e < value; });.

Implémentation possible

template<class ForwardIt, class UnaryPred>
constexpr //< since 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;
}

Exemple

#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());
}

Sortie possible :

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

Voir aussi

trouve le premier élément satisfaisant des critères spécifiques
(modèle de fonction & objet fonction d'algorithme)
(C++11)
vérifie si une plage est triée
(modèle de fonction & objet fonction d'algorithme)
trouve le premier élément non inférieur à la valeur donnée en utilisant la recherche binaire
(modèle de fonction & objet fonction d'algorithme)
localise le point de partitionnement d'une plage partitionnée
(objet fonction d'algorithme)