STL之lower_bound和upper_bound

lower_bound和upper_bound
代码:
int lower_bound(int *A,int x,int y,int v)
{
    int m;
    while(x<y)
    {
        m=x+(y-x)/2;
        if(A[m]>=v)
            y=m;
        else
            x=m+1;
    }
    return x;
}
int upper_bound(int *A,int x,int y,int v)
{
    int m;
    while(x<y)
    {
        m=x+(y-x)/2;
        if(A[m]<=v)
            x=m+1;
        else
            y=m;
    }
    return x;
}


下面来分析一下这段程序。首先,最后的返回值不仅可能是x,x+1,x+2,.....,y-1,还可能是y——如果v大于A[y-1],就只能插入这里了。这样,尽管查找区间是左闭右开区间[x,y),返回值的候选区间却是闭区间[x,y]。A[m]和v的各种关系所带来的影响如下。
A[m]=v:至少已经找到一个,而左边可能还有,因此区间变为[x,m]。
A[m]>v:所求位置不能在后面,但有可能是m,因此区间变为[x,m]。
A[m]<v:m和前面都不可行,因此区间变为[m,y]。
合并一下:A[m]>=v时新区间为[x,m],A[m]<v时新区间为[m+1,y]。
类似地,upper_bound一样,当v存在时返回它出现的最后一个位置的后面一个位置。如果不存在,返回这样一个下标i:在此处插入v(原来的元素A[i],A[i+1],....全部往后移动一个位置)后序列仍然有序。因此,只需把"if(A[m]>=v) y=m; else x=m+1;"改成"if(A[m]<=v) x=m+1;else y=m;"即可。
设lower_bound和upper_bound的返回值分别为L和R,则v出现的子序列为[L,R)。这个结论当v不在时也成立:此时L=R,区间为空。
格式:
例如,直接使用STL在数组a[50]里面寻找k
int x=lower_bound(a,a+50,k)-a;

总结一下: 其中如果寻找的value存在,那么lower_bound返回一个迭代器指向其中第一个这个元素。upper_bound返回一个迭代器指向其中最后一个这个元素的下一个位置(明确点说就是返回在不破坏顺序的情况下,可插入value的最后一个位置)。如果寻找的value不存在,那么lower_bound和upper_bound都返回“假设这样的元素存在时应该出现的位置”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值