语法:STL中的有关二分查找的算法

9 篇文章 0 订阅
7 篇文章 0 订阅

STL加入C++11标准为C++注入了新的活力,其中提出的泛型编程为C++程序带来了翻天覆地的变化,一些泛化的算法实现让编程变得简单高效。STL 中有关二分查找的算法主要有三个:lower_bound、upper_bound、binary_search。参照《STL源码分析》对三个算法做个笔记。

  • lower_bound指向一个前闭后开区间[first,last)中大于等于指定值value的最小元素坐在的位置。如果vaule存在,返回指向value位置的迭代器。如果value大于区间里的所有制,返回last。
    该算法有两个实现版本,一种是重载运算符<,一种是采用函数对象(仿函数)。
    1、重载运算符operator <:
template<class ForwardIterator,class T>
inline ForwardIterator lower_bound(ForwardIterator first,ForwardIterator last,const T& value){
    return __lower_bound(first,last,value,distance_type(first),iterator_category(first));
}

辅助函数__lower_bound的实现:

template<class ForwardIterator,class T,class Distance>
ForwardIterator __lower_bound(ForwardIterator first,ForwardIterator last,const T& value,Distance*,forward_iterator_tag){
    Distance len=0;
    distance(first,last,len);
    Distance half;
    ForwardIterator middle;
    while(len>0){
        half=len>>1;
        middle=first;
        advance(middle,half);
        if(*middle<value){
            first=middle;
            ++first;
            len=len-half-1;
        }
        else{
            len = half;
        }
    }
    return first;
}

2、函数对象

template<class ForwardIterator,class T,class Compare>
inline ForwardIterator lower_bound(ForwardIterator first,ForwardIterator last,const T& value,Compare comp){
    return __lower_bound(first,last,value,comp,distance_type(first),iterator_category(first));
}
  • upper_bound指向一个前闭后开区间[first,last)中大于指定值value的最小元素坐在的位置。upper_bound返回的是不破坏排序状态的情况下,value可被插入的“最后一个”合适位置。如果value存在,返回的迭代器指向value的下一位置。
    跟lower_bound类似,upeer_bound有两个实现版本,重载运算符和函数对象实现。

  • binary_search是一种精确的二分查找法,试图在排序的[first,last)中寻找指定值value,如果有返回true,没有返回false。
    bianary_search借助于lower_bound先找出“假设value存在时应出现的位置”,然后对比该位置上的值是否为我们要找的value。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值