C++怎么使用lower_bound_C++STL查找教程【精准】

1次阅读

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

C++怎么使用lower_bound_C++STL查找教程【精准】

lower_bound 用在哪?不是所有容器都能直接调用

它只对「有序」且「支持随机/双向迭代器」的结构有效,比如 std::vector(排序后)、std::setstd::map。但注意:std::unordered_set 或未排序的 vector 上直接用,结果是未定义行为——可能返回错位置,也可能崩溃。

  • std::setstd::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) { ... } —— 迭代器不能当布尔值隐式判断
  • setmapend() 是合法迭代器,但不可解引用;对 vectorv.end() 指向末尾后一位,越界访问必崩

和 upper_bound、find 有什么区别?别混着用

lower_bound 定位的是“下界”,不是“是否存在”。它不关心是否相等,只保证“第一个 ≥ value”的位置。而 std::find 是线性查找,std::binary_search 只返回 boolupper_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 很难复现,尤其在数据量小时看似正常,上线后数据一多就出问题。

text=ZqhQzanResources