算法库-二分查找操作

2023-10-28


c++20
定义于头文件 < algorithm >

lower-bound — 返回指向第一个不小于给定值的元素的迭代器(>= x)

template< class ForwardIt, class T, class Compare >
constexpr ForwardIt lower_bound( ForwardIt first, ForwardIt last, const T& value, Compare comp );
(C++20 起)

返回指向范围 [first, last) 中首个不小于(即大于或等于) value 的元素的迭代器,或若找不到这种元素则返回 last 。

#include<iostream>
#include <algorithm>
#include<vector>
using namespace std;
int main() {
    vector<int> data={2, 3, 4, 6, 7, 8, 10};
    for (int i : data) {
        cout << i << " ";
    }
    cout << endl;
    for (int i = 0; i < 12; ++i) {
        auto lower = lower_bound(data.begin(), data.end(), i);
        cout << i << "<=";
        if (lower != data.end()) {
            cout << *lower << " at index " << distance(data.begin(), lower);
        } else  {
            cout << "not found";
        }
        cout << endl;
    }

    return 0;
}
2 3 4 6 7 8 10 
0<=2 at index 0
1<=2 at index 0
2<=2 at index 0
3<=3 at index 1
4<=4 at index 2
5<=6 at index 3
6<=6 at index 3
7<=7 at index 4
8<=8 at index 5
9<=10 at index 6
10<=10 at index 6
11<=not found

upper_bound — 返回指向第一个大于给定值的元素的迭代器( > x)

template< class ForwardIt, class T, class Compare >
constexpr ForwardIt upper_bound( ForwardIt first, ForwardIt last, const T& value, Compare comp );

#include<iostream>
#include <algorithm>
#include<vector>
using namespace std;
int main() {
    vector<int> data={2, 3, 4, 6, 6, 7, 8, 10};
    for (int i : data) {
        cout << i << " ";
    }
    cout << endl;
    auto iter = lower_bound(data.begin(), data.end(), 6);
    cout << "first num >= 6 " << endl;
    cout << "num : " <<  *iter << " loc : " << distance(data.begin(), iter) << endl <<  endl;
    cout << "last < 6 " << endl;
    if (iter == data.begin()) {
        cout << "not found" << endl;
    } else {
    cout << "num : " << *(iter - 1) << " loc :" << distance(data.begin(), iter) << endl << endl;
    }
    iter = upper_bound(data.begin(), data.end(), 6);
    cout << "first num > 6" << endl;
    cout << "num : " << *iter << " loc : " << distance(data.begin(), iter) << endl << endl;
    
    cout << "last <= 6" << endl;
    iter -= 1;
    cout << "num: " << *iter << " loc : " << distance(data.begin(), iter) << endl << endl;

    return 0;
}

2 3 4 6 6 7 8 10 
first num >= 6 
num : 6 loc : 3

last < 6 
num : 4 loc :3

first num > 6
num : 7 loc : 5

last <= 6
num: 6 loc : 4

binary_search — 确定元素是否存在于某范围中

检查等价于 value 的元素是否出现于范围 [first, last) 中。

对于要成功的 std::binary_search ,范围 [first, last) 必须至少相对于 value 部分有序.

#include<iostream>
#include<algorithm>
#include<vector>
#include<cstdio>
#include<string>
using namespace std;
int main() {
    vector<int> haystack{1, 3, 4, 5, 9};
    vector<int> needles{1, 2, 3};
    
    for (auto i : haystack) {
        cout << i << " ";
    }
    cout << endl;

    for (auto needle : needles) {
        cout << "Searching for " << needle << endl;
        if (binary_search(haystack.begin(), haystack.end(), needle)) {
            cout << "Found " << needle << endl;
        } else {
            cout << "no dice" << endl;
        }
    }

    return 0;
}
1 3 4 5 9 
Searching for 1
Found 1
Searching for 2
no dice
Searching for 3
Found 3

equal_range — 返回匹配特定键值的元素范围

template< class ForwardIt, class T, class Compare >
constexpr std::pair<ForwardIt,ForwardIt>
equal_range( ForwardIt first, ForwardIt last, const T& value, Compare comp );

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

算法库-二分查找操作 的相关文章

随机推荐

  • Python判断一个整数是否是回文数的三种方法

    方法一 逐位判断 原理 用一个while循环 将一个数每次都取出首位和末位 判断是否相等 只要有一次不相等退出即可 回文数的判断条件 加入一个变量位数 如果这个数是奇数 位数为1时 即最中间那一位数 此时退出即可 同理 偶数 位数为0时 退
  • LIN诊断实现MCU本地OTA升级

    一 目标 通过PC端上位机实现MCU本地的OTA升级 本篇文章对实现的目的 需要用到的第三方工具 LIN诊断帧 升级协议 MCU端升级过程以及PC端升级过程做详细说明 二 目的 最近在做MCU项目时需要将样机寄给客户进行验证 在客户的验证过
  • 二叉树 level order 遍历问题汇总

    一 如何确定层结束 1 维护一个levelEnd 如果当前结点等于level end 更新levelEnd 为queue back 注意先判断queue是否empty 最后一层结束后 queue就空了 2 维护一个curLevelNum 和
  • 【Kubernetes】Kubernetes的yaml文件中command的使用

    command就是将命令在创建的容器中执行 有这些命令去完成一些工作 command用法和dockerfile中的cmd差不多 command可以单独写 也可以分成command和参数args 可以参考之前的CMD去理解 例如下面的写法都可
  • 超分辨率重建——(一)何为超分和分类

    图像超分辨重建 图像超分辨率 SR 是计算机视觉中提高图像和视频分辨率的一类重要技术 图像超分辨率重建 Super resolution Reconstruction SR 是由一张或多张低分辨率图像得到高分辨率图像的过程 存在问题 传统图
  • 刷脸支付营销广告一站式便捷的应用

    刷脸支付收银系统的应用让消费者自助购物 正规购物过程更加便捷了 同时对于商户来说 还可以通过收银系统的会员管理 会员管理 营销 会员加广告以及服务 为商户提供了收银 店铺管理 营销加广告等一站式便捷的闭环应用 刷脸支付 智慧医疗 智慧校园
  • ETL与ELT理解

    ETL ETL Extract Transform Load 用来描述将数据从来源端经过抽取 Extract 转换 Transform 加载 Load 至目的端的过程 ETL模式适用于小数据量集 如果在转换过程中需要处理的数据量达到千万上亿
  • yum使用报错:Cannot find a valid baseurl for repo: base/$releasever/x86_64

    转自 https www cnblogs com qa freeroad p 13888980 html 背景 项目有几台机器 centos7 时间不准 为了让时间能够定时同步 需要安装ntpdate 然而 我在使用yum安装ntpdate
  • Call From hadoop102/192.168.10.102 to hadoop102:8020 failed on connection exception: java.net.Connec

    错误 which no hbase in opt modules jdk1 8 0 212 bin opt modules jdk1 8 0 212 bin usr local bin usr bin usr local sbin usr
  • STM32 电机教程 24 - ST MCLIB实战之无感变绝对式位置传感器

    前言 上一节给大讲演示了如何用ST MotorControl Workbench创建基本STM32F103C8T6芯片的FOC工程并根据实际电路成功创建了工程 但是实际电路使用的是绝对式磁编码器作为电机位置及速度检测传感器 而ST Moto
  • 学习笔记 JavaScript ES6 箭头函数

    学习内容 this指向定义时所在的对象 而不是调用时所在的对象 不可以当作构造函数 不可以使用arguments对象 1 this指向定义时所在的对象 而不是调用时所在的对象 先来回顾一下ES5当中如何定义函数 function sum x
  • SQL Server是什么?SQL Server详细介绍

    一 SQL Server数据库简介 SQL Server数据库是Microsoft开发设计的一个关系数据库智能管理系统 RDBMS 现在是全世界主流数据库之一 SQL Server数据库具备方便使用 可伸缩性好 相关软件集成程度高等优势 能
  • centos7修改服务器密码忘记,Centos7忘记root密码怎么修改

    Centos7忘记root密码怎么修改 一 reboot重启机器 当出现引导界面时 按e进入内核编辑界面 二 往下翻 到LANG zh CN UTF 8后面添加 rd break 别忘了空格 三 修改完成后 按下Ctrl X组合键来运行这个
  • gcc,pkg-config,libyaml and etc..

    order of lib imports in gcc lib are importants the order of lib imports in gcc lib are importants I used to have this co
  • Java并发编程实战——你真的了解final吗?

    文章目录 final的简介 平时使用的final final修饰变量 final修饰方法 final修饰类 多线程中你真的了解final吗 final域基本数据类型的重排序规则 写final域的重排序规则 读final域的重排序规则 fin
  • AV1:为互联网提供开放、免费的视频编解码工具

    从学术研究到进入工业界 Zoe Liu一直在算法和音视频领域 目前在谷歌编解码团队为编解码器AV1做开发支持 Zoe畅谈了评定编解码器的标准 以及AV1的最新进度 本文是 下一代编码器 系列采访之一 欢迎自荐或推荐技术人加入 下一代编码器
  • 每日一题【day2】

    题目链接 思路 对于两门课之间的约束关系 很容易联想到图 我们可以将课抽象为节点 将约束抽象为一条有向边 可以用有向图的相关算法解决问题 拓扑排序正好可以解决这一问题 算法 拓扑排序 一个合法的选课序列就是一个拓扑序 拓扑序是指一个满足有向
  • 【交点】直线与多边形相交显示

    every blog every motto You can do more than you think https blog csdn net weixin 39190382 type blog 0 前言 python 求直线与多边形交
  • nio和bio的原理_NIO、BIO、AIO的区别,及NIO的应用和框架选型

    AIO BIO NIO的区别 IO模型主要分类 同步 synchronous IO和异步 asynchronous IO 阻塞 blocking IO和非阻塞 non blocking IO 同步阻塞 blocking IO 简称BIO 同
  • 算法库-二分查找操作

    文章目录 lower bound 返回指向第一个不小于给定值的元素的迭代器 gt x upper bound 返回指向第一个大于给定值的元素的迭代器 gt x binary search 确定元素是否存在于某范围中 equal range