二分查找:C++ 库函数 upper_bound、lower_bound 和 binary_search

二分查找是一种在有序数组中查找特定元素的高效算法。在二分查找中,upper_bound、lower_bound 和 binary_search 是三个常用的操作,C++标准库也提供了原生 API,它们都利用了二分查找,但用于解决略微不同的问题。

介绍

binary_search

  • 定义:判断一个有序序列中是否存在指定的值。
  • 返回值:如果序列中存在该值,返回true;否则,返回false。
    用途:仅用于检查序列中是否包含某个特定的值,不提供该值的位置信息。

类似于 LeetCode704.二分查找,但是返回值是 bool 值。

lower_bound

  • 定义:在有序数组中找到第一个等于目标值的元素的位置。
  • 返回值:如果数组中存在一个或多个目标值,则 lower_bound 返回指向第一个目标值的迭代器。如果所有元素都小于目标值,则返回指向数组末尾的迭代器。
  • 用途:lower_bound 常用于查找数组中第一个等于目标值的元素的位置,或者获取可以插入该值而不破坏数组排序的位置。

upper_bound

  • 定义:在一个有序数组中找到第一个大于目标值的元素的位置。
  • 返回值:如果数组中存在目标值,则 upper_bound 返回指向第一个大于目标值的元素的迭代器。如果所有元素都不大于目标值则返回指向数组末尾的迭代器。
  • 用途:upper_bound 常用于确定一个范围,特别是当需要找出所有等于目标值的元素的范围时。

示例

假设有一个有序数组 arr = [1, 2, 4, 4, 5, 6 ,7],我们需要差中值为 4 的 lower_boundupper_boundlower_bound(4) 将返回指向第一个 4 的迭代器,即 arr[2]upper_bound(4) 将返回指向 5 的迭代器,即 arr[4]

接口

binary_search

bool
binary_search(_ForwardIterator __first, _ForwardIterator __last,
        const _Tp& __val)

lower_bound

inline _ForwardIterator
lower_bound(_ForwardIterator __first, _ForwardIterator __last,
		const _Tp& __val)

upper_bound

inline _ForwardIterator
upper_bound(_ForwardIterator __first, _ForwardIterator __last,
		const _Tp& __val)

使用

lower_bound和upper_bound它们都接受三个参数:开始迭代器、结束迭代器和目标值。如果需要得到索引,需要使用返回的迭代器和开始迭代器做差来获取。

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

int main() {
    std::vector<int> arr = {1, 2, 4, 4, 5, 6, 7};
    auto lower = std::lower_bound(arr.begin(), arr.end(), 4);
    auto upper = std::upper_bound(arr.begin(), arr.end(), 4);
    bool binary = binary_search(arr.begin(), arr.end(), 4);
    
    std::cout << "Lower Bound: " << (lower - arr.begin()) << std::endl;
    std::cout << "Upper Bound: " << (upper - arr.begin()) << std::endl;

    return 0;
}

upper_bound 和 lower_bound 自定义版本可以查看这篇文章。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/757240.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue.js 和 Node.js 全栈项目的运行与部署指南

Vue.js 和 Node.js 全栈项目的运行与部署指南 前言具体运行方式导入数据库初始化安装配置nodejs启动server后端启动client前端确保前后端正确连接 前言 本博客用来介绍一下一个包含前端和后端代码的全栈项目MoreMall&#xff0c;前端部分使用了 Vue.js&#xff0c;后端部分使用…

UE5蓝图快速实现打开网页与加群

蓝图节点&#xff1a;启动URL 直接将对应的网址输入&#xff0c;并使用即可快速打开对应的网页&#xff0c;qq、discord等群聊的加入也可以直接通过该节点来完成。 使用后会直接打开浏览器。

填报志愿时,要结合个人的优势和擅长

每年高考后的填报志愿&#xff0c;总会令很多家长和考生感到头痛&#xff0c;尤其是在选择学校专业的时候总是模棱两可&#xff0c;不知道应该如何入手。其实&#xff0c;在填报志愿的时候可以考虑结合考生擅长的科目择优选择专业。 大学的专业课程其实和高中课程是有一定关联…

Java代码高风险弱点与修复之——弱密码哈希漏洞-Very weak password hashing (WEAK_PASSWORD_HASH)

弱密码哈希漏洞 弱密码哈希漏洞指的是在密码存储和验证过程中,由于使用了不安全的哈希算法或哈希函数的错误使用,导致攻击者能够更容易地破解或绕过密码验证机制。这种漏洞使得存储在系统或应用中的用户密码容易受到威胁,增加了账户被非法访问和数据泄露的风险。 常见的弱…

SpringCloud中Eureka和Nacos的区别和各自的优点

Eureka注册中心 Eureka作为一个注册中心&#xff0c;服务提供者把服务注册到注册中心&#xff0c;服务消费者去注册中心拉取信息&#xff0c; 然后通过负载均衡得到对应的服务器去访问。 服务提供者每隔30s向注册中心发送请求&#xff0c;报告自己的状态&#xff0c;当超过一定…

找不到d3dcompiler_43.dll无法继续执行的修复指南

在电脑使用过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中之一就是“缺失d3dcompiler43.dll”。那么&#xff0c;这个错误提示到底是怎么回事呢&#xff1f;小编将从常见原因、对电脑的影响以及解决方法等方面进行详细解析。 一&#xff0c;了解d3dcompiler_43…

【子串】3. 无重复的最长子串

3. 无重复的最长子串 难度&#xff1a;中等难度 力扣地址&#xff1a;https://leetcode.cn/problems/longest-substring-without-repeating-characters/description/ 题目看起来简单&#xff0c;刷起来有好几个坑&#xff0c;特此记录一下&#xff0c;解法比官网的更加简单&…

【Sklearn-驯化】一文搞懂机器学习树模型建模可视化过程

【Sklearn-驯化】一文搞懂机器学习树模型建模可视化过程 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免费获取相关内容文档关注&#xff…

研导智能科技——AI辅助科研产品开发

人工智能&#xff08;AI&#xff09;技术的飞速发展为科研领域带来了革命性的变化。本公司致力于开发基于人工智能的科研辅助产品&#xff0c;旨在通过智能化手段提高科研人员的工作效率和研究质量。目前&#xff0c;我们成功开发了研导学术平台&#xff08;www.zhiyanxueshu.c…

Docker Compose 入门

想象一下在服务器上运行静态页面的场景。对于这项任务&#xff0c;NGINX 服务器是一个不错的选择。我们在 static-site/index.html 路径下有一个简单的 HTML 文件&#xff1a; 通过使用 Docker&#xff0c;我们将使用以下官方镜像运行 NGINX 服务器 docker run --rm -p 8080:…

Day6: 344.反转字符串 541. 反转字符串II 卡码网:54.替换数字

题目344. 反转字符串 - 力扣&#xff08;LeetCode&#xff09; void reverseString(vector<char>& s) {int len s.size();int left 0;int right len - 1;while (left < right){swap(s[left], s[right--]);}return;} 题目541. 反转字符串 II - 力扣&#xff0…

教您设置打开IDM下载浮动条的快捷键 全网最强下载神器idm怎么使用教程 idm浮动条不显示怎么办

很多人都知道Internet Download Manager(以下简称IDM)是一款非常优秀的下载提速软件。它功能强大&#xff0c;几乎能下载网页中的所有数据&#xff08;包括视频、音频、图片等&#xff09;&#xff0c;且适用于现在市面上几乎所有的浏览器&#xff0c;非常受大家欢迎。 在使用I…

docker网络功能介绍

一、 网络启动过程二、 修改容器dns和主机名① 临时处理&#xff08;容器终止或重启后不会保存&#xff09;② 通过参数指定 三、 容器内访问控制① 容器访问外部网络② 容器间互相访问&#xff08;1&#xff09;访问所有端口&#xff08;2&#xff09;访问指定端口 四、 docke…

Bureau of Contacts联机卡顿、联机延迟高的三种有效解决办法

Bureau of Contacts是一款全新的驱鬼游戏&#xff0c;最多支持4名玩家同时联机探索&#xff0c;玩家将进入被诅咒的地点&#xff0c;在这里找到被黑暗隐藏的秘密&#xff0c;并了解其消灭的办法&#xff0c;清除一切超自然内容&#xff0c;最终成功存活。不过有玩家反馈&#x…

2024最出色的代理软件评估及推荐

随着网络技术的飞速发展&#xff0c;代理软件已成为许多网络活动不可或缺的工具&#xff0c;特别是在数据抓取、网络安全防护等方面。在众多代理软件中&#xff0c;哪些能真正满足用户需求&#xff0c;提供卓越的性能和服务呢&#xff1f;我们的测评团队经过深入研究和测试&…

AutoHotKey自动热键(一)下载与安装

首先讲一下这个软件有什么作用,它可以实现代替鼠标和键盘的操作,并且能够代录入文字,添加并改变组合快捷键等等,到后面我们慢慢来讲AHK软件有1版本和2版本,在实际使用中,2版本容易被报毒,并且1版本已经极致成熟,所以我们使用1版本,我们进入官网下载下来,软件本身是免费的,不用有…

学习笔记——动态路由——OSPF(OSPF状态机、DR\BDR选举)

七、OSPF状态机、DR\BDR选举 1、OSPF的8种状态机 OSPF在邻居与邻接建立的过程中会经过多个状态机的变化&#xff0c;状态机的出现不仅能让我们了解OSPF建立过程&#xff0c;也能在OSPF出现故障的时候通过状态机的状态来粗略判断问题的所在。 (1)邻居建立状态变化过程 1、Dow…

狼人杀系列

目录 杀人游戏&#xff08;天黑请闭眼&#xff09; &#xff08;1&#xff09;入门版 &#xff08;2&#xff09;标准版 &#xff08;3&#xff09;延伸版——百度百科 &#xff08;3.1&#xff09;引入医生和秘密警察 &#xff08;3.2&#xff09;引入狙击手、森林老人和…

Excel+vue+java实现批量处理功能

需求背景: 产品创建流程比较复杂&#xff0c;有时候需要一次性创建多至10个&#xff0c;所以做了Excel维护产品信息&#xff0c;直接导入创建的功能。能极大提高效率。 简要概括实现&#xff1a; 一、参考单个创建&#xff0c;设计创建模板&#xff0c;表头对应填写字段名&…

CC1利用链分析

分析版本 Commons Collections 3.1 JDK 8u65 环境配置参考JAVA安全初探(三):CC1链全分析 分析过程 我的Github主页Java反序列化学习同步更新&#xff0c;有简单的利用链图 首先看下CC1利用链的RCE利用点&#xff0c;在接口Transformer 接下来查看此接口的实现类&#xf…