函数定义
std::lower_bound 返回第一个大于等于value值的迭代器,如果没有查找到,则返回无效迭代器;std::lower_bound returns an iterator pointing to the first element in the range [first, last) that is not less than (i.e. greater or equal to) value, or last if no such element is found.
std::upper_bound返回第一个大于value值的迭代器,如果没有查找到,返回无效迭代器;std::upper_bound returns an iterator pointing to the first element in the range [first, last) that is greater than value, or last if no such element is found.
这个两个函数内部使用的都是二分查找法,被查找的对象必须是有序的,否则会出现非期望结果。
测试代码
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
std::vector<int> data = { 1, 3, 4, 5, 5, 6 };
size_t input_data = 1;
for(; input_data < data.size(); input_data++)
{
std::cout << "input data is : " << input_data << std::endl;
auto iter_lower = std::lower_bound(data.begin(), data.end(), input_data);
if (iter_lower != data.end())
{
std::cout << "lower data[index] is:" << *iter_lower
<< " >= " << input_data << " lower index : "
<< std::distance(data.begin(), iter_lower) << std::endl;
}
auto iter_upper = std::upper_bound(data.begin(), data.end(), input_data);
if (iter_upper != data.end())
{
std::cout << "upper data[index] is:" << *iter_upper
<< " > " << input_data << " upper index : "
<< std::distance(data.begin(), iter_upper) << std::endl;
}
}
return 0;
}
测试输出
input data is : 1
lower data[index] is:1 >= 1 lower index : 0
upper data[index] is:3 > 1 upper index : 1
input data is : 2
lower data[index] is:3 >= 2 lower index : 1
upper data[index] is:3 > 2 upper index : 1
input data is : 3
lower data[index] is:3 >= 3 lower index : 1
upper data[index] is:4 > 3 upper index : 2
input data is : 4
lower data[index] is:4 >= 4 lower index : 2
upper data[index] is:5 > 4 upper index : 3
input data is : 5
lower data[index] is:5 >= 5 lower index : 3
upper data[index] is:6 > 5 upper index : 5
算法效率
-
由于该算法采用的是二分法进行查找,因此对于可随机访问的有序容器使用 algorithm 库中的 lower_bound 和 upper_bound 函数时间复杂度为O(logn),但对于set,multiset这种不能随机访问的有序容器,要用其自带的 lower_bound 和 upper_bound 的时间复杂度才为 O(logn)。