lower_bound在std::map中返回指向第一个键不小于给定值的元素的迭代器;若所有键都小于该值则返回end(),否则停在相等或首个更大的键处。

lower_bound在std::map里返回什么
lower_bound 返回指向第一个键不小于给定值的元素的迭代器。它不找“等于”,而是找“大于等于”——这点和字面意思容易混淆,但恰恰是它做范围搜索的基础。如果所有键都小于给定值,它返回 end();如果存在相等键,就停在那个位置;否则停在第一个更大的键上。
用lower_bound配合upper_bound做左闭右开区间查询
单独用 lower_bound 只能定位起点,要取一段连续范围(比如 [L, R)),必须配对使用 upper_bound:前者找 ≥ L 的第一个位置,后者找 > R 的第一个位置,两者之间就是你要的区间。
-
lower_bound(L)是左边界(包含 L) -
upper_bound(R)是右边界(不包含 R+1,即严格大于 R) - 所以
map.lower_bound(L)到map.upper_bound(R)构成一个合法迭代器区间,可直接用于for循环或std::distance
示例:查键在 [5, 10) 范围内的所有元素:
auto it_low = m.lower_bound(5);
auto it_high = m.upper_bound(10);
for (auto it = it_low; it != it_high; ++it) {
std::cout << it->first << ": " << it->second << "\n";
}
为什么不能用find代替lower_bound做范围起始
find 只能精确匹配,找不到就返回 end(),无法处理“从最近的大于等于值开始”的场景。比如查 [7, ∞),若键 7 不存在,find(7) 失败,但 lower_bound(7) 仍能返回键为 8 或 9 的位置。
立即学习“C++免费学习笔记(深入)”;
- 当 L 不一定存在于 map 中时,
lower_bound是唯一可靠起点 -
find在范围搜索中基本没用,除非你明确知道 L 一定存在且只要那一个元素 - 性能上,
lower_bound和find都是 O(log n),但语义完全不同
常见错误:把lower_bound当成“找最近的键”来用
有人误以为 lower_bound(x) 会返回键最接近 x 的元素,其实不会——它只保证“不小于 x”,不保证距离最小。例如 map 有键 {2, 10, 100},查 lower_bound(7) 返回指向 10 的迭代器,而不是 2(虽然 |7−2|
- 若真需要“最接近”,得手动比较
lower_bound(x)和它前一个位置(需检查是否为begin()) - 误用会导致逻辑跳过本应包含的左邻近值
- 尤其在浮点 key 或自定义比较器下,行为更易出人意料
边界判断比想象中脆弱,lower_bound 的语义干净利落,但用错前提就会彻底跑偏。


















