bsearch, bsearch_s
来自cppreference.com
| 在标头 <stdlib.h> 定义
|
||
| |
(1) | |
| |
(2) | (C11 起) |
1) 在
ptr所指的数组中寻找等于key所指的元素。该数组包含count个大小为size字节的元素,并且已相对于key划分好,也就是说,所有比较小于关键目标的元素必须出现于所有比较等于的元素之前,而且所有比较等于关键目标的元素要出现于所有比较大于关键目标的元素之前。完全排好序的数组满足这些要求。元素用comp所指向的函数比较。若数组未依照与comp标准相同的,相对于*key的升序划分,则行为未定义。2) 同(1),除了传递给
comp附加语境参数context,还会在运行时检测下列错误,并调用当前安装的约束处理函数:
count或size大于RSIZE_MAXkey、ptr或comp是空指针(除非count为零)
- 同所有边界检查函数,
bsearch_s仅若实现定义了__STDC_LIB_EXT1__,且用户在包含stdlib.h前定义__STDC_WANT_LIB_EXT1__为整数常量1才保证可用。
若数组包含数个comp指示为与欲查找元素相等的元素,则结果返回的具体元素是未指定的。
参数
| key | - | 指向要查找的元素的指针 |
| ptr | - | 指向要检验的数组的指针 |
| count | - | 数组的元素数目 |
| size | - | 数组每个元素的字节数 |
| comp | - | 比较函数。如果首个参数小于 第二个,那么返回负整数值,如果首个参数大于 第二个,那么返回正整数值,如果两个参数等价,那么返回零。 将key传给首个参数,数组中的元素传给第二个。比较函数的签名应等价于如下形式:
该函数必须不修改传递给它的对象,而且在调用比较相同对象时必须返回一致的结果,与它们在数组中的位置无关。 |
| context | - | 附加信息(例如,对照序列),作为第三个参数传递给comp
|
返回值
1) 指向与
*key比较相等的指针,在找不到元素时返回空指针。2) 同(1),除了在运行时强制违规时也返回空指针。
注意
与名称无关,C和POSIX标准都未要求此函数用二分查找实现,也未保证任何复杂度。
与其他检查边界的函数不同,bsearch_s不将零大小数组视作运行时强制违规,而是指出找不到元素(另一个接受零大小数组的函数是qsort_s)。
在bsearch_s之前,bsearch的用户通常用全局变量来传递比较函数的附加语境。
示例
运行此代码
#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); // 可行的简洁写法
// return l->nr - r->nr; // 错误的简洁写法(若给出INT_MIN就会失败)
}
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 The bsearch function (第 355 页)
- K.3.6.3.1 The bsearch_s function (第 608-609 页)
- C99 标准(ISO/IEC 9899:1999):
- 7.20.5.1 The bsearch function (第 318-319 页)
- C89/C90 标准(ISO/IEC 9899:1990):
- 4.10.5.1 The bsearch function
参阅
(C11) |
在一个包含未指定类型的元素的范围上进行排序 (函数) |
bsearch 的 C++ 文档
| |