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;
}