Namespaces
Variants

std::bsearch

De es.cppreference.net
 
 
Biblioteca de algoritmos
Algoritmos restringidos y algoritmos sobre rangos (C++20)
Algoritmos restringidos, por ejemplo ranges::copy, ranges::sort, ...
Operaciones de secuencia no modificadoras    
Operaciones por lotes
(C++17)
Operaciones de búsqueda
Operaciones de modificación de secuencia
Operaciones de copia
(C++11)
(C++11)
Operaciones de intercambio
Operaciones de transformación
Operaciones de generación
Operaciones de eliminación
Operaciones de cambio de orden
(hasta C++17)(C++11)
(C++20)(C++20)
Operaciones de muestreo
(C++17)

Ordenamiento y operaciones relacionadas
Operaciones de particionado
(C++11)    

Operaciones de ordenamiento
Operaciones de búsqueda binaria
(en rangos particionados)
Operaciones de conjuntos (en rangos ordenados)
Operaciones de mezcla (en rangos ordenados)
Operaciones de montículo
Operaciones de mínimo/máximo
(C++11)
(C++17)
Operaciones de comparación lexicográfica
Operaciones de permutación


 
Definido en el encabezado <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) (desde C++26)
void* bsearch( void* key, const void* ptr, std::size_t count,
               std::size_t size, /* compare-pred */* comp );
(4) (desde C++26)
extern "C" using /* c-compare-pred */ = int(const void*, const void*);
(solo exposición*)
extern "C++" using /* compare-pred */ = int(const void*, const void*);
(solo exposición*)

Encuentra un elemento igual al elemento apuntado por key en un arreglo apuntado por ptr. El arreglo contiene count elementos de size bytes cada uno y debe estar particionado con respecto al objeto apuntado por key, es decir, todos los elementos que comparan menores que deben aparecer antes que todos los elementos que comparan iguales a, y estos deben aparecer antes que todos los elementos que comparan mayores que el objeto clave. Un arreglo completamente ordenado satisface estos requisitos. Los elementos se comparan usando la función apuntada por comp.

Si el arreglo no está ya particionado en orden ascendente con respecto a key, según el mismo criterio que comp utiliza, el comportamiento no está definido.

Si el arreglo contiene varios elementos que comp indicaría como iguales al elemento buscado, entonces no se especifica qué elemento devolverá la función como resultado.

Parámetros

key - puntero al elemento a buscar
ptr - puntero al arreglo a examinar
count - número de elementos en el arreglo
size - tamaño de cada elemento del arreglo en bytes
comp - función de comparación que devuelve un valor entero negativo si el primer argumento es menor que el segundo, un valor entero positivo si el primer argumento es mayor que el segundo y cero si los argumentos son equivalentes.key se pasa como primer argumento, un elemento del arreglo como segundo.

La firma de la función de comparación debe ser equivalente a la siguiente:

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

La función no debe modificar los objetos que se le pasan y debe devolver resultados consistentes cuando se llama con los mismos objetos, independientemente de sus posiciones en el arreglo.

​

Valor de retorno

Puntero al elemento encontrado o puntero nulo si el elemento no ha sido encontrado.

Notas

A pesar del nombre, ni el estándar C ni el de POSIX requieren que esta función se implemente usando búsqueda binaria ni hacen ninguna garantía de complejidad.

Las dos sobrecargas proporcionadas por la biblioteca estándar de C++ son distintas porque los tipos del parámetro comp son distintos (enlace de lenguaje es parte de su tipo).

Ejemplo

#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";
    }
}

Salida:

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

Véase también

ordena un rango de elementos con tipo no especificado
(función)
encuentra el rango de elementos que coinciden con un valor dado usando búsqueda binaria
(plantilla de función & objeto función de algoritmo)
Documentación C para bsearch