C++primer学习:关于upper_bound和lower_bound的探究.

来源:互联网 发布:王鑫南京金贝网络 编辑:程序博客网 时间:2024/05/29 09:03

今天花了将近一个小时仔细研究了这两个范型算法以及关联容器定义的同名函数.下面就来讲一讲它们的用法和一些细节.

[1]首先是范型算法upper_bound与lower_bound;它们要求必须提供至少前向迭代器,且容器元素必须有序,每个算法都提供两个版本。

lower_bound(beg,end,val)lower_bound(beg,end,val,cmp);//upper_bound形式一样

主要探究了第二个版本,既定义我们自己的比较函数.其实cmp是一个可调用对象,它可以是函数指针,可以使bind生成的对象,可以是lambada表达式,也可以是一个函数类:

表面上,cmp接受两个形参:cmp(x,y)无论是lower还是upper都是在cmp成功时返回对应的迭代器,否则返回end,注意end不一定是尾后迭代器,它只是你传入迭代器范围内的最后一个.那么我们定义cmp时如何确定结构呢?首先lower和upper传入实参时不一样

lower将beg-end间迭代器所指对象传入x,将val传入y。

upper将迭代器所指传入y,将val传入x.但是它们都是在cmp成功时返回(或者找不到所求对象返回).

现在用一个例子来弄清楚它.假设我们有容器a,容器I,如何利用upper_bound找到第一个满足I[index]>x的index,index是a的元素.

======================================================================================

[方法1]:利用bind绑定.

注意到在写cmp时最好将形参与upper_bound中的参数对应起来.这样不会搞错关系.

bool cmp(vector<int>& I,int x, int index){    return I[index] > x;}    auto it= upper_bound(ar.begin(), ar.end(), x, bind(cmp, I, _1, _2));//要声明placeholder

方法2:利用lambda表达式实现:同样需要注意对应关系

auto it = upper_bound(ar.begin(), ar.end(), x, [&](int x, int index){ return I[index]>x; });

======================================================================================

至于关联容器中的upper_bound,lower_bound则由元素本身的<或者定义关联容器时提供的比较函数决定.

0 0