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

[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则由元素本身的<或者定义关联容器时提供的比较函数决定.

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

  1. upper_bound()与lower_bound函数的使用

    1679: 查找2 Time Limit: 1 Sec Memory Limit: 128 MB [Submit][Status][Web Board] Description 给你一个长度是n的序列 ...

  2. C++ Primer 学习笔记(第四章:表达式)

    2019独角兽企业重金招聘Python工程师标准>>> ##C++ Primer 学习笔记(第四章:表达式) [TOC] ###4.1 基础 左值和右值: 当一个对象被用作右值的时候 ...

  3. 如何正确的通过 C++ Primer 学习 C++?(转自知乎)

    作者:dawnmist 链接:https://www.zhihu.com/question/32087709/answer/54936403 来源:知乎 著作权归作者所有,转载请联系作者获得授权. 个 ...

  4. upper_bound()与lower_bound()

    2018-2-5 upper_bound 和lower_bound是STL中二分查找的函数,所以效率会比较高. 首先,最形象的一句话: upper_bound(i) 返回的是键值为i的元素可以插入的最 ...

  5. 浅谈c++中upper_bound与lower_bound的用法

    神犇勿喷 在我还是个蒟蒻的时候(现在还是哈),我在网上翻了几篇有关upper_bound和lower_bound的文章,结果发现我全都看不懂非常复杂,为了避免再有人重蹈覆辙,我就发了这篇粗制滥造简单易 ...

  6. 【C++ Primer 学习笔记】: 容器和算法之【泛型算法】

    本系列博客主要是在学习 C++ Primer 时的一些总结和笔记. [C++ Primer 学习笔记]: 容器和算法之[泛型算法] 本文地址:http://blog.csdn.net/shanglia ...

  7. upper_bound和lower_bound用法(史上最全)

    目录 基础用法 用greater<type>()重载 进阶用法(自定义匿名函数) upper_bound进阶 lower_bound进阶 所有代码 两者都是定义在头文件<algori ...

  8. C++ upper_bound()和lower_bound()(二分查找中使用)的定义,使用方法和区别

    C++ upper_bound()和lower_bound()是涉及二分查找问题一个很好用的工具,熟练使用就不用为二分查找的边界发愁了(不用重复造轮子了) 1. 调用方式 upper_bound有两种 ...

  9. 如何正确通过 C++ Primer 学习 C++?

    链接:https://www.zhihu.com/question/32087709 编辑:深度学习与计算机视觉 声明:仅做学术分享,侵删 即将读研,虽然考的是本专业(GIS),但是研究生读的专业在计 ...

最新文章

  1. C# 父类类型引用子类的实例理解
  2. TensorFlow学习入门
  3. boost::test模块测试参数化测试
  4. C#递归的应用实例详解
  5. Redis 4.x/5.x未授权访问漏洞
  6. 【开源项目】基于FFmpeg的RGB格式封装MOV文件
  7. 牛逼了!Python 开发植物大战僵尸游戏
  8. Linux内存管理:反向映射机制(匿名页,文件页和ksm页)
  9. JAVA的包装类 【转】
  10. SONY索尼摄像机Z280断电KLV.RSV.MXF视频打不开数据恢复成功
  11. figma 导入导出 fig 文件
  12. win7计算机未连接网络,Win7无线网络显示未连接但可以上网的解决办法
  13. The Heads-Up Grid 让你的HTML页面具有辅助线网格功能
  14. android开发中磁场传感器,Android NDK中的陀螺仪和磁场传感器事件
  15. 世界上第一个bug的发现者——被誉为“COBOL 之母”的葛丽丝 · 霍普。
  16. 微信自动邀请加群!!!
  17. Modelsim仿真过程(完整版)
  18. kestrel web服务器性能对比,netcore高性能Web服务器Kestrel分析(示例代码)
  19. 【Hbu数据库】第七周 数据库完整性 存储过程和函数
  20. 标题爱奇艺的数据库选型大法,实用不纠结!

热门文章

  1. 超简单的 VIM 练级攻略
  2. 达梦数据库之备份还原
  3. 彻底了解DVD:从入门到精通(二)[转]
  4. NE555时基电路实验(二)NE555控制LED闪烁
  5. 唉,早知如此,何必当初
  6. 启动数据库MySQL
  7. 台式计算机激光头,制作用4节电池+光驱激光头纯手工改造激光枪
  8. MAC A1466 820-00165-A 进水不触发
  9. 服务器管理口安装系统,管理口安装服务器操作系统
  10. 微电网控制趋势(综述)