lower_bound和upper_bound

algorithm库中基于二分查找的高效工具,时间复杂度均为 \(O(\log n)\)

使用前提

被搜索的数组(或容器区间)必须是有序的(单调递增或单调递减)。如果数组无序,结果是未定义的。

核心区别

处理“相等”元素时的逻辑,以及配合比较器(如 greater())时的行为。

lower_bound(begin, end, val)

寻找第一个 大于等于 (\(\ge\)) val 的元素。(如果我想把 val 插入数组并保持有序,这是我可以插入的最左边的位置。)
返回值:迭代器(如果所有数都比 val 小,返回 end。)

upper_bound(begin, end, val)

寻找第一个 大于 (\(>\)) val 的元素(严格大于)。(如果我想把 val 插入数组并保持有序,这是我可以插入的最右边的位置
返回值:迭代器(如果所有数都比 val 小或者相等,返回 end。)

当数组是从大到小排列时,我们需要传入比较器 greater<int>()
注:
1>查不存在的元素时,两者通常指向同一个位置。
2>这两个函数返回的是 iterator (迭代器)。要获取数组下标(index),必须减去起始迭代器

vector<int> v = {1, 2, 4, 6};
auto it = lower_bound(v.begin(), v.end(), 4);

// 获取下标
int index = it - v.begin(); // index = 2

// 判断是否没找到 (非常重要!)
if (it == v.end()) {
    // 所有元素都比 4 小
}
posted on 2025-12-11 19:21  九十镹  阅读(4)  评论(0)    收藏  举报