std::binary_search要求容器必须预先排序,仅返回bool值表示存在性,不提供位置信息,适用于已知有序数据的快速存在性检查。

std::binary_search 查找前必须确保容器已排序
它不会帮你排序,只做纯查找——如果传入乱序数据,结果完全不可预测。常见错误是直接对 std::vector 调用 std::binary_search 却忘了先调 std::sort。
使用场景:你已经知道数据有序(比如预处理过、或来自 std::set 迭代器范围),想快速判断某值是否存在。
- 仅返回
bool:存在为true,不存在为false;不提供位置信息 - 要求迭代器支持随机访问(
std::vector、std::array、原生数组可以;std::list不行) - 默认用
operator<比较,若自定义类型需重载该运算符,或传入比较函数
正确调用 std::binary_search 的最小代码结构
三要素缺一不可:有序区间、目标值、可选的比较谓词。
#include <algorithm>
#include <vector>
std::vector<int> v = {1, 3, 5, 7, 9};
// 必须已排序(这里本来就是升序)
bool found = std::binary_search(v.begin(), v.end(), 5); // true
bool not_found = std::binary_search(v.begin(), v.end(), 4); // false
// 自定义比较:降序查找
std::vector<int> desc = {9, 7, 5, 3, 1};
bool in_desc = std::binary_search(desc.begin(), desc.end(), 5, std::greater<int>{}); // true
注意:v.begin() 和 v.end() 构成左闭右开区间,和所有 STL 算法一致。
立即学习“C++免费学习笔记(深入)”;
std::binary_search 和 lower_bound / upper_bound 的关键区别
如果你需要下标、插入位置、或处理重复元素,std::binary_search 就不够用了——它只回答“有没有”,不告诉你“在哪”。
-
std::binary_search:适合存在性检查,语义清晰、开销最小 -
std::lower_bound:返回第一个 ≥ 目标值的位置(迭代器),可用于定位或去重插入点 -
std::upper_bound:返回第一个 > 目标值的位置,配合lower_bound可得重复段范围
性能上三者都是 O(log n),但 std::binary_search 内部可能少一次解引用(毕竟不返回迭代器),不过实际差异微乎其微。
容易被忽略的编译与兼容性细节
头文件、命名空间、迭代器类型这些小地方一错就报一堆模板错误,典型现象是编译器抱怨 “no matching function” 或 “invalid operands to binary expression”。
- 必须包含
<algorithm>,不是<functional>或<iterator> - 比较函数必须满足 strict weak ordering(例如不能用
!=或>=当谓词) - 用
std::vector::data()+ 指针传给std::binary_search是合法的,但要注意生命周期和空容器情况(v.data()对空v返回 nullptr,v.begin()更安全)
真正麻烦的往往不是算法本身,而是你传进去的那段“看起来有序、其实没排好”或者“比较逻辑和排序逻辑不一致”的数据。


















