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\n",*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\n",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\n",*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\n",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\n",*it);
    return 0;
}

 

说明,要查找的有序序列必须是合法的,已经被排序的序列。

 

posted @ 2019-02-18 14:39  darrrr  阅读(185)  评论(0编辑  收藏  举报