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
- C++primer学习:关于upper_bound和lower_bound的探究.
- 关于upper_bound,和lower_bound
- 关于lower_bound 和upper_bound
- [C++] upper_bound和lower_bound
- upper_bound和lower_bound的用法
- lower_bound和upper_bound的区别
- upper_bound()和lower_bound()的使用
- lower_bound和upper_bound的用法
- upper_bound和lower_bound的用法
- c语言实现lower_bound和upper_bound
- C++---------lower_bound upper_bound和unique函数
- c++lower_bound 函数和upper_bound函数
- 关于lower_bound与upper_bound的实用技巧
- STL源码学习----lower_bound和upper_bound算法
- STL源码学习----lower_bound和upper_bound算法
- STL源码学习----lower_bound和upper_bound算法
- 【STL源码学习】----lower_bound和upper_bound算法
- STL源码学习----lower_bound和upper_bound算法
- Linux kvm 虚拟机介绍
- SPDY 是什么?如何部署 SPDY?
- 高精度加法
- IOS开发笔记23-Foundation框架(上)
- iPhone开发 判断当前的网络是3g还是wifi
- C++primer学习:关于upper_bound和lower_bound的探究.
- android在代码中怎么设置 RadioGroup的默认值
- LeetCode 213: House Robber II
- MySQL怎样存储IP地址
- coderforce 586A Alena's Schedule
- E-R模型、E-R分析介绍
- 图像的锐化和边缘提取
- UIDevice
- linux kvm 创建虚拟机