Namespaces
Variants

std::bsearch

Из ru.cppreference.net
 
 
Библиотека алгоритмов
Ограниченные алгоритмы и алгоритмы над диапазонами (C++20)
Ограниченные алгоритмы, например ranges::copy, ranges::sort, ...
Операции последовательности без модификации    
Пакетные операции
(C++17)
Операции поиска
Операции модификации последовательности
Операции копирования
(C++11)
(C++11)
Операции обмена
Операции преобразования
Операции генерации
Операции удаления
Операции изменения порядка
(until C++17)(C++11)
(C++20)(C++20)
Операции выборки
(C++17)

Сортировка и связанные операции
Операции разделения
(C++11)    

Операции сортировки
Операции бинарного поиска
(на разделенных диапазонах)
Операции над множествами (на отсортированных диапазонах)
Операции слияния (на отсортированных диапазонах)
Операции с кучей
Операции минимума/максимума
(C++11)
(C++17)
Операции лексикографического сравнения
Операции перестановок


Политики выполнения(C++17)
(только для демонстрации*)(C++26)

Численные операции
(C++11)
(C++17)
(C++17)    

Специализированные <memory> алгоритмы

Специализированные <random> алгоритмы
Библиотека C









 
Определено в заголовке <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) (начиная с C++26)
void* bsearch( void* key, const void* ptr, std::size_t count,
               std::size_t size, /* compare-pred */* comp );
(4) (начиная с C++26)
extern "C" using /* c-compare-pred */ = int(const void*, const void*);
(только для демонстрации*)
extern "C++" using /* compare-pred */ = int(const void*, const void*);
(только для демонстрации*)

Находит элемент, равный элементу, на который указывает key, в массиве, на который указывает ptr. Массив содержит count элементов по size байт каждый и должен быть разделен относительно объекта, на который указывает key, то есть все элементы, которые сравниваются меньше, должны появляться перед всеми элементами, равными ключу, а те, в свою очередь, перед всеми элементами, которые сравниваются больше. Полностью отсортированный массив удовлетворяет этим требованиям. Элементы сравниваются с помощью функции, на которую указывает comp.

Если массив не упорядочен по возрастанию относительно key по тому же критерию, который использует comp, поведение не определено.

Если массив содержит несколько элементов, которые comp мог бы указать как равные искомому, то не определено, какой именно элемент будет возвращен функцией.

Параметры

key - указатель на искомый элемент
ptr - указатель на исследуемый массив
count - количество элементов в массиве
size - размер каждого элемента в массиве в байтах
comp - функция сравнения, которая возвращает отрицательное целое значение, если первый аргумент меньше второго, положительное целое значение, если первый аргумент больше второго, и ноль, если аргументы эквивалентны.key передается в качестве первого аргумента, элемент из массива — в качестве второго.

Сигнатура функции сравнения должна быть эквивалентна следующей:

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

Функция не должна изменять переданные ей объекты и при повторных вызовах с теми же объектами должна возвращать согласованные результаты независимо от их позиций в массиве.

​

Возвращаемое значение

Указатель на найденный элемент или нулевой указатель, если элемент не был найден.

Примечания

Несмотря на название, ни стандарт C, ни POSIX не требуют, чтобы эта функция была реализована с помощью бинарного поиска, и не дают никаких гарантий сложности.

Две перегрузки, предоставляемые стандартной библиотекой C++, различаются, потому что типы параметра comp различны (языковая привязка является частью его типа).

Пример

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

Вывод:

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

Смотри также

сортирует диапазон элементов с неопределенным типом
(функция)
находит диапазон элементов, соответствующих заданному значению, используя бинарный поиск
(шаблон функции & объект-функция алгоритма)