Namespaces
Variants

std::ranges::binary_search

Depuis fr.cppreference.net
 
 
Bibliothèque d'algorithmes
Algorithmes contraints et algorithmes sur les plages (C++20)
Algorithmes contraints, ex. ranges::copy, ranges::sort, ...
Opérations de séquence non modificatrices    
Opérations par lots
(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
(until C++17)(C++11)
(C++20)(C++20)
Opérations d'échantillonnage
(C++17)

Tri et opérations 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


 
Algorithmes contraints
Tous les noms de ce menu appartiennent à l'espace de noms std::ranges
Opérations de séquence non modificatrices
Opérations de séquence modificatrices
Opérations de partitionnement
Opérations de tri
Opérations de recherche binaire (sur des plages triées)
       
       
Opérations d'ensemble (sur des 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 T, class Proj = std::identity,
          std::indirect_strict_weak_order
              <const T*, std::projected<I, Proj>> Comp = ranges::less >
constexpr bool binary_search( I first, S last, const T& value,
                              Comp comp = {}, Proj proj = {} );
(1) (depuis C++20)
(jusqu'à C++26)
template< std::forward_iterator I, std::sentinel_for<I> S,
          class Proj = std::identity,
          class T = std::projected_value_t<I, Proj>,
          std::indirect_strict_weak_order
              <const T*, std::projected<I, Proj>> Comp = ranges::less >
constexpr bool binary_search( I first, S last, const T& value,
                              Comp comp = {}, Proj proj = {} );
(depuis C++26)
template< ranges::forward_range R,
          class T, class Proj = std::identity,
          std::indirect_strict_weak_order
              <const T*, std::projected<ranges::iterator_t<R>,
                                        Proj>> Comp = ranges::less >
constexpr bool binary_search( R&& r, const T& value,
                              Comp comp = {}, Proj proj = {} );
(2) (depuis C++20)
(jusqu'à C++26)
template< ranges::forward_range R,
          class Proj = std::identity,
          class T = std::projected_value_t<ranges::iterator_t<R>, Proj>,
          std::indirect_strict_weak_order
              <const T*, std::projected<ranges::iterator_t<R>,
                                        Proj>> Comp = ranges::less >
constexpr bool binary_search( R&& r, const T& value,
                              Comp comp = {}, Proj proj = {} );
(depuis C++26)
1) Vérifie si un élément projeté équivalent à value apparaît dans la plage [firstlast).
2) Identique à (1), mais utilise r comme plage source, comme si ranges::begin(r) était utilisé comme first et ranges::end(r) comme last.

Pour que ranges::binary_search réussisse, la plage [firstlast) doit être au moins partiellement ordonnée par rapport à value, c'est-à-dire qu'elle doit satisfaire à toutes les exigences suivantes :

  • partitionnée par rapport à std::invoke(comp, std::invoke(proj, element), value) (c'est-à-dire que tous les éléments projetés pour lesquels l'expression est true précèdent tous les éléments pour lesquels l'expression est false).
  • partitionnée par rapport à !std::invoke(comp, value, std::invoke(proj, element)).
  • pour tous les éléments, si std::invoke(comp, std::invoke(proj, element), value) est true alors !std::invoke(comp, value, std::invoke(proj, element)) est également true.

Une plage entièrement triée répond à ces critères.

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

Paramètres

first, last - la paire itérateur-sentinelle définissant la plage d'éléments à examiner
r - la plage d'éléments à examiner
value - valeur à comparer aux éléments
comp - fonction de comparaison à appliquer aux éléments projetés
proj - projection à appliquer aux éléments

Valeur de retour

true si un élément égal à value est trouvé, false sinon.

Complexité

Le nombre de comparaisons et de projections effectuées est logarithmique dans la distance entre first et last (au plus log2(last - first) + O(1) comparaisons et projections). Cependant, pour une paire itérateur-sentinelle qui ne modélise pas std::random_access_iterator, le nombre d'incrémentations d'itérateur est linéaire.

Notes

std::ranges::binary_search ne renvoie pas d'itérateur à l'élément trouvé lorsqu'un élément dont la projection est égale à value est trouvé. Si un itérateur est souhaité, std::ranges::lower_bound doit être utilisé à la place.

Macro de test de fonctionnalité macro Valeur Std Fonctionnalité
__cpp_lib_algorithm_default_value_type 202403 (C++26) Initialisation par liste pour les algorithmes (1,2)

Implémentation possible

struct binary_search_fn
{
    template<std::forward_iterator I, std::sentinel_for<I> S,
             class Proj = std::identity, class T = std::projected_value_t<I, Proj>,
             std::indirect_strict_weak_order
                 <const T*, std::projected<I, Proj>> Comp = ranges::less>
    constexpr bool operator()(I first, S last, const T& value,
                              Comp comp = {}, Proj proj = {}) const
    {
        auto x = ranges::lower_bound(first, last, value, comp, proj);
        return (!(x == last) && !(std::invoke(comp, value, std::invoke(proj, *x))));
    }
    
    template<ranges::forward_range R, class Proj = std::identity,
             class T = std::projected_value_t<ranges::iterator_t<R>, Proj>,
             std::indirect_strict_weak_order
                 <const T*, std::projected<ranges::iterator_t<R>,
                                           Proj>> Comp = ranges::less>
    constexpr bool operator()(R&& r, const T& value, Comp comp = {}, Proj proj = {}) const
    {
        return (*this)(ranges::begin(r), ranges::end(r), value,
                       std::move(comp), std::move(proj));
    }
};

inline constexpr binary_search_fn binary_search;

Exemple

#include <algorithm>
#include <cassert>
#include <complex>
#include <iostream>
#include <ranges>
#include <vector>

int main()
{
    constexpr static auto haystack = {1, 3, 4, 5, 9};
    static_assert(std::ranges::is_sorted(haystack));
    
    for (const int needle : std::views::iota(1)
                          | std::views::take(3))
    {
        std::cout << "Searching for " << needle << ": ";
        std::ranges::binary_search(haystack, needle)
            ? std::cout << "found " << needle << '\n'
            : std::cout << "no dice!\n";
    }

    using CD = std::complex<double>;
    std::vector<CD> nums{{1, 1}, {2, 3}, {4, 2}, {4, 3}};
    auto cmpz = [](CD x, CD y){ return abs(x) < abs(y); };
    #ifdef __cpp_lib_algorithm_default_value_type
        assert(std::ranges::binary_search(nums, {4, 2}, cmpz));
    #else
        assert(std::ranges::binary_search(nums, CD{4, 2}, cmpz));
    #endif
}

Sortie :

Searching for 1: found 1
Searching for 2: no dice!
Searching for 3: found 3

Voir aussi

trouve la plage d'éléments correspondant à la valeur donnée en utilisant la recherche binaire
(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)
trouve le premier élément supérieur à la valeur donnée en utilisant la recherche binaire
(objet fonction d'algorithme)
vérifie si la plage contient l'élément ou sous-plage donné
(objet fonction d'algorithme)
détermine si un élément existe dans une plage en utilisant la recherche binaire
(template de fonction)