?
This document uses PHP Chinese website manual Release
在頭文件<stdlib.h>中定義 | ||
---|---|---|
void * bsearch(const void * key,const void * ptr,size_t count,size_t size,int(* comp)(const void *,const void *)); | (1) | |
void * bsearch_s(const void * key,const void * ptr,rsize_t count,rsize_t size,int(* comp)(const void *,const void *,void *),void * context); | (2) | (自C11以來) |
1)查找與指向key
的數(shù)組中指向的元素相等的元素ptr
。該數(shù)組包含字節(jié)的count
元素,size
并且必須相對于key
該元素進行分區(qū),也就是說,比較的所有元素必須出現(xiàn)在所有比較相同的元素之前,并且這些元素必須出現(xiàn)在所有比該關(guān)鍵對象更大的元素之前。完全排序的數(shù)組滿足這些要求。元素使用指向的函數(shù)進行比較comp
。如果數(shù)組尚未*key
按照使用的相同標準升序排列,則行為未定義comp
。
2)與(1)相同,只是context
傳遞附加的上下文參數(shù),comp
并且在運行時檢測到以下錯誤并調(diào)用當前安裝的約束處理函數(shù):
count
or size
is greater than RSIZE_MAX
key
, ptr
or comp
is a null pointer (unless count
is zero)
與所有邊界檢查的函數(shù)一樣,bsearch_s
只有__STDC_LIB_EXT1__
在實現(xiàn)定義并且用戶在包含之前定義__STDC_WANT_LIB_EXT1__
為整數(shù)常量時1
才能保證可用stdlib.h
。
如果該數(shù)組包含多個元素,這些元素comp
將指示與搜索的元素相同,則未指定函數(shù)將作為結(jié)果返回的元素。
鍵 | - | 指向要搜索的元素的指針 |
---|---|---|
ptr | - | 指向要檢查的數(shù)組的指針 |
size | - | 數(shù)組中元素的個數(shù) |
size | - | 數(shù)組中每個元素的大小(以字節(jié)為單位) |
comp | - | 比較函數(shù),如果第一個參數(shù)小于第二個參數(shù),則返回負整數(shù)值;如果第一個參數(shù)大于第二個參數(shù),則返回正整數(shù)值;如果參數(shù)相等,則返回零。鍵作為第一個參數(shù)傳遞,數(shù)組中的元素作為第二個參數(shù)。比較函數(shù)的簽名應(yīng)該等同于以下內(nèi)容:int cmp(const void * a,const void * b); 該函數(shù)不得修改傳遞給它的對象,并且在調(diào)用相同對象時必須返回一致的結(jié)果,而不管它們在數(shù)組中的位置。 |
context | - | 附加信息(例如,整理順序),作為第三個參數(shù)傳遞給comp |
1)指向數(shù)組中等于*key
或等于的元素的指針,或者如果沒有找到該元素,則返回空指針。
2)與(1)相同,只是空指針在運行時約束違規(guī)時也返回。
盡管名稱不同,C 或 POSIX 標準都不要求使用二分搜索來實現(xiàn)此功能,也不需要做任何復雜性保證。
與其他邊界檢查函數(shù)不同,bsearch_s
不會將零大小的數(shù)組視為運行時約束違規(guī),而是指示找不到的元素(另一個接受零大小數(shù)組的函數(shù)qsort_s
)。
直到bsearch_s
,用戶bsearch
經(jīng)常使用的全局變量傳遞附加的上下文的比較功能。
#include <stdlib.h>#include <stdio.h> struct data { int nr; char const *value;} dat[] = { {1, "Foo"}, {2, "Bar"}, {3, "Hello"}, {4, "World"}}; int data_cmp(void const *lhs, void const *rhs) { struct data const *const l = lhs; struct data const *const r = rhs; if (l->nr < r->nr) return -1; else if (l->nr > r->nr) return 1; else return 0; // return (l->nr > r->nr) - (l->nr < r->nr); // possible shortcut // return l->nr - r->nr; // erroneous shortcut (fails if INT_MIN is present)} int main(void) { struct data key = { .nr = 3 }; struct data const *res = bsearch(&key, dat, sizeof dat / sizeof dat[0], sizeof dat[0], data_cmp); if (res) { printf("No %d: %s\n", res->nr, res->value); } else { printf("No %d not found\n", key.nr); }}
輸出:
No 3: Hello
C11標準(ISO / IEC 9899:2011):
7.22.5.1 bsearch函數(shù)(p:355)
K.3.6.3.1 bsearch_s函數(shù)(p:608-609)
C99標準(ISO / IEC 9899:1999):
7.20.5.1 bsearch函數(shù)(p:318-319)
C89 / C90標準(ISO / IEC 9899:1990):
4.10.5.1 bsearch函數(shù)
qsortqsort_s(C11) | 對一系列未指定類型的元素進行排序(函數(shù)) |
---|
| 用于bsearch的C ++文檔 |