首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么从lower_bound中减去一个数组会返回一个解引用的值?

从lower_bound中减去一个数组会返回一个解引用的值的原因是,lower_bound函数返回的是一个指向大于或等于给定值的第一个元素的迭代器。而减去一个数组,则是将指针向前移动了指定的偏移量。

在C++中,指针和迭代器有类似的行为。通过减去一个数组,实际上是在指针上进行了偏移操作。偏移量的大小取决于元素类型的大小。

当我们从lower_bound中减去一个数组时,返回的是一个指向数组中对应位置的元素的指针或迭代器。通过解引用这个指针或迭代器,我们可以获取到该元素的值。

需要注意的是,减去一个数组的结果只有在指针或迭代器指向有效的内存位置时才是有效的。否则,结果将是未定义的行为。

下面是一个示例代码,展示了从lower_bound中减去一个数组并解引用的过程:

代码语言:txt
复制
#include <iostream>
#include <algorithm>
#include <vector>

int main() {
    std::vector<int> nums = {1, 2, 3, 4, 5};

    auto it = std::lower_bound(nums.begin(), nums.end(), 3);
    int* ptr = &(*it);

    std::cout << "Value: " << *ptr << std::endl;

    return 0;
}

在这个示例中,lower_bound函数找到了值为3的元素的迭代器,并将其赋值给了it。然后,通过解引用it并取地址,得到了指向该元素的指针ptr。最后,通过解引用ptr,我们可以获取到该元素的值,并将其打印出来。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云云数据库MySQL版:https://cloud.tencent.com/product/cdb_mysql
  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云人工智能:https://cloud.tencent.com/product/ai
  • 腾讯云物联网平台:https://cloud.tencent.com/product/iotexplorer
  • 腾讯云移动开发平台:https://cloud.tencent.com/product/mpe
  • 腾讯云区块链服务:https://cloud.tencent.com/product/tbaas
  • 腾讯云元宇宙:https://cloud.tencent.com/product/mu
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 二分查找与二分答案(2)

    此外,在之前简单版本,如果查找x不在数组,我们就返回-1。但是实际问题中,即便x不在数组,我们可能需要知道与x大小接近数值在数组处于什么位置。不能只返回一个-1了事。  ...左边是a数组,当然这个a数组必须递增,不然lower_bound()会出错。其中标红是大于等于3数。右边是lower_bound()返回减去a,是标红这些数里最小一个下标。...注意最后一个例子,如果a数组一个大于等于3都没有,返回数组长度n。...upper_bound返回减去a是这些数里最小一个下标。  其实对于lower_bound和upper_bound还有一个等价解释。...可以参考上面的图,当然lower_bound和upper_bound并不是真的返回2和5,返回是指针,减去a之后才是2和5  我们通过一个程序看一下lower_bound和upper_bound用法

    63240

    盘点算法竞赛C++常用stl库函数

    ,用于在已排序序列(数组,容器等)查找元素,返回为 bool 类型 使用时需要传入查找范围以及查找目标 如果需要获取找到元素位置,可以使用下面的两个函数 lower_bound()...这个函数有一个使用前提就是,必须是升序数组,如果要在降序数组中使用就需要自定义函数,和sort()类似,同时,返回返回lower_bound(start,end,x)第一个大于等于x元素地址...题目是蓝桥杯题库,题号是1389 非常直观,就是查找数组某个元素,我们用刚刚lower_bound()函数直接秒了 #include using...,所以减去首地址就是数组下标 cout << (lower_bound(data,data + 200,target) - data) << "\n"; return 0; } 减去首地址那里需要注意一下...(numbers.begin(), numbers.end()) << "\n"; //通过引用返回1 cout << *max_element(numbers.begin(), numbers.end

    12110

    lower_bound 和 upper_bound 功能和用法

    时,输出结果是 9,因为在升序序列 lower_bound 返回一个大于等于 参数val 序列迭代器,这里 val 为 4,lower_bound 进行二分查找,找到第一个 4 时符合条件所以返回...(确切说当步长减到 0 时,欲返回这个迭代器会停在第一个 4 那里),然后减去首迭代器 a,就是两个迭代器距离了(在这里也就是数组中下标),第一个 4 下标是 9。...在对 4 进行 upper_bound 时,输出结果是 12,因为在升序序列 upper_bound 返回一个大于 参数val 序列迭代器,不幸是这个序列里找不到大于 4 ,所以迭代器走到尽头也没有找到...,于是返回一个尾迭代器(在这里是数组越界后一个元素指针),它在数组中下标为 12 。...,不是期望结果,那么为什么这样呢?

    92430

    2022-04-17:给定一个数组arr,其中有可能正、负、0,给定一个正数k。返回累加和>=k所有子数组,最短数组长度。来自字节跳动。力扣8

    2022-04-17:给定一个数组arr,其中有可能正、负、0, 给定一个正数k。 返回累加和>=k所有子数组,最短数组长度。 来自字节跳动。力扣862。...答案2022-04-17: 看到子数组,联想到结尾怎么样,开头怎么样。 预处理前缀和,单调栈。 达标的前缀和,哪一个离k最近? 单调栈+二分。复杂度是O(N*logN)。 双端队列。...} let mut l: isize = 0; let mut r: isize = 0; for i in 0..N + 1 { // 头部开始,符合条件,...ans = get_min(ans, i as isize - dq[l as usize]); l += 1; } // 尾部开始,前缀和比当前前缀和大于等于...,尾部弹出!

    1.4K10

    在刷了几百道LeetCode之后,我总结出了这几条刷题技巧

    这个时候切记传入引用,原理和上述一样。因为如果是传递的话,涉及到大量拷贝,会使得时间复杂度非常高。 而传引用的话则不会有这个问题。...匿名函数 C++当中也有匿名函数,在一些情况下使用匿名函数非常方便。 C++匿名函数有许多种用法,这里不一一列举,只说最简单用法,其余用法会在之后EasyC++系列当中更新。...第二种省略了return类型,编译器根据函数体内容自行推断。 第三种省略了参数列表和返回类型,表示一个无参函数。 有了匿名函数,可以简化一些场景代码编写,例如对一个复杂结构体进行排序。...用法非常简单,传入三个参数,分别是数组开始位置,数组结束位置以及查找: int x = 3; auto it = upper_bound(nums.begin(), nums.end(), x)...函数返回结果是一个迭代器,如果我们想要获取下标, 可以用它减去数组初始位置: int x = 3; int p = upper_bound(nums.begin(), nums.end(), x

    43010

    STLalgorithm头文件下常用函数

    和memset不同,这里赋值可以时数组类型对应范围任意。 sort() 请详见这篇文章。...lower_bound()和upper_bound() lower_bound():用来寻找在数组或容器[first,last)范围内一个大于等于val元素位置。...如果是数组,则返回该位置指针。 如果是容器,则返回返回该位置迭代器。 upper_bound:用来寻找在数组或容器[first,last)范围内一个大于val元素位置。...数组和容器如上面同样返回该位置各自对应东西。 lower_bound()和upper_bound()实现详见这篇文章。...} 如果只是想获得想要查找元素下标,直接令返回减去数组首地址即可,可以不使用临时指针lowerPod和upperPod。

    93720

    二分查找延伸

    这篇文章解决若干问题: 如果递增序列A元素可能重复,那么如何对给定想查找元素x: 求出序列一个大于等于x元素位置; 求出序列一个大于x元素位置; 求出序列一个满足某条件位置;...第一个大于等于x和第一个大于x元素位置 举个栗子:对数组序列{1,3,3,3,6}(下标0开始)来说,若查询3,则得到L=1、R=4。 如果查询8,则得到L=R=5。...如果已经对二分查找能单独根据脑子里写出代码时候,lower_bound和upper_bound也能写出来。下面给出代码,读者可以尝试画个数组后按代码算法推导出来。...由于左闭变成了左开,因此left初值要比最小小1(例如对下标为0序列,left初值为-1,而right初值不变,还是n),同时,left=mid+1应该改成left=mid(这里想想为什么...挖坑,待解决),并且,返回应该是right,而不是left。

    44620

    NOIP训练营集训笔记—信息学基础算法(倍增与分治算法)

    一、倍增算法: 定义:用f[i][j]表示i位置出发2j个位置信息综合(状态) 一个小小问题:为什么是2j而不是3j,5j,…?...定义:f[i][j]表示:i到i+2j-1这2j个位置元素最大 初始化:f[i][0]=z[i](第i个位置到第i+20-1个位置最大,对应只有一个元素区间) 转移:f[i][j]=max(...下面介绍倍增算法: 定义:f[i][j]表示:树上编号为i节点向上走2j步走到哪个节点。...std; int main() { int point[5]={1,3,7,7,9}; int ans; /*两个函数传入:(数组名,数组名+数组长度,要查找数字),返回一个地址...,减去数组名即可得到数字在数组下标*/ ans=upper_bound(point,point+5,7)-point;//按从小到大,7最多能插入数组point哪个位置 printf

    66050

    unique函数

    现在总结一下unique,unique作用是“去掉”容器相邻元素重复元素(不一定要求数组有序),它会把重复元素添加到容器末尾(所以数组大小并没有改变),而返回是去重之后尾地址,下面举个例子。...由于返回是容器末尾,所以如果想得到去重后size,需要减去初始地址,lower_bound是得到地址,稍微不同。...如: sz = unique(b + 1,b + n + 1)-(b + 1); sz = unique(a,a + n) - a; 对比一下lower_bound: pos=lower_bound...通过再开一个数组,数字与前一个相同相同不加入新数组,仅仅多开了一个数组而已,不久搞定了吗。那么unique到底有什么优势呢?...比如,假如要得到相邻不同字符串组,用unique就方便些(好像模拟也不麻烦,就当为了“美”而用unique吧)。

    61410

    lower_bound( )和upper_bound( )常见用法,怕忘笔记

    lower_bound( )和upper_bound( )都是利用二分查找方法在一个排好序数组中进行查找。...在从小到大排序数组lower_bound( begin,end,num):从容器begin位置到end-1位置二分查找第一个大于或等于num数字,找到返回该数字地址,不存在则返回end。...通过返回地址减去起始地址begin,得到找到数字在数组下标。...upper_bound( begin,end,num):从容器begin位置到end-1位置二分查找第一个大于num数字,找到返回该数字地址,不存在则返回end。...通过返回地址减去起始地址begin,得到找到数字在数组下标。 可以用greater()重载,将上面的功能变为小于查找~

    68620

    Java双端队列给定一个数组 nums,有一个大小为 k 滑动窗口数组最左侧移动到数组最右侧。你只可以看到在滑动窗口内 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中最大

    双端队列实现 给定一个数组 nums,有一个大小为 k 滑动窗口数组最左侧移动到数组最右侧。你只可以看到在滑动窗口内 k 个数字。滑动窗口每次只向右移动一位。...返回滑动窗口中最大。...和一个结果数组(存储结果最大) 2 只需要把双端队列第一个设置为最大 3 每一次满足窗口大小就 返回一个Nums[ 队列里面的第一个] 4 刚开始的话是要满足 队列里面填充k 个 5...满了之后,随着窗口易懂,移除第一个,那么吧nums[新最大下标]给res class Solution { public int[] maxSlidingWindow(int[] nums...// 将最大付给 res res[i-k+1]=nums[stack.peekFirst()]; //0开始 所以是i-k+1 }

    1.2K10

    c++stl之lower_bound,upper_bound和equal_range函数详细介绍!!!

    如果所查找在容器lower_bound返回迭代器将指向第一个具有给定元素,而upper_bound返回迭代器指向最后一个匹配给定元素之后位置。...如果元素不在容器,则lower_bound和upper_bound返回相等迭代器----指向一个不影响排序插入位置 因此,用相同调用lower_bound和upper_bound会得到一个迭代器范围...如果关键字不存在,且大于容器任何关键字,则lower_bound返回也是尾后迭代器. ---- 注意事项 lower_bound返回迭代器可能指向一个具有给定元素,但也可能不指向。...如果关键字不在容器,则lower_bound返回关键字一个安全插入点—不影响容器中元素顺序插入位置 如果lower_bound和upper_bound返回相同迭代器,则给定关键字不在容器...,beg从前往后找到第一个大于等于对应元素,而end后往前查找第一个大于对应元素。

    1.3K30

    标准关联容器一定比vector查找速度快吗?

    delete成对出现 * 2,分配数组时,必须要使用 delet[] * * 而使用 vector或string销毁时,他析构函数自动销毁容器元素,回收存放那些元素内存 * */ //https...operator*返回一个常数 T&, 可以让set迭代器引用结果是set元素常量引用 //在这样实现下,讲没有办法修改set元素,因为所有访问那些元素方法都将在让你访问之前加一个const...2, lower_bound //vector查找第一个违背 myComp规则元素 std::vector::iterator iter = lower_bound(my.begin...,如果k已经在map里,它关联被更新成V /** 原理如下: 1,operator[]返回一个与 k关联对象引用,然后 v赋值给所引用 operator[]返回对象 2,当要更新一个已存在关联时很直接...,已经有 operator[] 可以用来返回引用对象 3,但是k不再map里,operator[]就没有可以引用对象,这样,使用类型默认构造函数从头开始建立一个, 然后 operator[]

    1.8K10

    离散化思想详细讲解

    1.什么是离散化 数据离散化是一个非常重要思想。 为什么要离散化?当以权为下标的时候,有时候太大,存不下。 所以把要离散化一个数组里面的数映射到另一个小一点数组里面去。...unique作用是“去掉”容器相邻元素重复元素(不一定要求数组有序),它会把重复元素添加到容器末尾(所以数组大小并没有改变),而返回是去重之后尾地址; 函数lower_bound()在first...和last前闭后开区间进行二分查找,返回大于或等于val一个元素位置。...【ps.upper_bound是返回一个大于b[x]指针,upper_bound()=lower_bound()+1】 关键代码如下: #include // 头文件 //n...原数组大小 num 原数组元素 lsh 离散化数组 cnt 离散化后数组大小 int lsh[MAXN] , cnt , num[MAXN] , n; for(int i=1; i<=n;

    90230
    领券