binary_search()函数定义在头文件中,用于查找指定区域内是否包含某个目标元素。

该函数有 2 种语法格式,分别为:

//查找 [first, last) 区域内是否包含 val

bool binary_search (ForwardIterator first, ForwardIterator last,

const T& val);

//根据 comp 指定的规则,查找 [first, last) 区域内是否包含 val

bool binary_search (ForwardIterator first, ForwardIterator last,

const T& val, Compare comp);

其中,first 和 last 都为正向迭代器,[first, last) 用于指定该函数的作用范围;val 用于指定要查找的目标值;comp 用于自定义查找规则,此参数可接收一个包含 2 个形参(第一个形参值为 val)且返回值为 bool 类型的函数,可以是普通函数,也可以是函数对象。

同时,该函数会返回一个 bool 类型值,如果 binary_search() 函数在 [first, last) 区域内成功找到和 val 相等的元素,则返回 true;反之则返回 false。

需要注意的是,由于 binary_search() 底层实现采用的是二分查找的方式,因此该函数仅适用于“已排好序”的序列。所谓“已排好序”,并不是要求 [first, last) 区域内的数据严格按照某个排序规则进行升序或降序排序,只要满足“所有令 element

有关二分查找算法,读者可阅读《二分查找算法》一节。

举个例子:

#include // std::cout

#include // std::binary_search

#include // std::vector

using namespace std;

//以普通函数的方式定义查找规则

bool mycomp(int i, int j) { return i > j; }

//以函数对象的形式定义查找规则

class mycomp2 {

public:

bool operator()(const int& i, const int& j) {

return i > j;

}

};

int main() {

int a[7] = { 1,2,3,4,5,6,7 };

//从 a 数组中查找元素 4

bool haselem = binary_search(a, a + 9, 4);

cout << "haselem:" << haselem << endl;

vectormyvector{ 4,5,3,1,2 };

//从 myvector 容器查找元素 3

bool haselem2 = binary_search(myvector.begin(), myvector.end(), 3, mycomp2());

cout << "haselem2:" << haselem2;

return 0;

}

程序执行结果为:

haselem:1

haselem2:1

此程序中演示了 binary_search() 函数的 2 种适用场景,其中 a[7] 数组中存储的为升序序列;而 myvector 容器中存储的序列虽然整体是乱序的,但对于目标元素 3 来说,所有符合 mycomp2(element, 3) 规则的元素都位于其左侧,不符合的元素都位于其右侧,因此 binary_search() 函数仍可正常执行。

C++ STL标准库给出了 binary_search() 函数底层实现的参考代码(如下所示),感兴趣的读者可自行研究,这里不再赘述:

//第一种语法格式的实现

template

bool binary_search (ForwardIterator first, ForwardIterator last, const T& val)

{

first = std::lower_bound(first,last,val);

return (first!=last && !(val

}

//第二种语法格式的底层实现

template

bool binary_search(ForwardIt first, ForwardIt last, const T& val, Compare comp)

{

first = std::lower_bound(first, last, val, comp);

return (!(first == last) && !(comp(val, *first)));

}

有关 lower_bound() 函数的功能和用法,可阅读《C++ lower_bound()函数》一节;有关 upper_bound() 函数的功能和用法,可阅读《C++ upper_bound()函数》一节。

c语言binsearch函数头文件,C++ binary_search()函数详解相关推荐

  1. 【C++】C++中的头文件(.h)—详解(2)

    接上... [fishing-pan:https://blog.csdn.net/u013921430转载请注明出处] 头文件中写些什么 在上篇博客中写到头文件本身不参与编译,但是它们被包含到源文件中 ...

  2. 【C++】C++中的头文件(.h)—详解(1)

    [fishing-pan:https://blog.csdn.net/u013921430转载请注明出处] 前言 之前写过一篇<C++中头文件的使用>,那篇文章主要讲述C++中头文件的使用 ...

  3. C语言的头文件和宏定义详解

    头文件 头文件,顾名思义就是定义在C语言文件头部的那一坨东西 #include <stdio.h> 这就是一个标准输入输出的头文件声明,头文件声明写在定义文件(后缀名.c的文件)的头部,并 ...

  4. android常用头文件,Android.mk 使用详解

    和你一起终身学习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点:一.Android.mk 简介二.Android.mk 的基本格式三.Android.mk 深入学习一四. ...

  5. c语言select函数头文件,简述select函数的功能与调用方法

    使用select 首先我们需要解答一些疑惑.为什么要使用select函数? 比如你有一个服务器程序,维护着N多个TCP连接,你如何去判断这些TCP连接上有数据传送过来了呢?最傻瓜的办法就是隔一定时间去 ...

  6. c语言eof的头文件,vc eof函数是在哪个头文件里面

    满意答案 winner丶小铭 2013.04.07 采纳率:54%    等级:12 已帮助:9597人 #include 如: #include #include #include #include ...

  7. c语言中常用函数头文件,c语言中常用的函数和头文件

    头文件ctype.h 函数列表 函数类别函数目的详细说明 字符测试为字符和数字的isalnum 是否为isalpha字符 是否控制字符iscntrl 是否为数字isdigit 是否能够显示文字(空格除 ...

  8. 为什么C语言要有头文件(补充)

    1.为什么要有头文件? 为了在组织项目结构的时候,减少大型项目维护成本问题. 2.引用头文件 方法一: 使用#pragmatic once可以包括 1.C头文件 2.所有的变量的声明 3.所有的函数的 ...

  9. C语言编程规范 — 头文件、函数

    0 编码规范说明 0.1 前言 为了提高产品或项目代码质量,软件开发人员编写出简洁.可靠.可维护.可测试.高效.可移植的代码,树立良好的编程规范是非常有必要的,良好的编程规范能提高编程效率,规避很多编 ...

最新文章

  1. socket有关的一些扩展函数介绍
  2. 剑指offer64 不能使用乘除法、for、while、if、else、switch、case 求 1+2+...+n
  3. Java并发编程(1):可重入内置锁
  4. 做excel的时候要快速按照纬度的角度来分析构建:一个词语“纬度”
  5. .Net 2.0里有一个有用的新功能:迭代器
  6. Java静态方法与非静态方法的泛型
  7. 2017的中国开放_2017年开放科学如何发展
  8. vue 指令 v-if v-else-if v-else
  9. 修改Myecclipse servlet/jsp的默认模板
  10. iframe跨域与session失效问题
  11. 剑指Offer_16_合并两个排序的链表
  12. python 谷歌翻译 api_python免费调用谷歌翻译接口
  13. 网狐棋牌游戏用户数据库QPAccountsDB开发文档
  14. zemax---透镜基础篇
  15. 目标客户画像_用户画像是什么?怎么做用户画像?
  16. 《鬼谷子》飞箝第五(原文)
  17. 零信任解决方案在某医院落地实例学习记录
  18. Gradient Descent and NSCA
  19. 金三银四最新Java面试题总结前199+1页都在这里了,非常详细
  20. 夏斌:半年宏观调控思路的建议

热门文章

  1. Excel技能培训之六-定位功能,隔行插入删除空行,分组插入空行,高亮行列间差异,复制筛选后的数据
  2. 【接口文档】微信支付现金红包未开通,公众号发红包用第三方红包代发接口
  3. 中国世界500强数量首超美国,但别高兴得太早
  4. python爬取自如房间信息(二)
  5. phpmywind 调取导航
  6. 2015年3月PMP认证考试报名通知
  7. 多元线性回归算法预测房价【人工智能】
  8. 求最小公倍数的三种方法(C语言)
  9. Nacos配置热更新两种方式。
  10. 如何完整保存离线网页