Namespaces
Variants

std:: bsearch

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
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
bsearch
Numeric operations
Operations on uninitialized memory
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 ) ;
void * bsearch ( const void * key, const void * ptr, std:: size_t count,

std:: size_t size, /* compare-pred */ * comp ) ;
(1)
extern "C" using /* c-compare-pred */ = int ( const void * , const void * ) ;
extern "C++" using /* compare-pred */ = int ( const void * , const void * ) ;
(2) ( exposition uniquement* )

Trouve 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 se comparent comme inférieurs doivent apparaître avant tous les éléments qui se comparent comme égaux, et ceux-ci doivent apparaître avant tous les éléments qui se comparent comme 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 .

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

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.

Table des matières

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 à :

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 les normes C ni POSIX n'exigent que cette fonction soit implémentée en utilisant une recherche binaire ou ne fournissent aucune garantie 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)
retourne la plage d'éléments correspondant à une clé spécifique
(modèle de fonction)
Documentation C pour bsearch