std::bsearch
cppreference.com
<tbody>
</tbody>
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 , .:
, .
|
, .
, 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
| () | |
| , ( ) | |
C bsearch
| |