名稱空間
變體
操作

std::bsearch

來自 cppreference.com
< cpp‎ | 演算法
 
 
演算法庫
有約束演算法與針對範圍的演算法 (C++20)
有約束的演算法,例如 ranges::copyranges::sort 等……
執行策略 (C++17)
排序及相關操作
劃分操作
排序操作
二分搜尋操作
(於已劃分範圍上)
集合操作(於已排序範圍上)
歸併操作(於已排序範圍上)
堆操作
最小/最大值操作
(C++11)
(C++17)
字典序比較操作
排列操作
C 庫
bsearch
數值操作
未初始化記憶體上的操作
 
定義於標頭檔案 <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) (僅作說明*)

在由 ptr 指向的陣列中查詢等於由 key 指向的元素。該陣列包含 count 個元素,每個元素大小為 size 位元組,並且必須相對於由 key 指向的物件進行分割槽,也就是說,所有比較小於鍵的元素必須出現在所有比較等於鍵的元素之前,而所有比較等於鍵的元素必須出現在所有比較大於鍵的元素之前。一個完全排序的陣列滿足這些要求。元素使用由 comp 指向的函式進行比較。

如果陣列尚未按照 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

[編輯] 參閱

對未指定型別的元素範圍進行排序
(函式) [編輯]
返回與特定鍵匹配的元素範圍
(函式模板) [編輯]
C 文件 對應於 bsearch