找回密码
 中文实名注册
查看: 326|回复: 2

c++二分查找函数(如binary_search(),find())

[复制链接]

698

主题

1089

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
21993
发表于 2024-6-4 16:35:24 | 显示全部楼层 |阅读模式
https://blog.csdn.net/Dear_JIANJIAN/article/details/136214427

lower_bound
头文件为<algorithm>

lower_bound()用来找到>=目标数的地址

lower_bound(起始地址,结束地址,要查找的数)

lower_bound函数只能对已排好序(必须是升序)的数组进行查找;

且返回的是第一个>=目标数的地址

若没找到,返回的是最后一个元素的地址+该数组类型的字节,即所定义的数组大小



[C++] 纯文本查看 复制代码
#include <iostream>
#include <algorithm>
using namespace std;
 
int main()
{
        int a1[8] = { 2,56,21,45,17,5,77,9 };        
        sort(a1, a1 + 8, less<int>());  //按升序排序
 
        for (int i = 0; i < 8; i++)                cout << a1[i] << endl ;
        //lower_bound函数返回容器中第一个值>=目标元素的位置
        int* p = lower_bound(a1, a1 + 8, 45);        //lower_bound函数只能在已排好序(升序)的数组查找
        int* q = lower_bound(a1, a1 + 8, 100);        //lower_bound函数若找到返回的是地址。
        
        
        cout <<"45的地址:"<<p - a1 << endl;                        //返回下标        
        cout << "100的地址:"<<q - a1 << endl;                //若没找到,返回的是最后一个下标加1,即7+1=8
 
        
        return 0;
}
 




3.upper_bound
头文件为<algorithm>

upper_bound()用来找到>目标数的地址

upper_bound(起始地址,结束地址,要查找的数)

upper_bound函数只能对已排好序(必须是升序)的数组进行查找;

且返回的是第一个>目标数的地址

若没找到,返回的是最后一个元素的地址+该数组类型的字节,即所定义的数组大小



4.find
有说头文件为<algorithm>,但在vs的c++11标准中,单用<iostream>也行

find()函数用来找到目标数的地址

find(起始地址,结束地址,要查找的数)

find函数对不排序的数组同样适用

若找到,返回的是物理地址,所以要输出下标时需要减去首地址。

若没找到,返回的是最后一个元素的地址+该数组类型的字节,即所定义的数组大小

[C++] 纯文本查看 复制代码
#include <iostream>
#include <algorithm>
using namespace std;
 
int main()
{
	int a1[8] = { 2,56,21,45,17,5,77,9 };	
	sort(a1, a1 + 8, less<int>());  //按升序排序
 
	for (int i = 0; i < 8; i++)		cout << a1[i] << endl ;
	int* p = find(a1, a1 + 8, 21);	//find函数若找到返回的是地址。
	int* q = find(a1, a1 + 8, 100);
	
	
	cout <<"21的地址:"<<p - a1 << endl;			//返回下标	
	cout << "100的地址:"<<q - a1 << endl;		//若没找到,返回的是最后一个下标加1,即7+1=8
 
	int a2[8] = { 2,56,21,45,17,5,77,9 };	//将a2始终乱序
	int* p1 = find(a2, a2 + 8, 17);	//find函数若找到返回的是地址。
	int* q1 = find(a2, a2 + 8, 10);
 
	for (int i = 0; i < 8; i++)		cout << a2[i] << endl;
	cout <<"17的地址:"<< p1 - a2 << endl;			//返回下标	
	cout << "10的地址:" << q1 - a2 << endl;		//若没找到,返回的是最后一个下标加1,即7+1=8
	return 0;
}
 


回复

使用道具 举报

698

主题

1089

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
21993
 楼主| 发表于 2024-6-4 16:43:59 | 显示全部楼层
[C++] 纯文本查看 复制代码
#include <bits/stdc++.h>

using namespace std;
 
int main()
{
    int a1[8] = { 2,8,9,10,21,45,77,99 };
    sort(a1, a1 + 8, less<int>());  //按升序排序


    
    cout <<a1<<endl;
    int* p = lower_bound(a1, a1 + 8, 45);  
    cout <<p<<endl;
    cout<<p-a1;
    
    //upper_bound函数只能在已排好序(升序)的数组查找
    return 0;
}
 
回复

使用道具 举报

2

主题

18

帖子

1699

积分

金牌会员

Rank: 6Rank: 6

积分
1699
发表于 2024-7-23 08:43:41 | 显示全部楼层
6666
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 中文实名注册

本版积分规则

小黑屋|东台市机器人学会 ( 苏ICP备2021035350号-1;苏ICP备2021035350号-2;苏ICP备2021035350号-3 )

GMT+8, 2024-9-8 10:38 , Processed in 0.043215 second(s), 29 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表