std::upper_bound()
std::upper_bound() 是一个 STL 库函数,属于算法头库,在一个范围内找到搜索元素的上界。上限表示搜索元素的排序范围中的下一个较大元素。
假设范围是:[4, 5, 6, 9, 12] 并且搜索元素是6,那么上限是9本身。如果搜索元素为 7,则上限将再次为 9。
案例:
- 当存在搜索元素时:
std::upper_bound()返回一个迭代器到搜索元素的下一个更大的元素 - 当搜索元素不存在时:
- 如果所有元素都大于搜索元素:
upper_bound()返回一个迭代器到范围的开始。 - 如果所有元素都低于搜索元素:
upper_bound()返回到范围末尾的迭代器(不存在上限)。 - 否则,
upper_bound()返回到范围内搜索元素(比搜索元素大的最近元素)的下一个更大元素的迭代器。
- 如果所有元素都大于搜索元素:
要使用 upper_bound(),需要对范围进行排序。
用法:
ForwardIterator upper_bound( ForwardIterator first, ForwardIterator last, const T& searching_element );
参数:
ForwardIterator first
:iterator 到范围的开始ForwardIterator last
:iterator 到范围的末尾const T& searching_element
:T
是数据类型和searching_element
是要找到上限的元素
返回类型:返回类型是在范围内找到的上限的迭代器。
C++ 实现:
#include <bits/stdc++.h>
using namespace std;
int main()
{
vector<int> arr{ 6, 5, 9, 12, 4 };
//sort before using upper_bound()
sort(arr.begin(), arr.end());
int searching_element = 6;
vector<int>::iterator it;
it = upper_bound(arr.begin(), arr.end(), searching_element);
//if all elements are smaller than the searching
//element then no upper bound exists
if (it == arr.end()) {
cout << "No upper bound exists\n";
}
else
cout << "Upperr bound of " << searching_element << ":" << *it << endl;
searching_element = 7;
it = upper_bound(arr.begin(), arr.end(), searching_element);
//if all eleemnts are smaller than the searching
//element then no upper bound exists
if (it == arr.end()) {
cout << "No upper bound exists\n";
}
else
cout << "Upper bound of " << searching_element << ":" << *it << endl;
return 0;
}
输出:
Upperr bound of 6:9 Upper bound of 7:9
在上面的 upper_bound() 函数中,使用默认比较器运算符 '<' 来比较元素之间。
但是我们有一个扩展版本函数,它使用用户定义的比较器来比较黑白元素。
ForwardIterator upper_bound( ForwardIterator first, ForwardIterator last, const T& searching_element, Comparator comp );
参数:
ForwardIterator first
:iterator 到范围的开始ForwardIterator last
:iterator 到范围的末尾const T& searching_element
:T
是数据类型和searching_element
是要找到上限的元素Comparator comp
:用户定义的比较器
返回类型:返回类型是在范围内找到的上限的迭代器。
如果您有用户定义的数据类型,这会很有帮助。
相关用法
- C++ std::uniform_int_distribution min()用法及代码示例
- C++ std::uniform_real_distribution reset()用法及代码示例
- C++ std::uniform_int_distribution reset()用法及代码示例
- C++ std::uniform_real_distribution max()用法及代码示例
- C++ std::uniform_real_distribution min()用法及代码示例
- C++ std::unique用法及代码示例
- C++ std::underlying_type用法及代码示例
- C++ std::uniform_int_distribution a()用法及代码示例
- C++ std::uniform_int_distribution max()用法及代码示例
- C++ std::unique_copy用法及代码示例
- C++ std::uniform_real_distribution b()用法及代码示例
- C++ std::unary_negate()用法及代码示例
- C++ std::uniform_real_distribution a()用法及代码示例
- C++ std::uniform_int_distribution b()用法及代码示例
- C++ std::max()用法及代码示例
- C++ std::string::push_back()用法及代码示例
- C++ std::less_equal用法及代码示例
- C++ std::is_member_object_pointer模板用法及代码示例
- C++ std::copy_n()用法及代码示例
- C++ std::string::insert()用法及代码示例
注:本文由纯净天空筛选整理自 std::upper_bound() function with example in C++ STL。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。