upper_bound与lower_bound只有三个参数即
upper_bound(_FIter, _FIter, const _Tp&);
lower_bound同理
第一个参数一般为一个迭代器的起始,即begin(),第二个参数一般为end(),第三个参数为val值
upper_bound返回第一个大于val的值对应的迭代器,lower_bound返回第一个大于等于val的值对应的迭代器
容器必须有序,一般情况下是从小到大排列,默认比较函数是小于返回true,下面是upper_bound的函数定义
upper_bound(_ForwardIterator __first, _ForwardIterator __last,
const _Tp& __val)
{
typedef typename iterator_traits<_ForwardIterator>::value_type
_ValueType;
typedef typename iterator_traits<_ForwardIterator>::difference_type
_DistanceType;
// concept requirements
__glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
__glibcxx_function_requires(_LessThanOpConcept<_Tp, _ValueType>)
__glibcxx_requires_partitioned_upper(__first, __last, __val);
_DistanceType __len = std::distance(__first, __last);
while (__len > 0)
{
_DistanceType __half = __len >> 1;
_ForwardIterator __middle = __first;
std::advance(__middle, __half);
if (__val < *__middle) //默认小于号
__len = __half;
else
{
__first = __middle;
++__first;
__len = __len - __half - 1;
}
}
return __first;
}
读代码发现其实为一种二分查找
当有第四个参数即比较函数cmp的时候,若容器是从大到小排列的,比较函数cmp得变为大于返回true。下面是upper_bound有四个参数时的函数定义。
upper_bound(_ForwardIterator __first, _ForwardIterator __last,
const _Tp& __val, _Compare __comp)
{
typedef typename iterator_traits<_ForwardIterator>::value_type
_ValueType;
typedef typename iterator_traits<_ForwardIterator>::difference_type
_DistanceType;
// concept requirements
__glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
__glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
_Tp, _ValueType>)
__glibcxx_requires_partitioned_upper_pred(__first, __last,
__val, __comp);
_DistanceType __len = std::distance(__first, __last);
while (__len > 0)
{
_DistanceType __half = __len >> 1;
_ForwardIterator __middle = __first;
std::advance(__middle, __half);
if (__comp(__val, *__middle)) //比较函数
__len = __half;
else
{
__first = __middle;
++__first;
__len = __len - __half - 1;
}
}
return __first;
}