C++ upper_bound lower_bound

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值