一、lower_bound
头文件algorithm
default (1)
template <class ForwardIterator, class T>
ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last,
const T& val);
custom (2)
template <class ForwardIterator, class T, class Compare>
ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last,
const T& val, Compare comp);
将迭代器返回到下限
返回指向范围[first,last]中第一个元素的迭代器,它不会比val小。
使用operator <作为第一个版本比较元素,comp作为第二个版本。 范围中的元素已经按照相同的标准(operator <或comp)进行排序,或者至少按照val进行分区。
该函数通过比较排序范围的非连续元素来优化执行的比较次数,这对于随机访问迭代器特别有效。
与upper_bound不同,此函数返回的迭代器指向的值也可能等于val,而不仅仅是更大。
此函数模板的行为等效于:
template <class ForwardIterator, class T>
ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last, const T& val)
{
ForwardIterator it;
iterator_traits<ForwardIterator>::difference_type count, step;
count = distance(first,last);
while (count>0)
{
it = first; step=count/2; advance (it,step);
if (*it<val) { // or: if (comp(*it,val)), for version (2)
first=++it;
count-=step+1;
}
else count=step;
}
return first;
}
参数
- first,last
将迭代器转发到已排序(或正确分区)序列的初始位置和最终位置。使用的范围是[first,last),它包含first和last之间的所有元素,包括first指向的元素,但不包括last指向的元素。 - val
要在范围内搜索的下限值。
对于(1),T应该是支持与作为运算符<的右侧操作数的范围[first,last]的元素进行比较的类型。 - comp
二进制函数接受两个参数(ForwardIterator指向的第一个类型,第二个,始终为val),并返回一个可转换为bool的值。返回的值表示第一个参数是否被认为是在第二个参数之前。
该函数不得修改其任何参数。这可以是函数指针或函数对象。
返回值
到范围中val下限的迭代器。
如果范围中的所有元素都比val小,则函数返回last。
复杂度
平均而言,第一个和最后一个之间距离的对数:执行大约log2(N)+1个元素比较(其中N是该距离)。
在非随机访问迭代器上,迭代器的进展产生了N平均额外的线性复杂度。
二、upper_bound
头文件algorithm
default (1)
template <class ForwardIterator, class T>
ForwardIterator upper_bo