当前位置: 首页 > news >正文

C++中的lower_bound函数详解

在C++标准库中,lower_bound函数是一个非常有用的工具,它通过二分查找算法在有序序列中定位第一个大于或等于给定值的元素的位置。本文将详细介绍lower_bound函数的使用方法、注意事项以及性能特点。

函数原型与基本用法

lower_bound函数定义在头文件中,其原型如下:

template<class ForwardIt, class T>
ForwardIt lower_bound(ForwardIt first, ForwardIt last, const T& value);

其中,first和last是表示要搜索的有序序列的迭代器范围(前闭后开区间[first, last)),value是要查找的值。函数返回一个迭代器,指向第一个大于或等于value的元素位置。如果找不到这样的元素,则返回last。

下面是一个简单的使用示例:

#include <iostream>
#include <algorithm>
#include <vector>int main() {std::vector<int> vec = {1, 3, 5, 7, 9};// 查找第一个大于等于6的元素位置auto it = std::lower_bound(vec.begin(), vec.end(), 6);if (it != vec.end()) {std::cout << "第一个大于等于6的元素位置:"<< std::distance(vec.begin(), it) << std::endl;} else {std::cout << "未找到大于等于6的元素" << std::endl;}return 0;
}

在这个示例中,lower_bound函数将会返回指向元素7的迭代器,因为它是第一个大于或等于6的元素。

使用条件与注意事项

有序序列:使用lower_bound进行二分查找时,必须保证查找区间为升序序列。如果序列为降序,需要使用自定义的比较函数。
自定义比较:在某些情况下,我们可能需要基于特定的比较规则进行查找。lower_bound允许传入一个比较函数来实现自定义比较。例如,对于降序序列,可以使用std::greater<int>

#include <iostream>
#include <algorithm>
#include <vector>int main() {std::vector<int> vec = {9, 7, 5, 3, 1};// 查找第一个大于等于6的元素位置(降序)auto it = std::lower_bound(vec.begin(), vec.end(), 6, std::greater<int>());if (it != vec.end()) {std::cout << "第一个大于等于6的元素位置(从后往前数):"<< std::distance(it, vec.end()) << std::endl;} else {std::cout << "未找到大于等于6的元素" << std::endl;}return 0;
}

返回值处理:如果lower_bound未找到目标元素,它会返回last的地址,此时需要注意检查返回值是否等于end(),以避免对越界地址进行解引用。

性能特点

lower_bound函数的算法复杂度为 O ( l o g n ) O(logn) O(logn),其中 n n n是序列的元素个数。这使得它在处理大规模数据时非常高效。然而,对于关联容器(如std::set和std::map),虽然也可以使用lower_bound,但由于关联容器不支持随机访问,其性能可能退化到 O ( n ) O(n) O(n)。因此,在使用关联容器时,建议使用容器自带的lower_bound成员函数,它们通常经过优化,可以提供更好的性能。

总结

lower_bound函数是C++ STL中一个强大的工具,适用于在有序序列中快速查找元素的位置。正确使用lower_bound可以显著提高程序的效率,但在使用时应注意其适用条件和返回值处理,以避免潜在的问题。

相关文章:

  • 孙论文——定标
  • 牛顿迭代法求解x 的平方根
  • lombok详细教程(详解)
  • windows系统中后台运行java程序
  • UnityShader 一种RGB分离效果
  • 【matlab画多纵坐标图像】
  • 【反素数】
  • UE4_Niagara基础实例—4、静态网格体表面生成粒子
  • 【网络安全】公钥基础设施
  • DAY17||654.最大二叉树 |617.合并二叉树 |700.二叉搜索树中的搜索 |
  • 设计模式之享元(Flyweight)模式
  • mac-m1安装nvm,docker,miniconda
  • 基于SpringBoot+Vue的小儿推拿培训管理系统
  • [SAP ABAP] SELECTION-SCREEN
  • mac 外接键盘
  • 分享一款快速APP功能测试工具
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • 11111111
  • emacs初体验
  • exports和module.exports
  • Java读取Properties文件的六种方法
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • node.js
  • Redis在Web项目中的应用与实践
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • Vue.js 移动端适配之 vw 解决方案
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 如何设计一个微型分布式架构?
  • 深入浅出Node.js
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 栈实现走出迷宫(C++)
  • mysql面试题分组并合并列
  • ​​​​​​​STM32通过SPI硬件读写W25Q64
  • #{}和${}的区别?
  • #NOIP 2014# day.2 T2 寻找道路
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (Matlab)使用竞争神经网络实现数据聚类
  • (Oracle)SQL优化技巧(一):分页查询
  • (PySpark)RDD实验实战——取最大数出现的次数
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (补充)IDEA项目结构
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (算法)前K大的和
  • (一)基于IDEA的JAVA基础10
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .chm格式文件如何阅读
  • .NET CORE 第一节 创建基本的 asp.net core
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .net FrameWork简介,数组,枚举