当前位置:首页 > C++知识 > 正文内容

【STL】二分查找函数(算法)—binary_search

亿万年的星光3年前 (2022-03-12)C++知识1311

【说明】

binary_search() 实现了一个二分查找算法。它会在前两个参数指定范围内搜索等同于第三个参数的元素。指定范围的迭代器必须是正向迭代器而且元素必须可以使用 < 运算符来比较。这个序列中的元素必须被排成升序序列或者至少相对于所查找元素是有序的。如果找到第三个参数,这个算法会返回布尔值 true,否则返回 false。

【头文件】

<algorithm>

【语法格式】

语法格式一共有两种

1.  

//查找 [first, last) 区域内是否包含 val
bool binary_search (ForwardIterator first, ForwardIterator last,
                      const T& val)

2.

//根据 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 类型的函数,可以是普通函数,也可以是函数对象。

需要注意的是,由于 binary_search() 底层实现采用的是二分查找的方式,因此该函数仅适用于“已排好序”的序列。所谓“已排好序”,并不是要求 [first, last) 区域内的数据严格按照某个排序规则进行升序或降序排序,只要满足“所有令 element<val(或者 comp(val, element)成立的元素都位于不成立元素的前面(其中 element 为指定范围内的元素)”即可。


【第一种模板】

binary_search(arr[],arr[]+size , indx)

arr[]: 数组首地址
size:数组元素个数
indx:需要查找的值
# include <cstdio>
# include <iostream>
# include <cmath>
# include <cstring>
# include <algorithm>
using namespace std;
const int NR = 100;
int n = 6;
int a[50] = {0, 1, 5, 7, 9, 23, 60};
int main()
{
	cout << "a数组从a[1]到a[n]这n个数中有7吗?" << binary_search(a + 1, a + n + 1, 7) << endl;
	cout << "a数组从a[1]到a[n]这n个数中有12吗?" << binary_search(a + 1, a + n + 1, 12) << endl;
	cout << "a数组从a[1]到a[n]这n个数中有0吗?" << binary_search(a + 1, a + n + 1, 0) << endl;
	return 0;
}

【第二种模板】

第二种模板只做参考,很少用。

#include <algorithm>//adjacent_find的使用
#include<iostream>

using namespace std;
void main() {
	 //前面有小于的值
	 int value1[20] = { 20,10,15,22,69,70,96,100 };
	 //前面有大于的值
	 int value2[20] = { 69,70,96,100,22,20,10,15 }; 
	 //比较方法
	 auto predicate = [](int a, int b) 
	 {
		 return a > b; 
};
	int wanted{ 22 };//比较元素
	int conp1 = binary_search(value1, value1+8, wanted);//查询元素
	int conp2 = binary_search(value1, value1+8, wanted,predicate);//查询比较元素
	int conp3 = binary_search(value2, value2 + 8, wanted, predicate);//查询比较元素
	cout << "查询是否有"<< wanted <<"的值:" <<conp1 << endl
		<< "查询元素之前是否无小于" << wanted << "的值:" << conp2<<endl
		<< "查询元素之前是否无小于" << wanted << "的值:" << conp3<<endl;
}


扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

分享给朋友:

相关文章

如何计算一个程序的运行时间(防止超时)

再一些OJ系统中,做题的时候常常会超时,但是很多人不知道自己的程序是否会超时,不知道如何检查自己的程序。这篇文章主要介绍几种监测自己程序运行时间的程序。头文件<time.h> ...

C++中的溢出

一、编程中的溢出   溢出是C++语言中最常见的漏洞。最常见的溢出包括数组溢出、数溢出、缓冲区溢出、指针溢出以及栈溢出。二、数组溢出    ...

【数论】快速乘

【数论】快速乘

上一篇文章简单说了龟速乘的问题,有人觉得龟速乘还是太慢了,有没有什么办法再快一点,实际是有的,就是我们今天介绍的 快速乘。快速乘的原理和龟速乘不同,快速乘并不是基于二进制和位运算,严格来说,快速乘是利...

【初级篇】函数(一)

【初级篇】函数(一)

0.函数的引入为什么要用函数呢?比较官方的说法是,过程的复用,你的一段逻辑,你有一段逻辑不断的在复用,就封装成函数去调用它。通俗的说法就是,把重复的过程集中到一块。例如,大家都学过如何求正方形的面积,...

【题解】盈亏问题

【题目描述】一群人团购一件物品:如果每人出 a元,所付总金额比物价多出了x 元;如果每人少出 1元,也就是每人出a-1元,所付总金额比物价少了y元。给定 a,x,y求参与团购的人数及该物品的...

C++读取磁盘文件

0.前言简单介绍一下C++读取文件的基本操作。关键技术:freopen() 文件的打开函数 FILE *fp fp=fopen(文件名,使用文件方式) 例如: fp...