lower_bound()函数和upper_bound()函数

1、lower_bound()函数
在不破坏排序状态的原则下,可插入value的第一个位置
template<class ForwardIt, class T>
ForwardIt lower_bound(ForwardIt first, ForwardIt last, const T& value)
{
    ForwardIt it;
    typename std::iterator_traits<ForwardIt>::difference_type count, step;
    count = std::distance(first, last);
 
    while (count > 0) { //因为序列是有序的,因此执行二分查找
        it = first; 
        step = count / 2; 
        std::advance(it, step); //前进step步
        if (*it < value) { //大于才进入右区间,等于都应该进入左区间,因为是求第一个位置</span><span style="font-size: 22px;">
            first = ++it; 
            count -= step + 1; 
        }
        else //进入左区间
            count = step;
    }
    return first;
}

2、upper_bound()函数
在不破坏排序状态的原则下,可插入value的最后一个合适位置
template<class ForwardIt, class T>
ForwardIt upper_bound(ForwardIt first, ForwardIt last, const T& value)
{
    ForwardIt it;
    typename std::iterator_traits<ForwardIt>::difference_type count, step;
    count = std::distance(first,last);
 
    while (count > 0) { //因为序列是有序的,因此执行二分查找</span><span style="font-size: 22px;">
        it = first; 
        step = count / 2; //中间
        std::advance(it, step); //前进step步
        if (!(value < *it)) {  //进入右区间,大于等于都进入右区间,因为是求最后一个满足条件的位置</span><span style="font-size: 22px;">
            first = ++it;
            count -= step + 1;
        } else count = step;
    }
    return first;
}

你可能感兴趣的:(lower_bound()函数和upper_bound()函数)