C++ lower_bound 的库使用和自己实现

C++ lower_bound() upper_bound() 函数用法详解(深入了解,一文学会) find()、find_if()、search() 等。值得一提的是,这些函数的底层实现都采用的是顺序查找(逐个遍历)的方式,在某些场景中的执行效率并不高。例如,当指定区域内的数据处于有序状态时,如果想查找某个目标元素,更推荐使用二分查找的方法(相比顺序查找,二分查找的执行效率更高)。C++ STL标准库中还提供有 lower_bound()、upper_bound()、equal_range() 以及 binary_search() 这 4 个查找函数,它们的底层实现采用的都是二分查找的方式。 阅读详情

C++ lower_bound 的库使用和自己实现

1. 库函数的使用

功能:查找一个数组中的第一个大于或等于指定值的数。返回一个迭代器。

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
	vector<int> nums = {1, 4, 5, 5, 8, 9, 3, 2};
	sort(nums.begin(), nums.end());  //注意传入之前需要进行排序
	auto it = lower_bound(nums.begin(), nums.end(), 6);
	if (it != nums.end()) {
		cout << "第一个不小于 6 的数值为:" <<  *it << endl;
	}
	return 0;
}

// 输出: 第一个不小于 6 的数值为:8

2. 基于二分查找的自己实现

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int lower_bound(vector<int>& nums, int target) {
	int n = nums.size();
	int left = 0, right = n - 1;

	while (left < right) {   // 退出循环时只有left=right一种可能
		int mid = left + ((right - left) >> 1);
		if (nums[mid] < target) {
			left = mid + 1;  //不断缩小左边界
		}
		else {
			right = mid;
		}
	}

	return nums[left] >= target ? nums[left] : INT_MAX;  //没有找到的话就返回INT_MAX;
}


int main() {
	
	//库函数实现
	vector<int> nums = {1, 4, 5, 5, 8, 9, 3, 2};
	sort(nums.begin(), nums.end());

	auto it = lower_bound(nums.begin(), nums.end(), 6);
	if (it != nums.end()) {
		cout << "第一个不小于 6 的数值为:" <<  *it << endl;
	}
	
	//自己实现
	int res = lower_bound(nums, 10);
	//cout << res << endl;

	return 0;

}


boost::mpl实现lower_bound测试程序 其中,用于元素查找的lower_bound算法也是boost::mpl中常用的算法之一。通过这个简单的测试程序,我们可以看到,在使用boost::mpl模块实现lower_bound算法时,只需要一些简单的元编程工具,就可以方便快捷地完成元素查找任务。在boost::mpl中,我们可以通过mpl::lower_bound实现这个算法。接下来,我们给出一个完整的测试程序,用于测试boost::mpl模块下lower_bound算法的正确性。boost::mpl实现lower_bound测试程序。 阅读详情

相关推荐

SV--对象拷贝、参数化的类

对象拷贝,参数化的类

创芯人--fly的博客 1570

C++实现lower_bound、upper_bound函数

关于这个lower_bound、upper_bound函数我是在学习算法的时候有一个find函数需要去写,然后这个老师就没用库函数,直接写了这个底层实现,然后说这个可以用lower_bound替代,我就想这不就是个简单的二分嘛,然后我就好奇这个函数的底层源码,为此写了这篇博客。

weixin_60033897的博客 5411

TMC2209的UART模式详解:如何用串口调试助手配置细分和电流(避坑指南)

本文深入解析TMC2209步进电机驱动器的UART模式,详细讲解如何通过串口调试助手配置细分和电流,包括硬件连接、通信协议、关键寄存器设置及高级功能应用。提供实战避坑指南,帮助开发者优化步进电机控制性能,适用于精密仪器、3D打印等场景。

weixin_29166013的博客 541

C++ / Python 关于 lower_bound & upper_bound 的算法实现与应用

在很多情况下,我们要在一个有序数组中找满足一定条件的数据或索引。比如,经常会用到,『找元素值大于等于某个数的最小值的索引』(`lower_bound`)和『找元素值小于等于某个数的最大值的索引 + 1』(`upper_bound`,其实也可以说成是『找元素值大于某个数的最小值的索引』)。 本文对其背后的原理进行了详细的讨论,然后还有 C++/Python 的实例。

一些笔记 2025

从零到一:基于K375S主控的机械键盘优联无线化改造实战

本文详细记录了基于罗技K375S主控进行机械键盘优联无线化改造的全过程。从改造动机、核心原理与物料准备,到电路设计、PCB打样、焊接调试,逐步拆解了将优联技术集成到自定义机械键盘中的实战步骤。项目最终实现了低延迟、高稳定性且支持多设备连接的优联无线机械键盘,为DIY爱好者提供了高性价比的改造方案。

h0i1j2k3l的博客 601

从理论到代码:蒙特卡洛法在光学散射模拟中的应用全解析(Matlab 2014a版)

本文详细解析了蒙特卡洛法在光学散射模拟中的应用,从数学原理到Matlab 2014a实现。通过模拟光子随机游走过程,精确描述光在浑浊介质中的传输特性,提供完整的源码实现和性能优化技巧,适用于生物医学光学、大气遥感等领域。

rum55的博客 627

【C++】从没见过这么详细的lower_bound的讲解

我这两个函数在牛客上做题见到,就充满疑惑这两个函数还有第二种接口??,我上C++官网去学习,例子就一个是最基础的,我看明白了。虽然是两个函数的接口就两个,但是有时候看别人使用的时候,里面参数还可以放不同的仿函数,我懵逼了。就去网上搜,但是大家讲解的都是它的第一个接口。我只能再把文档一遍一遍过,代码一遍遍的尝试,调试。 终于,我花了一天时间把这个函数才终于依靠着调试和 模仿着别人接口的使用,慢慢调弄...

进阶之路 5万+

【AI编程】用AI开发STM32软件(1):环境配置+AI编写LED闪烁

现在AI编程这么火,不拿来开发嵌软也太可惜了。笔者最近刚好有个2学分的实践课,要自己做项目,这不,机会就来了。笔者特意记录下来其过程,以供大家学习和参考。使用:VSCode+Copilot+EIDE+STM32CubeMX,单片机用最经典的stm32f103c8t6+STLink。

qq_23220445的博客 4573

lower_bound实现函数

lower_bound实现 【参考链接】lower_bound二分的三种写法 我在以前,总是用lower_bound,现在发现这样不行,有些复杂的数据结构二分的时候用这个会很麻烦,不如手写二分,我接着就查了下资料,发现并不难。 我下面这个代码写的是lower_bound,其实稍微改下就可以变成upper_bound了,下面我给出分别2个版本的代码: &代码lower_...

weixin_30500663的博客 1088

基于matlab实现的水果识别系统设计

本项目针对多种常见水果混合的图像,利用 Matlab 软件,对水果的识别进行研究。根据水果和背景的差别选取阈值,对去噪增强对比度后的图像进行二值化处理。再对图像进行边缘检测,选定连通区域,标记后再对不同种水果的颜色,形状,大小等特征进行快速识别水果,从而实现对水果的正确分拣。:水果识别、MATLAB、数字图像处理。

热情、奔放、快乐编程! 4854

【Envi风暴】Envi5.6安装图文教程(附Envi5.6完整版下载)

【Envi风暴】Envi5.6与应用商店app store安装图文教程(附Envi5.6完整版下载)从文末网盘下载完整的ENVI5.6安装包,如下所示:双击envi56-win.exe,开始安装。将f__x64下的两个补丁文件拷贝到安装路径。将f__x86下的两个补丁文件拷贝到安装路径。

智慧空间实验室 9204

lower_bound()和upper_bound()返回值

函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小于val,则返回last的位置 举例如下: 一个数组number序列为:4,10,11,30,69,70,96,100.设要插入数字3,9,111.pos为要插入的位置的下标 则 pos = lower_bound( number, num

论菜鸟的自我修养。。。 788

高通开发系列 - Linux/Ubuntu移植到QCS8xxx平台

QCS8250和QRB5165平台属于体系架构相同的芯片,前置是带cellular而后者不带,即前置有移动网络而后者没有。 BSP部分的软件内容有差异需要修改外,同一套代码编译出来的执行程序是可以运行的,不会存在体系架构、指令集不匹配的问题。 QCS8250平台没有Linux/Ubuntu的软件SDK,只有Android的SDK,但是它对应j兼容的QRB5165平台有LE(Linux)和Ubun(Ubuntu)SDK。所以我们需要做的就是用QRB5165 Linux/Ubuntu移植到QCS8250平台上来

fulinux的博客 3186

lower_bound()和upper_bound()函数讲解

lower_bound()和upper_bound()函数讲解 lower_bound(): lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。 两种写法: 1. #include&amp;amp;lt;iostream&amp;amp;gt...

lhh的博客 373

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

F - Lower Bound-STL

#include <cmath> #include <cstdio> #include <vector> #include <iostream> #include <set> #include <map> #include <algorithm> using namespace std; int main() { int n; vector<int>v; vector<int&gt.

weixin_51713993的博客 210

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

二分查找(模板) & &C++STL(lower_bound)

【代码】二分查找(模板)

weixin_47830774的博客 523

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C++20中std::ranges的常用函数的替代实现

C++20中引入了 库,可方便灵活地对容器中的元素进行查找等操作。不过对于有些环境,比如当前的Android平台,尽管Clang编译器能支持较完整的C++20特性,但无奈其C++标准库中缺少了 的实现,因此我们对于某些使用该库的代码需要做一些替代实现。...

zenny_chen的专栏 1274

C++二分查找,时间复杂度是O(logn)

二分查找属于一种简单却高效的算法,时间复杂度是O(logn),在二分查找之前需要先对其进行排序,C++里面的默认是升序,如果需要降序,需要进行一下修改: //C++排序是升序还是降序 //a>b是降序,a<b是升序 bool compare(int a,int b) { return a>b; } //降序,其中Arr是数组首地址(数组名即可),第二个参数就是首地址加数组长度 sort(Arr,Arr+n,compare); 如果没有第三个参数,默认就是升序 sort(Arr

深度学习领域优质创作者,优快云博客专家 1229

二分查找基础理解C++

在没有学习数据结构与算法前,我们要在一串序列中查找某个数,往往采用的是for(i=0;i<N;i++)的方式,这样的时间复杂度是O(n),在很多的题里面会受到限制,那么有没有一种方式的时间复杂度更低,也能完成一样的目的呢?在这里我们首先选用的是二分查找法!!

m0_73823257的博客 587

POJ 3061 Subsequence【尺取法】

原题链接思路:尺取法,lower_boundAC代码:#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <queue> using namespace std;int t, n, s, sum[1000002], a[1000002], ans;int ma

tjx41624560的博客 300

PTA-列车调度 (25 分)

#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <algorithm> #include <string> #include <cstring> #include <vector> #include <map> #include <set> #include <qu.

sabr_的博客 403

利用C++优势快速打完最长不下降子序列

n log n求最长不下降子序列我们设d[i]表示长度为i的最长不下降子序列最尾元素的最小值,显然d[i]<=d[i+1],d数组符合单调性。因此对于a[i]只需在d数组中二分即可。lower_bound与upper_boundlower_bound(a+l,a+r+1,key)表示在a数组的l~r范围进行二份查找(注意你需要保证这个数组的单调性,可以加cmp来表达他的单调性,默认单调性是非递减),

不来也不去的一只失忆蝴蝶 2363

剑指offer 编程题(36):数字在排序数组中出现的次数

题目描述 统计一个数字在排序数组中出现的次数。可以按统计字符的方法 与剑指offer 编程题(27):数组中出现次数统计解题思路和方法一样 http://blog.youkuaiyun.com/coolwriter/article/details/78867632 剑指offer 编程题(33):第一个只出现一次的字符 http://blog.youkuaiyun.com/coolwriter/article/d

coolwriter的博客 368

UVA-10474 Where is the Marble?

Vjudge题目链接,sort,lower_bound,STL题,和书上写的一样 #include<cstdio> #include<iostream> #include<algorithm> using namespace std; const int maxn = 10010; int main(){ int n, q, cnt = 1, a[m...

good vegetable! 216

Where is the Marble? UVA - 10474

Where is the Marble? UVA - 10474 有n个石头,每个石头上都有数字,每组输入需要你找若干个数字,如果没找到就输出notfind ,找到了就输出第一次见到这个数的位置。 看上去很简单,写起来也简单,然后第一发就过了。 #include <bits/stdc++.h> using namespace std; int main(){ in...

weixin_42105529的博客 334

算法描述》关于二分的两三事

  关于二分    二分,是一种流氓算法,这种方法适用于直接算(猜、蒙、试)答案,然后直接得出最优解,   这一方法,对于可以轻易证明答案是否可行(o(n)、o(1))的题目有奇效,   (在NOIP2015考试的时候出了这么一道题,放倒一推蒟蒻(包括我))   二分的使用条件   1.如上文所说,对于轻易证明答案是否可行的题目有奇效,来一道解决一道,对于子问题有这一性质的,也可以同样用...

weixin_30527423的博客 113
上一篇: C++ topK算法模板
下一篇: C++ 之归并排序模板
zsiming
博客等级 码龄7年 43粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值