• 二分模板以及STL中的查找


    二分查找的基本实现

    int b_search(int key,int a[],int n)
    {
        int l=0,r=n-1;
        while (l<=r)
        {
            int m=(l+r)/2;
            if (a[m]==key) return m;
            if (a[m]<key) l=m+1;
            else r=m-1;
        }
        return -1;
    }
    

    STL中的二分查找

    int k=lower_bound(a,a+n,key)-a;
    int k=upper_bound(a,a+n,key)-a;

    lower_bound()返回数组中>=key的第一个元素的位置

    upper_bound()返回数组中>key的第一个元素的位置

    -------------------

    ForwardIterator lower_bound (ForwardIterator first,ForwardIterator last, const T& value)
    ForwardIterator lower_bound (ForwardIterator first,ForwardIterator last, const T& value, Compare comp)
    //查找最远的一个iterator i, 使得[first,i)里面的任意一个iterator j,有 *j < value or comp(*j,value)==true. 


    ForwardIterator upper_bound (ForwardIterator first,ForwardIterator last, const T& value)
    ForwardIterator upper_bound (ForwardIterator first,ForwardIterator last, const T& value, Compare comp)
    //查找最远的一个iterator i, 使得[first,i)里面的任意一个iterator j,有 !(*j < value) or comp(*j,value)==false. 


    pair equal_range(ForwardIterator first, ForwardIterator last, const T& value)
    pair equal_range(ForwardIterator first, ForwardIterator last, const T& value, Compare comp)
    //查找最大的subrange[i,j),使得任意一个iterator in [i,j)满足!(*k<value) && !(value<*k) or comp(*k,value)==false && comp(value,*k)==false.

    vector<Widget> vw;
    ...
    sort(vw.begin(), vw.end());
    typedef vector<Widget>::iterator VWIter; // 方便的typedef
    typedef pair<VWIter, VWIter> VWIterPair;
    VWIterPair p = equal_range(vw.begin(), vw.end(), w);
    if (p.first != p.second) {   // 如果equal_range不返回
         // 空的区间...
     ...    // 说明找到了,p.first指向
         // 第一个而p.second
         // 指向最后一个的下一个
    } else {
     ...    // 没找到,p.first和
         // p.second都指向搜索值
    }     // 的插入位置
    



    bool binary_search (ForwardIterator first, ForwardIterator last, const T& value)
    bool binary_search (ForwardIterator first, ForwardIterator last, const T& value, Compare comp)
    // 查找是否在[first,last)中存在iterator i,满足 !(*i<value) && !(value<*i) or comp(*i,value)==false && comp(value,*i)==false
    // 存在则返回true,否则返回false.  


    STL中的其他查找

    count:计算对象区间中的数目。
    find:返回第一个对象的位置。

    list<Widget> lw;   // Widget的list
    Widget w;    // 特定的Widget值
    ...
    if (count(lw.begin(), lw.end(), w)) {
     ...   // w在lw中
    } else {
     ...   // 不在
    }

    if (find(lw.begin(), lw.end(), w) != lw.end()) {
     ...    // 找到了
    } else {
     ...    // 没找到
    }


    适用情况



    你想知道的  在无序区间 在有序区间  在set或map上 在multiset或multimap上
    期望值是否存在? find binary_search  count find
    期望值是否存在?如果有,第一个等于这个值的对象在哪里? find  equal_range  find  find或lower_bound(参见下面)
    第一个不在期望值之前的对象在哪里? find_if lower_bound lower_bound lower_bound
    第一个在期望值之后的对象在哪里? find_if upper_bound upper_bound upper_bound
    有多少对象等于期望值? count equal_range,然后distance count count
    等于期望值的所有对象在哪里? find(迭代) equal_range equal_range equal_range

      
        


     

     

     

     

     

     

     

     

     





  • 相关阅读:
    Gitlab 与 Git Windows 客户端一起使用的入门流程
    怎样把SEL放进NSArray里
    PerformSelector may cause a leak because its selector is unknown 解决方法
    drawRect
    记录常规越狱的判断方法
    网页 js
    UICollectionView 基础
    FMDB的简单使用
    图层的一些基本动画效果
    NSPredicate简单介绍
  • 原文地址:https://www.cnblogs.com/cyendra/p/3226375.html
Copyright © 2020-2023  润新知