Namespaces
Variants

std::bsearch

Depuis fr.cppreference.net
 
 
Bibliothèque d'algorithmes
Algorithmes contraints et algorithmes sur plages (C++20)
Algorithmes contraints, 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 modification de séquence
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)

Tri et opérations associées
Opérations de partitionnement
(C++11)    

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


 
Défini dans l'en-tête <cstdlib>
void* bsearch( const void* key, const void* ptr, std::size_t count,
               std::size_t size, /* c-compare-pred */* comp );
(1)
void* bsearch( const void* key, const void* ptr, std::size_t count,
               std::size_t size, /* compare-pred */* comp );
(2)
void* bsearch( void* key, const void* ptr, std::size_t count,
               std::size_t size, /* c-compare-pred */* comp );
(3) (depuis C++26)
void* bsearch( void* key, const void* ptr, std::size_t count,
               std::size_t size, /* compare-pred */* comp );
(4) (depuis C++26)
extern "C" using /* c-compare-pred */ = int(const void*, const void*);
(exposition seulement*)
extern "C++" using /* compare-pred */ = int(const void*, const void*);
(exposition seulement*)

Recherche un élément égal à l'élément pointé par key dans un tableau pointé par ptr. Le tableau contient count éléments de size octets chacun et doit être partitionné par rapport à l'objet pointé par key, c'est-à-dire que tous les éléments qui comparent inférieurs doivent apparaître avant tous les éléments qui comparent égaux, et ceux-ci doivent apparaître avant tous les éléments qui comparent supérieurs à l'objet clé. Un tableau entièrement trié satisfait ces exigences. Les éléments sont comparés à l'aide de la fonction pointée par comp.

Si le tableau n'est pas déjà partitionné en ordre croissant par rapport à key, selon le même critère que celui utilisé par comp, le comportement est indéfini.

Si le tableau contient plusieurs éléments que comp indiquerait comme égaux à l'élément recherché, alors il n'est pas spécifié quel élément la fonction retournera comme résultat.

Paramètres

key - pointeur vers l'élément à rechercher
ptr - pointeur vers le tableau à examiner
count - nombre d'éléments dans le tableau
size - taille de chaque élément du tableau en octets
comp - fonction de comparaison qui retourne une valeur entière négative si le premier argument est inférieur au second, une valeur entière positive si le premier argument est supérieur au second et zéro si les arguments sont équivalents.key est passé comme premier argument, un élément du tableau comme second.

La signature de la fonction de comparaison doit être équivalente à ce qui suit :

int cmp(const void *a, const void *b);

La fonction ne doit pas modifier les objets qui lui sont passés et doit retourner des résultats cohérents lorsqu'elle est appelée pour les mêmes objets, indépendamment de leurs positions dans le tableau.

Valeur de retour

Pointeur vers l'élément trouvé ou pointeur nul si l'élément n'a pas été trouvé.

Notes

Malgré son nom, ni la norme C ni la norme POSIX n'exigent que cette fonction soit implémentée à l'aide d'une recherche binaire ou ne fournissent de garanties de complexité.

Les deux surcharges fournies par la bibliothèque standard C++ sont distinctes car les types du paramètre comp sont distincts (la liaison de langage fait partie de son type).

Exemple

#include <array>
#include <cstdlib>
#include <iostream>

template<typename T>
int compare(const void *a, const void *b)
{
    const auto &arg1 = *(static_cast<const T*>(a));
    const auto &arg2 = *(static_cast<const T*>(b));
    const auto cmp = arg1 <=> arg2;
    return cmp < 0 ? -1
        :  cmp > 0 ? +1
        :  0;
}

int main()
{
    std::array arr{1, 2, 3, 4, 5, 6, 7, 8};
    
    for (const int key : {4, 8, 9})
    {
        const int* p = static_cast<int*>(
            std::bsearch(&key,
                arr.data(),
                arr.size(),
                sizeof(decltype(arr)::value_type),
                compare<int>));
        
        std::cout << "value " << key;
        if (p)
            std::cout << " found at position " << (p - arr.data()) << '\n';
        else
            std::cout << " not found\n";
    }
}

Sortie :

value 4 found at position 3
value 8 found at position 7
value 9 not found

Voir aussi

trie une plage d'éléments de type non spécifié
(fonction)
trouve la plage d'éléments correspondant à une valeur donnée en utilisant la recherche binaire
(modèle de fonction & objet fonction d'algorithme)
Documentation C pour bsearch