首页 > 其他分享 >【STL】 lower_bound和upper_bound

【STL】 lower_bound和upper_bound

时间:2023-12-23 09:22:22浏览次数:29  
标签:upper begin end STL bound int 数组

在STL提供的 algorithm 头文件中,提供了两个函数:upper_bound 和 lower_bound ,这俩函数功能 ”类似“,但并不相同。

  1. lower_bound(begin,end,val)在有序的数组连续地址的[begin,end)内找到第一个位置并返回其地址,使得val插入这个位置前面,数组仍然保持有序
  2. upper_bound(begin,end,val)在有序的数组连续地址的[begin,end)内找到最后个位置并返回其地址,使得val插入这个位置前面,数组仍然保持有序

即:lower_bound函数可以返回某数第一次出现的位置,upper_bound可以返回某数最后一次出现的位置(的后面)

因为返回的是地址,那么减去arr.begin()即可得到下标。

其原理都是二分,时间复杂度O(NlogN)

实验代码如下:

int test[6] = {1,2,3,3,6,8};

cout << lower_bound(test,test+6,3) - test << endl;
cout << upper_bound(test,test+6,3) - test << endl;

输出为2 4

 

如果查找数组元素不存在与数组中呢,那么根据二分查找的原理,有三种结果

  1. 如果查找元素tar小于有序数组的第一个元素,那么返回数组第一个下标
  2. 如果查找元素tar大于有序数组的最后一个元素,那么返回数组最后一个下标
  3. 如果查找元素不存在但也不满足1,2,那么返回数组内第一个大于tar的数组元素下标

实验代码如下:

int test[6] = {1,2,3,3,6,8};

cout << lower_bound(test,test+6,4) - test << endl;
cout << upper_bound(test,test+6,4) - test << endl;

输出为:4 4(6的下标)

 

在从大到小的排序数组中,重载lower_bound()和upper_bound()

lower_bound( begin,end,num,greater<type>() ):从数组的begin位置到end-1位置二分查找第一个小于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

upper_bound( begin,end,num,greater<type>() ):从数组的begin位置到end-1位置二分查找第一个小于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

 

用二分查找实现lower_bound和upper_bound的函数实现如下

int lowerBound (int arr[],int l,int r,int tar) {
    while (l<r) {
    int mid = (l + r) >> 1;
    if (test[mid] < tar) l=mid+1;
    else r=mid;
    }
    return l;
}
int upperBound (int arr[],int l,int r,int tar) {
    while (l<r) {
    int mid = (l + r) >> 1;
    if (test[mid] <= tar) l=mid+1;
    else r=mid;
    }
    return l;
}

 

标签:upper,begin,end,STL,bound,int,数组
From: https://www.cnblogs.com/Yukie/p/17922701.html

相关文章

  • 浅谈C++STL(Standard Template Library,标准模板库)
    2.1STL的诞生长久以来,软件界一直希望建立一种可重复利用的东西C++的面向对象和泛型编程思想,目的就是复用性的提升大多情况下,数据结构和算法都未能有一套标准,导致被迫从事大量重复工作为了建立数据结构和算法的一套标准,诞生了STL2.2STL基本概念STL(StandardTemplateLibrary,标......
  • Week1——STL 与基础数据结构专题训练
    https://blog.csdn.net/qq_46025844/article/details/127948957 实训概要实训专题STL与基础数据结构专题训练实训目的掌握STL常用的算法、容器、容器适配器的使用方法。能够利用STL的算法、容器、容器适配器求解问题。题目列表A:摘苹果B:立方和C:计算个数D:后缀表达式的值E:做蛋糕......
  • C++(STL标准库)
    C++标准模板库(StandardTemplateLibrary,STL)是C++标准库的一部分,提供了一组通用的模板类和函数,包括数据结构和算法,以便开发者能够更容易地实现各种功能。STL的设计目标是提供高性能、灵活和通用的工具,使得开发者能够专注于问题的解决,而不必为数据结构和算法的实现而费心。STL......
  • C++U4-第09课-STL容器
    学习目标 STL  栈stack [入栈出栈] 【算法分析】栈的基本操作。【参考代码】#include<bits/stdc++.h>usingnamespacestd;intmain(){stack<int>st;intn;cin>>n;for(inti=1;i<=n;i++){intx;cin......
  • 60道C++STL高频题整理(附答案背诵版)
    1.请解释vector容器和它的特点。在C++中,vector是标准模板库(STL)的一部分,它是一个动态数组。与普通数组相比,它的大小可以在运行时动态改变。下面是vector的一些主要特点和应用场景:动态大小:与传统的数组不同,vector可以根据需要动态地扩展或缩减大小。这意味着你不需要事先知道数......
  • 无涯教程-Java - String toUpperCase()函数
    将字符串转成大写字母,这等效于调用toUpperCase(Locale.getDefault())。StringtoUpperCase()-语法publicStringtoUpperCase()StringtoUpperCase()-返回值它返回字符串,并转换为大写。StringtoUpperCase()-示例importjava.io.*;publicclassTest{publics......
  • C++常用STL容器
    1.queue#include<queue>usingnamespacestd;queue<int>q;常用方法1.size()q.size()值为所包含的元素的个数2.front()q.front()头元素3.back()q.back()尾元素4.push()q.push(value)将value加入队列q中5.pop()q.pop()将头元素弹出队列q中测试代码:#include<i......
  • testlogger分析
    功能:一、将loggger和ctx作为pair放到步书写器AsyncLogWrite的list中:List<std::pair<LogContextPtr,Logger*>>_pending;1.InfoL<<"测试std::cout风格打印:";#defineInfoLWriteL(::toolkit::LInfo)--->#defineWriteL(level)::toolkit::LogContextCapture......
  • 无涯教程-Java - toUpperCase()函数
    该方法返回指定的char值的大写形式。toUpperCase()-语法chartoUpperCase(charch)这是参数的详细信息-ch  - 原始字符类型。toUpperCase()-返回值此方法返回指定的char值的大写形式。toUpperCase()-示例publicclassTest{publicstaticvoidmain(Str......
  • STL 与 库函数
    STL与库函数1.Vector的了解std::vector:内存连续的,可以动态分配内存,很多时候我们不能提前开好那么大的空间,(例如预处理1~n中所有数的约数),我们就需要得到可变长度数组,这就是vector。vector还能够实现线性复杂度的插入删除,常数复杂度的随机访问。std::vector重载了......