Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >STL系列(二) 二分查找

STL系列(二) 二分查找

作者头像
木杉乀
发布于 2021-04-01 22:33:53
发布于 2021-04-01 22:33:53
38700
代码可运行
举报
文章被收录于专栏:木杉の小屋木杉の小屋
运行总次数:0
代码可运行

STL系列(二)二分查找

函数:binary_search

  • 内容里如有未知文章中未提到的函数引用请查看上一篇文章STL系列(一)sort用法
  • 本期内容会出现大量相似但不相同的话,认真阅读,注意对比,加深记忆,不要觉得内容重复而心烦
  • 注意加粗语句
  • 有疑问留言 or 评论

用法一(基本查找)

内容:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        binary_search( 数组名 + n1, 数组名 + n2,)
    
        n1和n2都是 int 类型的表达式 , 可以包含变量

        如果n1 = 0,+ n1 可以不写

        查找区间为下标范围为[n1,n2)的元素, 下标为n2的元素不在查找区间内 
                   
        在该区间内查找"等于"值的元素, 返回值为true(找到)false(没找到)
          
        "等于"的含义: a 等于 b <==> a < b和b < a都不成立
范例:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	int a[] = { 12,45,3,98,21,7 };
	sort(a, a + 6);
	Print(a, 6);       //结果: 3,7,12,21,45,98
	cout << "Result : " << binary_search(a, a + 6, 12) << endl;  //Result : 1
	cout << "Result : " << binary_search(a, a + 6, 77) << endl;  //Result : 0
  • 在使用STL二分查找前要先用sort排序;

用法二 (自定义排序规则查找)

内容:

在用自定义排序规则排好序的 , 元素为任意的T类型得数组进行二分查找

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
binary_search(数组名 +n1 , 数组名 + n2 ,, 排序规则结果名() );
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
n1和n2都是int类型得表达式,可以包含变量

如果 n1 = 0 ,+ n1可以不写

查找区间为下标范围[n1,n2)的元素 , 下标为n2的元素不在查找区间内

在该区间内查找"等于"值的元素, 返回值为true(找到)false(没找到)

*查找时的排序规则,必须和排序时的规则一致!

"等于"的含义:  a 等于 b <==> "a必须在b前面""b必须在a前面"都不成立

重要的事多次强调加深印象! 不是水文章!

范例:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    int a[] = { 12,45,3,98,21,7 };
	sort(a, a + 6, Rule1());   //按从小到大排序(此处使用Rule1规则进行排序)
	Print(a, 6);               // 21,12,3,45,7,98
	cout << "Result : " << binary_search(a, a + 6, 7) << endl;          //Result : 0
	cout << "Result : " << binary_search(a, a + 6, 8, Rule1()) << endl; //Result : 1
	return 0;

上面代码第4行为错误代码

此处编译器返回值为0并不是意味着没查到!

binary_search()二分查找规则必须与排序规则一致, 否则返回值 没有意义

完整代码:(包含自定义函数)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include
#include
#include

using namespace std;
struct Rule1 {
	bool operator()(const int& a1, const int& a2)const {
		return a1 % 10 < a2 % 10;
	}
};

void Print(int a[], int size);

int main() {
	int a[] = { 12,45,3,98,21,7 };
	sort(a, a + 6);
	Print(a, 6);
	cout << "Result : " << binary_search(a, a + 6, 12) << endl;
	cout << "Result : " << binary_search(a, a + 6, 77) << endl;
	sort(a, a + 6, Rule1());//按从小到大排序
	Print(a, 6);
	cout << "Result : " << binary_search(a, a + 6, 7) << endl;
	cout << "Result : " << binary_search(a, a + 6, 8, Rule1()) << endl;
	return 0;
}

void Print(int a[], int size) {
	int i;
	for (i = 0; i < size - 1; i++) {
		cout << a[i] << ",";
	}
	cout << a[i];
	cout << endl;
}

函数lower_bound

用法一(查找下界)

在对元素类型为 T 的从小到大排好序的基本数据类型中进行查找

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
T * lower_bound(数组名 + n1 , 数组名 + n2 ,);

返回一个指针 T * p;

*p 是查找区间里下标最小的,大于等于"值"的元素. 如果找不到, p 指向下标为n2 的元素

注意:n2不在查询范围内哦!

范例:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	int a[NUM] = { 12,5,3,5,98,21,7 };
	sort(a, a + NUM);
	Print(a, NUM);  // 结果: 3,5,5,7,12,21,98
	int* p1 = lower_bound(a, a + NUM, 5); //范围整个数组,p1指向下标最小的 大于等于5的元素
	cout << " p1指向的内容:"<< *p1 << "  下标:" << p1 - a << endl;   // 结果:5,1

用法二(自定义规则查找下界)

在对元素类型为 T ,按照自定义排序规则排好序的数组中进行查找

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
T * lower_bound(数组名 + n1 , 数组名 + n2 ,, 排序规则结构名());

返回一个指针 T * p;

*p 是查找区间里下标最小的,按自定义排序规则 , 可以 排在"值"后面的元素. 如果找不到,p指向下标为n2的元素

注意:n2不在查询范围内哦!

范例:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	int a[NUM] = { 12,5,3,5,98,21,7 };
    sort(a, a + NUM, Rule1());
	Print(a, NUM); // 结果 :21,12,3,5,5,7,98
	cout << *lower_bound(a, a + NUM, 16, Rule1()) << endl;    // 结果 : 7 (输出元素值)
	cout << lower_bound(a, a + NUM, 25, Rule1()) - a << endl; // 结果 : 3 (输出下标值)

后面内容可以自己试着分析原因


函数upper_bound

用法一(查找上界)

内容:

在元素类型为 T 的从小到大排好序的基本类型得数组中进行查找

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
T * upper_bound(数组名 + n1 , 数组名 + n2 ,);

返回一个指针 T * p;

*p 是查找区间里下标最小的, 大于"值"的元素. 如果找不到, p指向下标为n2 的元素

范例:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	int a[NUM] = { 12,5,3,5,98,21,7 };
	sort(a, a + NUM);
    Print(a, NUM);  // 结果: 3,5,5,7,12,21,98
    int* p2 = upper_bound(a, a + NUM, 5); //范围整个数组,p2指向下标最小的 大于5的元素
	cout << *p2 << endl;  // 结果:7
	cout << *upper_bound(a, a + NUM, 13) << endl;//查找大于13的下标最小的元素值 结果 :21

用法二(自定义规则查找上界)

内容:

在元素为任意的T类型 , 按照自定义排序规则排好序的数组中进行查找

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
T * upper_bound(数组名 + n1 , 数组名 + n2 ,, 排序规则结构体());

返回一个指针 T * p;

*p 是查找区间内下标最小的, 按自定义排序规则, **必须 **排在 “值” 后面的元素 . 如果找不到 ,p指向下标为n2的元素

范例:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	int a[NUM] = { 12,5,3,5,98,21,7 };
    sort(a, a + NUM, Rule1());
	Print(a, NUM); // 结果 :21,12,3,5,5,7,98
	cout << *lower_bound(a, a + NUM, 16, Rule1()) << endl;    // 结果 : 7 (输出元素值)
	cout << lower_bound(a, a + NUM, 25, Rule1()) - a << endl; // 结果 : 3 (输出下标值)
	cout << upper_bound(a, a + NUM, 18, Rule1()) - a << endl; // 结果 : 7 (无意义)(个位数大于8无法找到)(找不到时返回终点元素)
	if (upper_bound(a, a + NUM, 18, Rule1()) == a + NUM)
	cout << "not found" << endl;     // ==>not found;
	cout << *upper_bound(a, a + NUM, 5, Rule1()) << endl;      // 结果 : 7 (自己想想原因)
	cout << *upper_bound(a, a + NUM, 4, Rule1()) << endl;      // 结果 : 5

完整代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include
#include
#include

#define NUM 7
using namespace std;
struct Rule1 {
	bool operator()(const int& a1, const int& a2)const {
		return a1 % 10 < a2 % 10;
	}
};
void Print(int a[], int size);

int main() {
	int a[NUM] = { 12,5,3,5,98,21,7 };
	sort(a, a + NUM);
	Print(a, NUM);  // 结果: 3,5,5,7,12,21,98
	int* p1 = lower_bound(a, a + NUM, 5); //范围整个数组,p1指向下标最小的 大于等于5的元素
	cout << " p1指向的内容:"<< *p1 << "  下标:" << p1 - a << endl;   // 结果:5,1
	int* p2 = upper_bound(a, a + NUM, 5); //范围整个数组,p2指向下标最小的 大于5的元素
	cout << *p2 << endl;  // 结果:7
	cout << *upper_bound(a, a + NUM, 13) << endl;//查找大于13的下标最小的元素值 结果 :21
	sort(a, a + NUM, Rule1());
	Print(a, NUM); // 结果 :21,12,3,5,5,7,98
	cout << *lower_bound(a, a + NUM, 16, Rule1()) << endl;    // 结果 : 7 (输出元素值)
	cout << lower_bound(a, a + NUM, 25, Rule1()) - a << endl; // 结果 : 3 (输出下标值)
	cout << upper_bound(a, a + NUM, 18, Rule1()) - a << endl; // 结果 : 7 (无意义)(个位数大于8无法找到)(找不到时返回终点元素)
	if (upper_bound(a, a + NUM, 18, Rule1()) == a + NUM)
		cout << "not found" << endl;     // ==>not found;
	cout << *upper_bound(a, a + NUM, 5, Rule1()) << endl;      // 结果 : 7 (自己想想原因)
	cout << *upper_bound(a, a + NUM, 4, Rule1()) << endl;      // 结果 : 5
	return 0;
}

void Print(int a[], int size) {
	int i;
	for (i = 0; i < size - 1; i++) {
		cout << a[i] << ",";
	}
	cout << a[i];
	cout << endl;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/02/02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C++ STL之查找算法
C++STL有好几种查找算法,但是他们的用法上有很多共同的地方: 1、除了binary_search的返回值是bool之外(查找的了返回true,否则返回false),其他所有的查找算法返回值都是一个迭代器(查找成功返回目标所在迭代器的位置,否则返回最后一个元素的后一个位置或者说是容器的end()) 2、查找算法经常会用到迭代器区间,注意区间是前闭后开的 3、所有查找函数中如果存在两个区间,第一个区间是被查找对象的区间,第二个是目标对象的区间,如果只有一个区间则是被查找对象的区间。 4、对于有序查找的3个函
用户1215536
2018/02/05
1.3K0
二分查找与二分答案(2)
溢出风险  我们首先回顾一下上一次二分算法的代码 #include<iostream> using namespace std; int n,x,a[1000000]; int binary_search(int a[],int n,int x) { int l = 0; int r = n - 1; int ans = -1; while(l <= r) { int m = (l + r) / 2; if(a[m] == x)
mathor
2018/06/19
6670
stl-二分查找binary_search和sort
废江博客 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 转载请注明原文链接:stl-二分查找binary_search和sort
废江_小江
2022/09/05
3360
stl-二分查找binary_search和sort
STL二分算法
函数模板:普通数组: binary_search(arr[], arr[] + size, val)
木杉乀
2021/12/08
7180
STL二分算法
STL(Standard Temlate Libray) 标准模板库 (一) sort用法
内容 : 包含一些常用的算法 例如排序查找 , 还有常用的数据类型 例如可变长数组 , 链表 , 字典等.
木杉乀
2021/04/02
3690
小朋友学C++(46): lower_bound()和upper_bound()
lower_bound( )和upper_bound( )都是利用二分查找的方法在一个排好序的数组中进行查找的。
海天一树
2019/03/06
7900
【转】STL之二分查找 (Binary search in STL)
Section I 正确区分不同的查找算法count,find,binary_search,lower_bound,upper_bound,equal_range  本文是对Effective STL第45条的一个总结,阐述了各种查找算法的异同以及使用他们的时机。
马三小伙儿
2018/09/12
1.3K0
【转】STL之二分查找 (Binary search in STL)
ACM竞赛常用STL(二)之STL--algorithm
<algorithm>无疑是STL 中最大的一个头文件,它是由一大堆模板函数组成的。 下面列举出<algorithm>中的模板函数: adjacent_find / binary_search / copy / copy_backward / count / count_if / equal / equal_range / fill / fill_n / find / find_end / find_first_of / find_if / for_each / generate / generate_n / includes / inplace_merge / iter_swap / lexicographical_compare / lower_bound / make_heap / max / max_element / merge / min / min_element / mismatch / next_permutation / nth_element / partial_sort / partial_sort_copy / partition / pop_heap / prev_permutation / push_heap / random_shuffle / remove / remove_copy / remove_copy_if / remove_if / replace / replace_copy / replace_copy_if / replace_if / reverse / reverse_copy / rotate / rotate_copy / search / search_n / set_difference / set_intersection / set_symmetric_difference / set_union / sort / sort_heap / stable_partition / stable_sort / swap / swap_ranges / transform / unique / unique_copy / upper_bound 如果详细叙述每一个模板函数的使用,足够写一本书的了。还是来看几个简单 的示例程序吧。 示例程序之一,for_each 遍历容器:
xindoo
2021/01/22
9590
【小码匠自习室】CSP-J/S复赛准备:STL复习(二)
注:本文部分内容源于厳選!C++ アルゴリズム実装に使える 25 の STL 機能【後編】,针对日文进行了翻译
小码匠
2022/12/06
9580
熟练使用STL标准库是每个C++程序员的必备技能!_舞蹈基础教学视频
STL库还有很多内容,比如:向量(vector)、栈(stack)、队列(queue)、优先队列
全栈程序员站长
2022/11/03
4020
熟练使用STL标准库是每个C++程序员的必备技能!_舞蹈基础教学视频
二分查找的延伸
举个栗子:对数组序列{1,3,3,3,6}(下标从0开始)来说,若查询3,则得到L=1、R=4。 如果查询8,则得到L=R=5。 如果序列中没有x,那么L和R也可以理解为假设序列中存在x,则x应当在的位置。
可定
2020/04/20
4680
STL中有序序列的查找算法
参数定义:binary_search() 实现了一个二分查找算法。它会在前两个参数指定范围内搜索等同于第三个参数的元素。这个序列中的元素必须被排成升序序列或者至少相对于所查找元素是有序的。
用户9831583
2022/06/16
5200
STL中有序序列的查找算法
你真的懂二分吗?
二分算法,又称为二分搜索或折半搜索,是一种在有序数组中查找特定元素的搜索算法。其基本思想是将数组分成两半,然后根据目标值与中间元素的大小关系来决定是继续在左侧还是右侧进行搜索。这个过程会不断重复,直到找到目标值或搜索范围为空为止。
摆烂小白敲代码
2024/09/23
830
你真的懂二分吗?
C++STL常用算法
在iterator对标识元素范围内,查找一对相邻重复元素,找到则返回指向这对元素的第一个元素的迭代器。否则返回past-the-end。
羊羽shine
2019/05/28
4980
不造轮子之STL中的查找算法
在日常的开发中,常涉及到容器的常见操作,如查找、删除、排序等,C++ STL提供了丰富的算法库,可以方便地完成这些操作。为了避免重复造轮子,同时为了提高效率,了解常见的STL算法是非常有必要的。本文将介绍查找相关算法。
程序员的园
2024/09/27
1330
不造轮子之STL中的查找算法
C++ STL 标准模板库(容器总结)算法
C++ 标准模板库STL,是一个使用模板技术实现的通用程序库,该库由容器container,算法algorithm,迭代器iterator,容器和算法之间通过迭代器进行无缝连接,其中所包含的数据结构都是目前最优解,该库既能保证软件代码的高可复用性,又能保证代码具有相当高的执行效率,STL库是ANSI/ISO的C++标准的具体实现,任何标准库的实现都是以源码形式释出的.
王瑞MVP
2022/12/28
2.4K0
9.1 C++ STL 排序、算数与集合
C++ STL(Standard Template Library)是C++标准库中的一个重要组成部分,提供了丰富的模板函数和容器,用于处理各种数据结构和算法。在STL中,排序、算数和集合算法是常用的功能,可以帮助我们对数据进行排序、统计、查找以及集合操作等。
王瑞MVP
2023/08/17
2340
盘点算法竞赛中C++常用的stl库函数
我们都知道,C++中有许多内置的库函数,我们可以直接调用它们,在蓝桥杯,ACM等比赛中,通过使用这些常用的库函数可以大大提高我们的效率,而不用自己去再重新去手写一些函数,那么本篇文章就为大家盘点了一些比较常用的库函数,并附带了例题帮助大家运用理解。
2的n次方
2024/10/15
6170
盘点算法竞赛中C++常用的stl库函数
c++stl之lower_bound,upper_bound和equal_range函数的详细介绍!!!
注意观察这里beg和end查找到的对应值区别,beg从前往后找到第一个大于等于对应值的元素,而end从后往前查找第一个大于对应值的元素。
大忽悠爱学习
2021/11/15
1.5K0
C++编程规范(五)
理由:Remove算法并不真正地从容器中删除元素,所做的就是移动值的位置,将不应该删除的元素移动到范围的开始处,并返回一个迭代器指向最后一个不应该删除元素的下一个位置,要真正删除,需要在调用remove之后再调用erase:
用户9831583
2022/06/16
6390
相关推荐
C++ STL之查找算法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验