lower_bound用于在有序且支持随机/双向迭代器的容器中查找第一个≥value的位置;仅适用于排序后的vector、set、map等,对unordered_set或未排序vector使用会导致未定义行为。

lower_bound 用在哪?不是所有容器都能直接调用
它只对「有序」且「支持随机/双向迭代器」的结构有效,比如 std::vector(排序后)、std::set、std::map。但注意:std::unordered_set 或未排序的 vector 上直接用,结果是未定义行为——可能返回错位置,也可能崩溃。
-
std::set和std::map自带lower_bound成员函数,效率高、语义清晰,优先用这个 -
std::vector必须先std::sort,再用std::lower_bound(来自<algorithm></algorithm>),不能跳过排序这步 - 传入的迭代器范围必须是左闭右开:比如
v.begin()到v.end(),不是v.size()
参数写错会怎样?值类型、比较规则必须匹配
常见报错是编译失败,比如 “no match for operatorvalue 类型和容器元素类型不一致,或者自定义类型没重载 operator,也没传 <code>comp 第三个参数。
- 对
vector<int></int>,lower_bound(v.begin(), v.end(), 5)没问题;但写成lower_bound(v.begin(), v.end(), 5LL)(long long)就可能触发隐式转换警告或失败 - 对
vector<string></string>,默认按字典序比;如果想按长度找,得额外传比较函数:lower_bound(v.begin(), v.end(), "hi", [](const string& a, const string& b) { return a.size() -
set<person></person>如果没定义operator,又没传比较器,连编译都过不去
查不到时返回什么?别忘了判 end()
lower_bound 找不到“≥ value”的元素时,统一返回 last(即 v.end() 或 s.end()),不是空指针,也不是 nullptr。直接解引用会导致段错误。
- 正确写法:
if (it != container.end()) { use *it; } - 错误写法:
if (it) { ... }—— 迭代器不能当布尔值隐式判断 - 对
set或map,end()是合法迭代器,但不可解引用;对vector,v.end()指向末尾后一位,越界访问必崩
和 upper_bound、find 有什么区别?别混着用
lower_bound 定位的是“下界”,不是“是否存在”。它不关心是否相等,只保证“第一个 ≥ value”的位置。而 std::find 是线性查找,std::binary_search 只返回 bool,upper_bound 找的是“第一个 > value”的位置——三者目的完全不同。
立即学习“C++免费学习笔记(深入)”;
- 要统计某值出现次数?用
upper_bound(...) - lower_bound(...),别用循环遍历 - 只想确认存不存在?
std::binary_search更直白,也更安全(不依赖迭代器有效性) - 要在 map 中插入新键又不想覆盖旧值?先
auto it = m.lower_bound(key),再检查it != m.end() && it->first == key
最容易被忽略的一点:lower_bound 的“有序”要求是硬性前提,不是建议。哪怕只差一个元素没排好,结果就不可靠——而且这种 bug 很难复现,尤其在数据量小时看似正常,上线后数据一多就出问题。









