C++中lower_bound()的comp参数用法及多参数比较函数实现
自定义lower_bound比较函数的分步说明
1. 明确lower_bound比较函数的参数顺序
lower_bound的自定义比较函数comp是一个二元谓词,参数顺序固定为:
- 第一个参数:
lower_bound的第三个输入参数(即你传入的基准值,对应需求中的val) - 第二个参数:容器中的元素(即
vector<int>里的每个number)
comp(a, b)返回true的含义是:a应该排在b的前面。lower_bound要求容器已按这个规则划分(所有满足comp(val, element)为true的元素在前,不满足的在后),最终返回第一个不满足comp(val, element)的元素迭代器。
2. 传递额外参数(val和y)
因为comp需要用到val和频繁变化的y,这两个属于外部参数,无法直接通过二元函数传递,最简洁的实现方式是用lambda表达式捕获这两个变量。
你的需求逻辑是:当val - element > y时返回true,对应的lambda写法如下:
auto comp = [val, y](int target_val, int element) { return (target_val - element) > y; };
这里target_val对应lower_bound传入的val(第一个参数),element是容器中的元素(第二个参数),通过捕获列表[val, y]将外部的val和y传入lambda内部。
3. 结合lower_bound实现需求
以你的示例数据为例,完整代码如下:
#include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> a = {1, 3, 5, 6, 8, 10, 11}; int val = 41; int y = 31; // 自定义比较逻辑的lambda auto comp = [val, y](int target, int element) { return (target - element) > y; }; // 找到第一个满足val - element <= y的元素迭代器 auto it = std::lower_bound(a.begin(), a.end(), val, comp); // 如果你需要最后一个满足val - element > y的元素: if (it != a.begin()) { --it; std::cout << "最后一个满足val - element > y的元素:" << *it << ",索引:" << std::distance(a.begin(), it) << std::endl; } else { std::cout << "没有满足条件的元素" << std::endl; } // 如果你需要最后一个满足val - element <= y的元素: if (it != a.end()) { auto last_it = a.end() - 1; std::cout << "最后一个满足val - element <= y的元素:" << *last_it << ",索引:" << std::distance(a.begin(), last_it) << std::endl; } else { std::cout << "没有满足条件的元素" << std::endl; } return 0; }
代码输出
最后一个满足val - element > y的元素:8,索引:4 最后一个满足val - element <= y的元素:11,索引:6
注:你的示例中提到要找元素10,可能是需求逻辑表述有误(比如实际要找val - element >= y的最后一个元素),但核心的比较函数构建方法完全一致。
4. 关键注意事项
- 容器必须已按
comp规则划分:你的需求中(val - element) > y等价于element < val - y,而你的容器是升序排列的,天然满足“小于val-y的元素在前,大于等于的在后”的划分要求,因此可以直接使用lower_bound。 - 若
y频繁变化,每次调用lower_bound时重新定义lambda即可,lambda会自动捕获当前的y值。 - 若需复用比较逻辑,可封装为函数对象(结构体重载
operator()),将val和y作为成员变量,但lambda写法更简洁。
内容的提问来源于stack exchange,提问作者Aya Noaman
相关产品推荐
相关产品推荐

