📅  最后修改于: 2023-12-03 14:59:45.565000             🧑  作者: Mango
upper_bound()
函数在 C++ 中,标准模板库 (STL) 是一个极其强大的工具,被广泛地应用于很多实际的编程问题中。其中, algorithm
是STL中最常用的库之一,提供了很多常用数据结构以及一些常见算法的函数实现。这里,我们将会介绍其中的一个重要函数,upper_bound()
。
upper_bound()
函数是一个二分查找函数,用于在有序容器中,查找某一个值在容器中可以插入的最后一个位置(“上界”)的迭代器。而有序容器则指按照某一特定顺序排列的容器,比如 C++ 中的 std::set
以及 std::map
。
函数原型如下:
template<class ForwardIt, class T>
ForwardIt upper_bound(ForwardIt first, ForwardIt last, const T& value);
template<class ForwardIt, class T, class Compare>
ForwardIt upper_bound(ForwardIt first, ForwardIt last, const T& value, Compare comp);
其中,第一个参数和第二个参数类似于其他算法的迭代器区间,分别指定在那个范围内查找。第三个参数 value
则表示待查找的目标值。函数会返回一个迭代器,指向最后一个大于 value
的元素。
如果查找失败,即我们所查找的值大于整个容器的最大值,那么返回值则是该有序容器的尾后迭代器 last
。
第三个参数 comp
是一个可选参数,表示自定义比较函数(comparator)。对于一个内置数据类型和一些标准容器(如 std::set
和 std::map
),upper_bound
默认使用“小于”比较,即 operator<
. 对于其他类型,如果没有明确定义大小关系,我们需要提供一个比较函数。
以求有序容器 std::set
中,小于 value
的最后一个元素为例。
#include<iostream>
#include<set>
#include<algorithm>
using namespace std;
int main(){
set<int> s{2, 4, 6, 8, 10};
int value = 5;
auto it = upper_bound(s.begin(), s.end(), value);
// 求解小于5的最后一个元素
cout << *(--it) << endl;
return 0;
}
输出为:
4
这里, upper_bound()
找到了元素 6
,因为它是第一个不小于 value
的数字。指向它的迭代器被传递给 '--'
操作符,从而指向了剩余元素中,最后一个小于 value
的元素。
由于 upper_bound()
实现时使用了二分查找算法,所以它的时间复杂度为 $O(logn)$ 。
upper_bound()
是一个非常有用的二分查找函数,,可以帮助程序员轻松快捷地找到有序容器中最后一个满足条件的元素。程序员应该广泛地运用到这一函数,从而提高自己的程序能力。