码迷,mamicode.com
首页 > 编程语言 > 详细

C++ STL 界限函数

时间:2017-03-24 21:45:36      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:取值   n+1   stream   包含   原型   name   应用   main   ret   

  c++提供一类STL函数来实现对数组中元素的检索,其中较为简单且应用较广的是binary_search,upper_bound和lower_bound,它们都被包含在头文件#include<algorithm>中,用法如下:

//STL
//lower_bound与upper_bound
#include<iostream>
#include<algorithm>//包含这两个界限函数的头文件
#include<cstdio>
using namespace std;
int a[]={0,4,4,11,30,69,70,96,100},n=8,m,x,y,z,w;
void find_lower_bound(int aim)
{
    int x=1,y=n,m;
    while(x<y)
    {
        int m=x+(y-x)/2;
        if(a[m]>=aim) y=m;
        else x=m+1;
    }
    printf("\nlower_bound:%d",x);//因为最后x=y,所以输出x和输出y是一样的
}
void find_upper_bound(int aim)
{
    int x=1,y=n,m;
    while(x<y)
    {
        int m=x+(y-x)/2;
        if(a[m]<=aim) x=m+1;
        else y=m;
    }
    printf("\nupper_bound:%d",x);//同上
}
int main()
{
//    std::ios::sync_with_stdio(false);//这句话用来加快cin和cout的速度,但使用后cin,cout不能与scanf,printf混用,所以慎用
//    cin>>n;
//    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
//    sort(a+1,a+n+1);
//    cin>>m;
    x=lower_bound(a,a+n,3)-a;//要注意写法
    y=upper_bound(a,a+n,4)-a;
    z=binary_search(a,a+n,11);//判断是否存在,是返回真值
    w=binary_search(a,a+n,3);//不存在则返回假值
    printf("%d %d %d %d ",x,y,z,w);
    find_lower_bound(3);//函数原型
    find_upper_bound(4);//函数原型
    return 0;
}
  这里的函数原型其实是二分算法,注意两个函数的区别在于当a[m]=aim时到底是向前缩短区间还是向后缩短区间,这关系到最后x的取值。

C++ STL 界限函数

标签:取值   n+1   stream   包含   原型   name   应用   main   ret   

原文地址:http://www.cnblogs.com/SWiper/p/6613528.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!