C++ 函数lower_bound & upper_bound
lower_bound和upper_bound函数是库文件<algorithm>中的函数。因此使用是务必在程序开头添加#include <algorithm>.
upper_bound
调用格式
- 版本一
template <class ForwardIterator, class T> ForwardIterator upper_bound (ForwardIterator first, ForwardIterator last, const T& val);- 版本二
template <class ForwardIterator, class T, class Compare> ForwardIterator upper_bound (ForwardIterator first, ForwardIterator last, const T& val, Compare comp);- 功能描述
这是二分查找(binary search)的一种版本,试图在已排序的范围[first,last)中寻找val,它会返回“在不破坏顺序的情况下,可插入val的最后一个位置”。若范围内有与val相等的元素,则返回一个迭代器,其指向[first,last)范围内最后一个val相等的元素的后一个元素。
注意:返回的迭代器所指的元素肯定不会等于val
- 实现代码
此模板函数的功能和如下代码一样:
template <class ForwardIterator, class T> ForwardIterator upper_bound (ForwardIterator first, ForwardIterator last, const T& val) { ForwardIterator it; iterator_traits<ForwardIterator>::difference_type count, step; count = std::distance(first,last); while (count>0) { it = first; step=count/2; std::advance (it,step); if (!(val<*it)) // or: if (!comp(val,*it)), for version (2) { first=++it; count-=step+1; } else count=step; } return first; }
lower_bound
调用格式
- 版本一
template <class ForwardIterator, class T> ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last, const T& val);- 版本二
template <class ForwardIterator, class T, class Compare> ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last, const T& val, Compare comp);功能描述 返回指向lower bound的迭代器
这是二分查找(binary search)的一种版本,试图在已排序的[first,last)中寻找元素val,若范围内有与val相等的元素,则返回一个迭代器,其指向[first,last)范围内第一个等于val的元素。若范围内没有与val相等的元素,则返回一个迭代器,其指向[first,last)范围内第一个不小于val的元素。若范围内所有元素都小于val,则返回last。
第一个版本元素通过操作符<进行比较,第二个版本则通过comp进行比较。范围内的元素应该是已经根据同样规则(<或comp)排好序的,至少是相对于val进行了划分。
此函数通过比较不连续的值优化了比较的次数(实质为二分查找),这对于可进行随机访问的迭代器来说非常有效。
注意:不像
upper_bound,返回的迭代器所指的值不一定大于val,还可能等于val。实现代码
此模板函数的功能和如下代码一样:
template <class ForwardIterator, class T> ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last, const T& val) { ForwardIterator it; iterator_traits<ForwardIterator>::difference_type count, step; count = distance(first,last); while (count>0) { it = first; step=count/2; advance (it,step); if (*it<val) { // or: if (comp(*it,val)), for version (2) first=++it; count-=step+1; } else count=step; } return first; }
comp 函数
comp函数可以是函数指针,lamda表达式或者仿函数。
函数
bool comp(int x, int y){ return x < y; }示例:
lower_bound(vec.begin(), vec.end(),comp)lamda
示例:
lower_bound(vec.begin(), vec.end(), [](int x, int y){return x < y;});
仿函数
class comp{ public: bool operator()(int x, int y){ return x < y; } };示例:
lower_bound(vec.begin(), vec.end(),comp())
本文详细介绍了C++标准库中的lower_bound和upper_bound函数,包括它们的调用格式、功能描述及实现代码。此外,还讲解了如何使用自定义比较函数comp来满足不同场景的需求。
9万+

被折叠的 条评论
为什么被折叠?



