在 C++ 中,
lower_bound
和upper_bound
是标准库<algorithm>
中的两个重要函数,用于在已排序的范围内查找元素的位置。它们通常用于与std::vector
、std::deque
、std::array
等容器一起使用,特别是在需要高效的查找操作时。
注意,需要在已经排序的范围使用
lower_bound
定义:std::lower_bound
是一个函数模板,用于在已排序的范围内查找第一个不小于给定值的元素的位置。
原型:
//1.默认比较函数
template< class ForwardIterator, class T >
ForwardIterator lower_bound( ForwardIterator first, ForwardIterator last, const T& value );
//2.自定义比较函数
template< class ForwardIterator, class Compare, class T >
ForwardIterator lower_bound( ForwardIterator first, ForwardIterator last, const T& value, Compare comp );
first
和last
:表示要搜索的范围[first, last)
。//begin()~end();value
:要查找的值。comp
(可选):一个比较函数对象,用于自定义排序规则,默认为升序。
返回值:
返回一个迭代器,指向第一个不小于 value
的元素。如果所有元素都小于 value
,则返回 last
。
last:数组尾元素的下一个,不管value多大,迭代器永远指向尾元素的下一个位置
示例:
#include <algorithm>
#include <vector>
#include <iostream>
int main() {
std::vector<int> v = { 1, 2, 4, 4, 5, 6 };
std::vector<int>::iterator it= std::lower_bound(v.begin(), v.end(), 4);
if (it != v.end()) {
std::cout << "data: " << *it << std::endl; // 输出: 4
std::cout << "where: " << std::lower_bound(v.begin(), v.end(), 4) - v.begin() << std::endl; // 输出: 2
}
return 0;
}
upper_bound
定义:std::upper_bound
是一个函数模板,用于在已排序的范围内查找第一个大于给定值的元素的位置。
原型:
//1.默认比较函数
template< class ForwardIterator, class T >
ForwardIterator upper_bound( ForwardIterator first, ForwardIterator last, const T& value );
//2.自定义比较函数
template< class ForwardIterator, class Compare, class T >
ForwardIterator upper_bound( ForwardIterator first, ForwardIterator last, const T& value, Compare comp );
first
和last
:表示要搜索的范围[first, last)
。value
:要查找的值。comp
(可选):一个比较函数对象,用于自定义排序规则,默认为升序。
返回值:
返回一个迭代器,指向第一个大于 value
的元素。如果所有元素都不大于 value
,则返回 last
。
示例:
#include <algorithm>
#include <vector>
#include <iostream>
int main() {
std::vector<int> v = { 1, 2, 4, 4, 5, 6 };
std::vector<int>::iterator it= std::upper_bound(v.begin(), v.end(), 4);
if (it != v.end()) {
std::cout << "data: " << *it << std::endl; // 输出: 5
std::cout << "where: " << std::upper_bound(v.begin(), v.end(), 4) - v.begin() << std::endl; // 输出: 4
}
return 0;
}
lower_bound
与 upper_bound
的区别
-
查找条件:
lower_bound
查找的是第一个不小于value
的元素。upper_bound
查找的是第一个大于value
的元素。
-
适用场景:
lower_bound
用于确定值在容器中的插入位置,并包含等于该值的元素。upper_bound
用于确定值在容器中的插入位置,不包含等于该值的元素。