std::binary_search要求容器已排序且使用匹配比较函数,仅返回存在性布尔值;传入乱序容器或不一致比较器将导致未定义行为,时间复杂度O(log N)。

c++中如何使用std::binary_search_c++二分查找是否存在元素【详解】

std::binary_search 用对的前提:容器必须已排序

它不负责排序,只做存在性判断。如果传入乱序容器,结果未定义——可能返回 false 即使元素存在,也可能偶然返回 true。常见错误是直接对 std::vector 调用,却忘了先调用 std::sort

基本用法与参数细节

函数签名是 std::binary_search(ForwardIterator first, ForwardIterator last, const T& value, Compare comp = Compare{})。注意它只接受前向迭代器及以上(std::list 不行),且不返回位置,只返回 bool

std::vector<int> v = {1, 3, 5, 7, 9};
std::sort(v.begin(), v.end()); // 必须先排
bool found = std::binary_search(v.begin(), v.end(), 5); // true
bool missing = std::binary_search(v.begin(), v.end(), 4); // false

和 lower_bound / upper_bound 的关键区别

很多人想“查是否存在”,却误用 std::lower_bound 后判断是否等于 end()。这可行,但多做了事:它实际定位了插入点,而 std::binary_search 内部可早停(找到即返 true)。

容易忽略的陷阱

最隐蔽的问题是自定义类型 + 自定义比较器时,value 参数类型和比较器参数类型不匹配。例如比较器接受 const MyStruct&,但传入的是 int 字面量,编译可能通过(隐式转换),运行时逻辑错乱。

它只回答“有没有”,不关心“在哪儿”或“有几个”。把问题想清楚再选接口,比硬套模板更重要。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。