一、背景

lower_bound()和upper_bound(),binary_search()都是利用二分查找的方法在一个排好序的数组中进行查找的。

lower_bound():返回大于或等于目标值的第一个位置
upper_bound():返回大于目标值的第一个位置
binary_search():若目标值存在则返回true,否则返回false

二、lower_bound( )

lower_bound 的作用是在已经排好序的数组中返回第一个大于等于(不小于)你所给定的值。

源码版本一

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); // 将 it 迭代器右移 n 个位置。if (*it < value) {first = ++it; count -= step + 1; }elsecount = step;}return first;
}

源码版本二

template<class ForwardIt, class T, class Compare>
ForwardIt lower_bound(ForwardIt first, ForwardIt last, const T& value, Compare comp)
{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);if (comp(*it, value)) {first = ++it;count -= step + 1;}elsecount = step;}return first;
}

三、upper_bound( )

upper_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。

源码版本一

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) {it = first; step = count / 2; std::advance(it, step);if (!(value < *it)) {first = ++it;count -= step + 1;} elsecount = step;}return first;
}

源码版本二

template<class ForwardIt, class T, class Compare>
ForwardIt upper_bound(ForwardIt first, ForwardIt last, const T& value, Compare comp)
{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);if (!comp(value, *it)) {first = ++it;count -= step + 1;} elsecount = step;}return first;
}

四、 binary_search()

在数组中以二分法检索的方式查找,若在数组中查找到indx元素则真,若查找不到则返回值是假

源码版本

template <class ForwardIterator, class T>bool binary_search (ForwardIterator first, ForwardIterator last, const T& val)
{first = std::lower_bound(first,last,val);return (first!=last && !(val<*first));
}

五、实例

#include <algorithm>
#include <iostream>
#include <vector>int main()
{const std::vector<int> data = { 1, 2, 4, 5, 5, 6 };for (int i = 0; i < 8; ++i) {// 返回数组中第一个大于或等于i的值 auto lower = std::lower_bound(data.begin(), data.end(), i);std::cout << i << " ≤ ";lower != data.end()? std::cout << *lower << " at index " << std::distance(data.begin(), lower): std::cout << "not found";std::cout << '\n';}std::cout << '\n';// 返回数组中第一个大于5的值 auto upper = std::upper_bound(data.begin(), data.end(), 5);upper != data.end()? std::cout << *upper << " at index " << std::distance(data.begin(), upper): std::cout << "not found";std::cout << '\n';int a[100] = { 5,9,11,30,69,70,96,100 };bool ans = binary_search(a, a + 9, 5);//查找成功,返回truecout << "在数组中查找元素5,结果为:" << std::boolalpha << ans << endl;bool res = binary_search(a, a + 9, 99);//查找失败,返回falsecout << "在数组中查找元素99,结果为:" << std::boolalpha << res << endl;system("pause");return 0;
}

打印

参考:

std::lower_bound - cppreference.com

std::upper_bound - cppreference.com

upper_bound和lower_bound的区别_zifengningyu的博客-CSDN博客_upper_bound

C++的二分查找函数相关推荐

  1. C语言库自带的二分查找函数bsearch函数的使用示例

    bsearch 使用二分查找,查找一个被排序过的数组 依赖头文件 #include <stdlib.h> void *bsearch(const void *key, const void ...

  2. python 二分查找函数_Python基础14_递归函数,二分查找

    一. 递归 在函数中调用函数本身, 就是递归 prthon中递归的最大深度是998 def func(n): print(n) n += 1 func(n) func(1) 递归的应用:我们可以使用递 ...

  3. 软件测试二分查找函数,二分查找

    二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法.但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列.[1] 中文名 二分查找 外文名 Binar ...

  4. STL之lower_bound,upper_bound二分查找函数 结构体

    codeforces上的代码是开放的,常常就能看到本渣与大神们的差距 比如二分查找... 1.在数组中,找出第一个4所在位置 输入: 14 4 1 2 2 3 4 4 4 4 5 6 7 9 9 10 ...

  5. C++ 二分查找函数 lower_bound upper_bound

    lower_bound (ForwardIterator first, ForwardIterator last,const T& val) (ForwardIterator first, F ...

  6. c++ 二分查找的函数 lower_bound upper_bound binary_search

    简介 C++ STL 中二分查找函数主要有这三种: lower_bound() upper_bound() binary_search() 这三个函数都运用于有序区间. 用法 1. lower_bou ...

  7. 用stl函数来实现二分查找

    算法日记(一)_m0_61723200的博客-CSDN博客 之前在这篇文章用的是自定义函数的方法进行二分查找的,今天我会用stl函数进行二分查找. binary_search:查找某个元素是否出现,返 ...

  8. 数据结构上机实验之二分查找

    题目描述 在一个递增的序列里,查找元素是否存在,若存在输出YES,不存在输出NO. 输入 本题多组数据,首先输入一个数字n(n>=100000),然后输入n个数,数据保证数列递增,然后再输入一个 ...

  9. 二分查找算法实现(图解)与实例

    现在我们来玩一个猜数的游戏,假设有一个人要我们猜0-99之间的一个数.那么最好的方法就是从0-99的中间数49开始猜.如果要猜的数小于49,就猜24(0-48的中间数):如果要猜的数大于49,就猜74 ...

最新文章

  1. linux防火墙伦堂,「linux专栏」自从看了这篇文章,我彻底搞懂了selinux和防火墙...
  2. windows设置自动清理log
  3. Android开发之ConstraintLayout(约束布局)一个控件位于一个控件右上角类似RelativeLayout实现效果
  4. NET 6 中新增的LINQ 方法
  5. app自动化测试之Appium 源码分析
  6. Halcon 抓圆工具spoke
  7. OpenGL入门学习 课程 (三) 绘制几何图形的一些细节问题
  8. PHP仿网易云原创音乐分享平台网站源码
  9. 【计量经济学】工具变量估计与两阶段最小二乘法
  10. 回顾– DRAMS 4.0域注册软件
  11. matlab线条不平滑如何滤波,复杂曲线的包络线不平滑
  12. RS-232实现双机通信
  13. Rasa 3.x 学习系列- 内网环境部署Docker及Rasa duckling、Redis
  14. 使用IDM下载百度网盘的文件(亲测有用)
  15. 战地一怎么修改服务器,战地1怎么修改服务器地址
  16. 优思学院|六西格玛对于企业的作用,你了解多少?
  17. Java加密 HMACSHA1 加密算法
  18. 软件著作权登记证书免税吗
  19. 东芝笔记本linux系统安装驱动,笔记本驱动,小编教你东芝笔记本无线网卡驱动怎么安装...
  20. PPT导出高分辨率图片

热门文章

  1. 原子搜索优化算法ASO
  2. 电子技术基础(三)__第5章 数字电路基础__反函数_对偶函数
  3. 计算机学院科技节活动背景,关于举办2019年西湖区中小学生科技节程序设计项目(计算机三维作品设计)活动通知...
  4. iOS 类似聊天页面 tableView在出现时自动滚动到底部(不闪动,无痕)
  5. 蓝桥杯_嵌入式:蜂鸣器(库函数)
  6. 通达信指标公式常用绘图函数(1)——DRAWNULL、NODRAW、PLOYLINE、DRAWSL
  7. 用Visual Studio Code Debug世界上最好的语言
  8. 两年 android 经验面经
  9. MFC中的DoDataExchange(CDataExchange *pDX)
  10. 整理有关智慧城市相关的建设方案、国家标准、国家规范、解决方案和参考资料