zoukankan      html  css  js  c++  java
  • lower_bound

    头文件:

    #include<algorithm>

    作用:

    查找第一个大于或等于给定数的元素或位置

    在从小到大的排列数组中

    注意注意:

      是排列好的,

      一般都是从小到大,

      但从大到小也可以,

      只不过做法与常规的从小到大的不太一样

    查找有序区间中第一个大于或等于某给定值的元素的位置

    其中排序规则可以通过二元关系来表示

    代码举例:

    1.针对容器

    (1).得到具体的元素

    #include<cstdio>
    #include<vector>
    #include<algorithm>
    using namespace std;
    vector<int> v;
    int main()
    {
        for(int i = 1;i < 4;i++)
            v.push_back(2 * i);//注意:此时v中的元素本身就是有序的
        vector<int>::iterator it = lower_bound(v.begin(),v.end(),3);
        printf("%d
    ",*it);
        return 0; 
    }

    (2).得到位置

    用到了指针偏移的技巧,只需要前去起始位置的指针即可

    #include<cstdio>
    #include<algorithm>
    #include<vector>
    using namespace std;
    vector<int> v;
    int main()
    {
        for(int i = 1;i < 4;i++)
            v.push_back(i * 2);//注意:此时v中的元素本身就是有序的 
        int pos = lower_bound(v.begin(),v.end(),3) - v.begin();
        printf("%d
    ",pos);
        return 0;
    }
    这时候返回pos就是所查找元素的位置,下标,
    这里查找到的元素应该是4在容器中的下标是1,
    所以输出pos的结果就是1


    2.针对数组

    返回元素

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    int main()
    {
        int a[4] = {2,4,6,8};
        int *it = lower_bound(a,a+4,3);
        printf("%d
    ",*it);
        return 0;
    }

    返回位置

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    int main()
    {
        int a[4] = {2,4,6,8};//注意:初始化中的元素本身就是有序的
        int pos = lower_bound(a,a+4,3)-a;
        printf("%d
    ",pos);
        return 0; 
     } 

    以上都是针对从小到大排列好的

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

    下面是从大到小排列好的

    函数

      greater<int>()

    头文件
      #include<functional>

    假如说像上边一样元素为2 4 6 8,

    逆序则是8 6 4 2,

    那么求距离3最近表示的是与3最近的小于等于3的元素,

    输出结果则是元素2了,

    代码如下:

    #include<cstdio>
    #include<algorithm>
    #include<vector>
    #include<functional>
    using namespace std;
    vector<int> v;
    int main()
    {
        for(int i = 4;i > 0;i--)
            v.push_back(i * 2);
        vector<int>::iterator it = lower_bound(v.begin(),v.end(),3,greater<int>());
        printf("%d
    ",*it);
        return 0;
    }
    说明,要查找的有序序列必须是合法的,已经被排序的序列。
  • 相关阅读:
    【Codeforces 349B】Color the Fence
    【Codeforces 459D】Pashmak and Parmida's problem
    【Codeforces 467C】George and Job
    【Codeforces 161D】Distance in Tree
    【Codeforces 522A】Reposts
    【Codeforces 225C】Barcode
    【Codeforces 446A】DZY Loves Sequences
    【Codeforces 429B】Working out
    【Codeforces 478C】Table Decorations
    【Codeforces 478C】Table Decorations
  • 原文地址:https://www.cnblogs.com/darlingroot/p/10395527.html
Copyright © 2011-2022 走看看