lower_bound()和upper_bound()的区别

本文介绍了二分查找在容器中寻找特定元素位置的应用场景。详细解释了如何确定元素相对于已排序序列的位置,包括最大位置的定义及其与序列排序的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前者为容器中右边是大于等于该值左边小于该值的最大位置,后者为容器中右边大于该值,左边小于等于该值的最大位置。

且由于是使用了二分查找,所以一定要start-end为有序排列。缺省start-end要为一个非递减序列,由于理论上要适用与所有情况,所以应当整个序列都为非递减序列,即该序列为不完全递增序列(后一个数可以大于等于前一个数)


### C++ 中 `lower_bound` `upper_bound` 的区别 #### 定义与功能 `lower_bound` 是用于查找第一个 **不小于目标值 (`target`) 的位置**,返回的是指向该元素的迭代器[^2]。 而 `upper_bound` 则是用于查找第一个 **大于目标值 (`target`) 的位置**,同样返回指向该元素的迭代器。 两者都基于二分查找实现,因此要求输入序列必须有序(通常是升序排列)。 --- #### 参数说明 两个函数具有相同的参数结构: ```cpp template<class ForwardIt, class T> ForwardIt lower_bound(ForwardIt first, ForwardIt last, const T& value); ``` - `first`: 起始地址或迭代器。 - `last`: 结束地址或迭代器(注意:此位置本身不会被访问)。 - `value`: 需要比较的目标值。 对于自定义排序规则的情况,还可以提供第四个参数——一个比较函数对象。 --- #### 使用场景对比 | 功能 | `lower_bound` | `upper_bound` | |-------------------------|-----------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------| | 查找条件 | 找到第一个 **不小于** 给定值的位置 | 找到第一个 **严格大于** 给定值的位置 | | 应用场景 | 常见于需要找到某个范围起点的任务 | 常见于需要找到某个范围终点的任务 | | 返回结果特性 | 如果找不到符合条件的值,则返回最后一个可能的位置 (即 `end()` 或者超出当前容器的部分) | 同上 | --- #### 示例代码 以下是具体的使用示例: ```cpp #include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> vec = {1, 2, 4, 6, 7, 9}; int target = 5; auto lb = std::lower_bound(vec.begin(), vec.end(), target); // 寻找 >=5 的第一个数 if (lb != vec.end()) { std::cout << "Lower bound of " << target << " is at index: " << std::distance(vec.begin(), lb) << ", Value: " << *lb << "\n"; } else { std::cout << "No element found that satisfies the condition.\n"; } auto ub = std::upper_bound(vec.begin(), vec.end(), target); // 寻找 >5 的第一个数 if (ub != vec.end()) { std::cout << "Upper bound of " << target << " is at index: " << std::distance(vec.begin(), ub) << ", Value: " << *ub << "\n"; } else { std::cout << "No element found that satisfies the condition.\n"; } return 0; } ``` 运行上述程序会得到如下输出: ``` Lower bound of 5 is at index: 3, Value: 6 Upper bound of 5 is at index: 3, Value: 6 ``` 这表明当目标值不存在时,两者的返回值可能是相同的。 --- #### 自定义排序规则扩展 如果希望按照降序或其他特定顺序来执行操作,可以传递额外的比较函数作为第四参数。例如: ```cpp std::vector<int> vec_desc = {9, 7, 6, 4, 2, 1}; auto custom_lb = std::lower_bound(vec_desc.begin(), vec_desc.end(), 5, [](const int &a, const int &b){return a > b;}); if (custom_lb != vec_desc.end()) { std::cout << "Custom Lower Bound Index: " << std::distance(vec_desc.begin(), custom_lb) << ", Value: " << *custom_lb << "\n"; } ``` 这里通过 lambda 表达式重新定义了比较逻辑以适应降序数组的需求。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值