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())