lower_bound在std::map中返回指向第一个键不小于给定值的元素的迭代器;若所有键都小于目标值则返回end(),解引用前必须检查是否等于end(),其核心用途是范围查询而非精确查找。

lower_bound在std::map里返回什么
lower_bound 返回的是指向第一个键不小于给定值的元素的迭代器。它不找“等于”,而是找“大于等于”——这点和二分查找语义一致,但容易误以为只找相等项。如果所有键都小于目标值,它返回 end();如果目标键存在,它不一定指向那个键(比如有重复键时——但 std::map 键唯一,所以此时就指向该键)。
怎么安全调用lower_bound并避免越界
直接解引用 lower_bound 返回的迭代器是危险的,必须先检查是否等于 end():
- 错误写法:
auto it = m.lower_bound(key); return it->second;—— 若 key 太大,it == m.end(),解引用崩溃 - 正确写法:
auto it = m.lower_bound(key); if (it != m.end()) { /* 使用 it->first / it->second */ } - 若只想判断是否存在“等于”的键,别用
lower_bound,改用find()更直观;lower_bound的价值在于范围查询,比如“找第一个 ≥ X 的键”
lower_bound和upper_bound配合实现区间遍历
这是 lower_bound 最典型的实用场景:获取键在 [L, R) 范围内的所有元素(左闭右开)。upper_bound 返回第一个 > R 的位置,两者之间就是满足 L ≤ key
auto from = m.lower_bound(L);
auto to = m.upper_bound(R);
for (auto it = from; it != to; ++it) {
// it->first ∈ [L, R)
}
注意:upper_bound(R) 不是 lower_bound(R+1) 的等价替代——对浮点或自定义类型可能因精度/比较逻辑不同而行为不一致,应优先用 upper_bound。
立即学习“C++免费学习笔记(深入)”;
自定义比较函数下lower_bound的行为变化
如果你用 std::map<K, V, Comp> 并传入自定义比较器(如 std::greater<int>),lower_bound 仍遵循“第一个不满足 comp(key, element.first) 为 true 的位置”,即逻辑上仍是“≥”,但“≥”的含义由你的 Comp 定义。常见坑:
- 比较器必须是严格弱序(strict weak ordering),否则
lower_bound行为未定义 - 若用
std::greater<int>,map 按降序排列,lower_bound(5)返回第一个 ≤ 5 的键(即最大且 ≤ 5 的那个),不是通常意义的“≥” - 务必确保
Comp对传入的查找键和 map 中的键类型兼容(比如不要拿string去查const char*,除非比较器显式支持)
实际调试时,建议打印 lower_bound 返回的迭代器所指键值,比凭直觉猜更可靠。


















