• STL之lower_bound和upper_bound


    ForwardIter lower_bound(ForwardIter first, ForwardIter last,const _Tp& val)算法返回一个非递减序列[first, last)中的第一个大于等于值val的位置。
    ForwardIter upper_bound(ForwardIter first, ForwardIter last, const _Tp& val)算法返回一个非递减序列[first, last)中第一个大于val的位置。

    示意图:

    lower_bound:

    函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小于val(插入元素),则返回last的位置,且last的位置是越界的。
    源代码:

    //这个算法中,first是最终要返回的位置
    int lower_bound(int *array, int size, int key)
    {
        int first = 0, middle;
        int half, len;
        len = size;
    
        while(len > 0) {
            half = len >> 1;
            middle = first + half;
            if(array[middle] < key) {     
                first = middle + 1;          
                len = len-half-1;       //在右边子序列中查找
            }
            else
                len = half;            //在左边子序列(包含middle)中查找
        }
        return first;
    }
    

    upper_bound:

    函数upper_bound()在first和last中前闭后开区间进行二分查找,返回最后一个大于等于val的元素的位置。如果所有元素小于val(插入元素),则返回last的位置,且last的位置是越界的。
    源代码:

    int upper_bound(int *array, int size, int key)
    {
        int first = 0, len = size-1;
        int half, middle;
    
        while(len > 0){
            half = len >> 1;
            middle = first + half;
            if(array[middle] > key)     //中位数大于key,在包含last的左半边序列中查找。
                len = half;
            else{
                first = middle + 1;    //中位数小于等于key,在右半边序列中查找。
                len = len - half - 1;
            }
        }
        return first;
    }
    
  • 相关阅读:
    k8spod资源的基础管理操作
    k8s名称空间资源
    bzoj5011: [Jx2017]颜色
    bzoj5010: [Fjoi2017]矩阵填数
    bzoj5008: 方师傅的房子
    bzoj5007: TCP协议
    bzoj5003: 与链 5004: 开锁魔法II 5005:乒乓游戏
    bzoj5020: [THUWC 2017]在美妙的数学王国中畅游
    bzoj5006: [THUWC2017 Bipartite]随机二分图
    bzoj4480: [Jsoi2013]快乐的jyy
  • 原文地址:https://www.cnblogs.com/ZhaoxiCheung/p/5455753.html
Copyright © 2020-2023  润新知