Пространства имён
Варианты
Действия

std::bsearch

Материал из cppreference.com
< cpp‎ | algorithm
 
 
Библиотека алгоритмов
Ограниченные алгоритмы и алгоритмы над диапазонами (C++20)
Ограниченные алгоритмы, например ranges::copy, ranges::sort, ...
Политики исполнения (C++17)
Немодифицирующие операции над последовательностями
(C++11)(C++11)(C++11)
(C++17)
Модифицирующие операции над последовательностями
Операции разбиения
Операции сортировки
(C++11)
Операции двоичного поиска
Операции с наборами (в отсортированных диапазонах)
Операции с кучей
(C++11)
Операций минимума/максимума
(C++11)
(C++17)

Операции перестановки
Числовые операции
Операции с неинициализированной памятью
(C++17)
(C++17)
(C++17)
Библиотека C
bsearch
 
Определено в заголовочном файле <cstdlib>
void* bsearch( const void* key, const void* ptr, std::size_t count,

               std::size_t size, /*предикат-сранения*/* comp );
void* bsearch( const void* key, const void* ptr, std::size_t count,

               std::size_t size, /*c-предикат-сранения*/* comp );
(1)
extern "C++" using /*предикат-сранения*/ = int(const void*, const void*);
extern "C" using /*c-предикат-сранения*/ = int(const void*, const void*);
(2) (только для пояснения*)

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

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

Если массив содержит несколько элементов, которые comp указала равными искомому элементу, то не указано, какой элемент функция вернёт в качестве результата.

Содержание

[править] Параметры

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

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

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

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

[править] Возвращаемое значение

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

[править] Примечание

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

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

[править] Пример

#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 << "значение " << key;
        (p) ? std::cout << " найдено в позиции " << (p - arr.data()) << '\n'
            : std::cout << " не найдено\n";
    }
}

Вывод:

значение 4 найдено в позиции 3
значение 8 найдено в позиции 7
значение 9 не найдено

[править] Смотрите также

сортирует диапазон элементов с неопределённым типом
(функция) [править]
возвращает диапазон элементов, соответствующих определённому ключу
(шаблон функции) [править]