C++ std::upper_bound函数用法全面解析 在C++标准模板库(STL)的算法工具箱中,std::upper_bound是一个高效且精准的查找工具。它的核心功能是在一个已排序的区间 [first, last) 内,快速找到第一个严格大于指定值 value 的元素。该函数通过二分查找算法
在C++标准模板库(STL)的算法工具箱中,std::upper_bound是一个高效且精准的查找工具。它的核心功能是在一个已排序的区间 [first, last) 内,快速找到第一个严格大于指定值 value 的元素。该函数通过二分查找算法实现,直接返回指向目标元素的迭代器,是处理有序数据时的关键函数。
首先了解std::upper_bound的标准函数签名,这是正确使用的基础:
template
ForwardIterator upper_bound (ForwardIterator first, ForwardIterator last, const T& val);
该函数在指定范围[first, last)内搜索,返回第一个使“元素值大于val”成立的位置的迭代器。如果找不到这样的元素,则返回last,即区间的尾后迭代器。返回的迭代器类型与输入迭代器相同。
对于std::vector、std::array等有序顺序容器,直接使用容器的begin()和end()迭代器调用upper_bound(),可在O(log n)时间复杂度内完成查找,效率极高。
下面是std::upper_bound在vector中的使用示例:
#include
#include
#include
using namespace std;
int main() {
vector
// 查找第一个大于3的元素
auto it = upper_bound(v.begin(), v.end(), 3);
if (it != v.end()) {
cout << *it << endl; // 输出:4
}
return 0;
}

若要获取首个大于指定值的元素下标(索引),可以这样计算:
int idx = upper_bound(v.begin(), v.end(), 3) - v.begin();
cout << idx << endl; // 输出:3
输出结果3对应值为4的元素位置,符合“第一个大于3”的逻辑预期。

std::upper_bound同样适用于普通数组,此时传递的迭代器即为指针。以下是数组查找示例:
#include
#include
using namespace std;
int main() {
int arr[] = {10, 20, 30, 40, 50};
int n = sizeof(arr) / sizeof(arr[0]);
// 查找第一个大于25的元素
int* p = upper_bound(arr, arr + n, 25);
if (p != arr + n) {
cout << *p << endl; // 输出:30
}
return 0;
}
输出30,因为它是数组中第一个大于25的数。

该函数还支持对数组的任意子区间进行查找。常用写法如下:int pos = upper_bound(a + l, a + r, m) - a;
此语句用于获取数组a在子区间[l, r)内第一个大于m的元素在整个数组中的索引。其中a为数组起始指针,l和r定义了查找区间的左右边界。这种用法在算法竞赛和局部数据处理中非常常见。

侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述