Namespaces
Variants

std::ranges::partition_point

De fr.cppreference.net
 
 
Bibliothèque d'algorithmes
Algorithmes contraints et algorithmes sur plages (C++20)
Algorithmes contraints, p.ex. ranges::copy, ranges::sort, ...
Opérations de séquence non modifiantes    
Opérations par lots
(C++17)
Opérations de recherche
Opérations de séquence modifiantes
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 assimilées
Opérations de partitionnement
(C++11)    

Opérations de tri
Opérations de recherche binaire
(sur plages partitionnées)
Opérations ensemblistes (sur plages triées)
Opérations de fusion (sur 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


 
Algorithmes contraints
Tous les noms de ce menu appartiennent à l'espace de noms std::ranges
Opérations de séquence non modifiantes
Opérations de séquence modifiantes
Opérations de partitionnement
Opérations de tri
Opérations de recherche binaire (sur plages triées)
       
       
Opérations ensemblistes (sur plages triées)
Opérations de tas
Opérations de minimum/maximum
       
       
Opérations de permutation
Opérations de pliage
Opérations sur le stockage non initialisé
Types de retour
 
Défini dans l'en-tête <algorithm>
Signature d'appel
template< std::forward_iterator I, std::sentinel_for<I> S,
          class Proj = std::identity,
          std::indirect_unary_predicate<std::projected<I, Proj>> Pred >
constexpr I
    partition_point( I first, S last, Pred pred, Proj proj = {} );
(1) (since C++20)
template< ranges::forward_range R,
          class Proj = std::identity,
          std::indirect_unary_predicate<
              std::projected<ranges::iterator_t<R>, Proj>> Pred >
constexpr ranges::borrowed_iterator_t<R>
    partition_point( R&& r, Pred pred, Proj proj = {} );
(2) (since C++20)

Examine la plage partitionnée (comme si par ranges::partition) la plage [firstlast) ou r et localise la fin de la première partition, c'est-à-dire l'élément projeté qui ne satisfait pas pred ou last si tous les éléments projetés satisfont pred.

Les entités de type fonction décrites sur cette page sont objets fonctions d'algorithmes (informellement connus sous le nom de niebloids), c'est-à-dire :

Paramètres

first, last - la paire itérateur-sentinelle définissant la plage partiellement ordonnée des éléments à examiner
r - la plage partiellement ordonnée à examiner
pred - prédicat à appliquer aux éléments projetés
proj - projection à appliquer aux éléments

Valeur de retour

L'itérateur après la fin de la première partition dans [ first , last ) ou l'itérateur égal à last si tous les éléments projetés satisfont pred .

Complexité

Étant donné N = ranges:: distance ( first, last ) , effectue O(log N) applications du prédicat pred et de la projection proj .

Cependant, si les sentinelles ne modélisent pas std:: sized_sentinel_for < I > , le nombre d'incrémentations d'itérateur est O(N) .

Notes

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

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::ranges::partition(v, is_even);
    print_seq("After partitioning, v: ", v.cbegin(), v.cend());
    const auto pp = std::ranges::partition_point(v, is_even);
    const auto i = std::ranges::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: 2 4 6 8 5 3 7 1 9
Partition point is at 4; v[4] = 5
First partition (all even elements): 2 4 6 8
Second partition (all odd elements): 5 3 7 1 9

Voir aussi

vérifie si une plage est triée
(objet fonction d'algorithme)
trouve le premier élément non inférieur à la valeur donnée en utilisant la recherche binaire
(objet fonction d'algorithme)
localise le point de partition d'une plage partitionnée
(modèle de fonction)