TAG
-二分
lower_bound
upper_bound
lower_bound 和 upper_bound 的用法是什么?
lower_bound 和 upper_bound 是两个常用于在有序序列中进行二分查找的函数。下面我将从函数功能、参数列表、返回值和应用实例等方面对它们进行对比介绍。
函数功能
- lower_bound:该函数在有序序列中查找第一个大于或等于给定值的元素。换句话说,它返回指向序列中第一个
不小于(即大于或等于)
给定值的元素的迭代器。 - upper_bound:与lower_bound类似,但upper_bound查找的是第一个大于给定值的元素。也就是说,它返回指向序列中第一个
大于
给定值的元素的迭代器。
参数列表
- lower_bound 和 upper_bound 的参数列表是相似的,通常包含三个或四个参数:
- 指向序列起始位置的迭代器(begin)。
- 指向序列结束位置后一个位置的迭代器(end)。注意这里的end是指向序列末尾元素的下一个位置的迭代器,即序列是左闭右开的区间。
- 要查找的目标值(num)。
- (可选)比较函数对象,用于自定义比较规则。
返回值
- lower_bound 和 upper_bound 的返回值都是迭代器。
- 如果找到了满足条件的元素,lower_bound 返回指向第一个大于或等于目标值的元素的迭代器,而 upper_bound 返回指向第一个大于目标值的元素的迭代器。
- 如果没有找到满足条件的元素,两个函数都返回指向end的迭代器。
应用实例
假设我们有一个递增的有序整数数组a,我们要查找第一个大于或等于3的元素和第一个大于3的元素。
#include <algorithm>
#include <vector>
#include <iostream>
int main() {
std::vector<int> a = {1, 2, 3, 4, 5, 6};
int target = 3;
// 使用lower_bound查找第一个大于或等于3的元素
auto lb = std::lower_bound(a.begin(), a.end(), target);
std::cout << "lower_bound found: " << *lb << std::endl; // 输出: lower_bound found: 3
// 使用upper_bound查找第一个大于3的元素
auto ub = std::upper_bound(a.begin(), a.end(), target);
std::cout << "upper_bound found: " << *ub << std::endl; // 输出: upper_bound found: 4
return 0;
}
在这个例子中,lower_bound 找到了第一个大于或等于3的元素,即3本身,而upper_bound 找到了第一个大于3的元素,即4。
需要注意的是,这两个函数都要求输入的序列是有序的。如果序列无序,这两个函数的结果将是未定义的。同时,返回的是迭代器,可以通过迭代器访问或操作找到的元素。如果未找到满足条件的元素,返回的迭代器将等于end,此时不能通过迭代器访问元素,否则会导致未定义行为。
作者 | 乐意奥AI