lower_bound()/upper_bound()函数(C++)
文章目录
- 1.lower_bound()/upper_bound()函数简单介绍
- 2.lower_bound()/upper_bound()函数分析
- 3.lower_bound()/upper_bound()运行展示
1.lower_bound()/upper_bound()函数简单介绍
1.1 lower_bound() 用于二分查找区间内第一个 大于等于某值(>= x) 的迭代器位置
1.2 upper_bound() 用于二分查找区间内第一个 大于某值(> x) 的迭代器位置
2.lower_bound()/upper_bound()函数分析
2.1 函数参数分析
ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last, const T& val)
ForwardIterator upper_bound (ForwardIterator first, ForwardIterator last, const T& val)
函数前两个参数分别是已被排序的序列的起始迭代器位置和结束迭代器位置,将要被查询的范围为[ first, last ),是一个左闭右开区间的范围,第三个参数则是需要搜寻的元素的值。最后返回查询成功的迭代器的位置。
2.2 函数内部原理实现分析
使用lower_bound()进行一个简单的介绍,其实可以发现这个函数底层实现的一个逻辑就是二分查找
ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last, const T& val)
{ForwardIterator it;iterator_traits<ForwardIterator>::difference_type count, step;count = distance(first,last);while (count>0) // 底层逻辑就是二分查找{it = first; step=count/2; advance (it,step); // 每次获取区间范围的一半if (*it<val) { first=++it;count-=step+1;}else count=step;}return first;
}
2.3 函数相关细节注意
A. 搜索的序列必须是已经按照一定规则进行过排序的有序序列
因为之前我们就介绍了这个函数是二分进行搜索位置的,所以必须保证其顺序必须是有序的才可以,否则会乱套的,之后也可以运行展示以下如果不是有序的序列会出现的错误。
B. 搜索的序列本身必须可以传入迭代器参数
因为这个函数需要传入的参数就是迭代器的位置,所以如果对于本身没有迭代器参数的序列是无法使用的,例如 queue容器是无法使用的(本身没有迭代器成员函数),对于一般数组,vector容器,deque容器,set容器等(本身有迭代器函数)都可以直接使用
C. 搜索的序列当中若无合法答案返回 last 迭代器位置
我们搜索的序列是[ fitst, last ],当其中没有我们想要的结果则会返回last迭代器的位置我们也可以借此确认是否真的可以成功搜索到合法结果。
2.4: 函数头文件 algorithm库
3.lower_bound()/upper_bound()运行展示
3.1 函数正常使用展示
lower_bound() 找到第一个 >= x 的合法位置
upper_bound() 找到第一个 > x 的合法位置
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
int main(){int a[7] = {0, 1, 3, 5, 8, 10, 16};for(int i = 0; i < 7; i ++ ) cout << a[i] << ' ';cout << "\n第一个 >= 3 元素的大小为: 元素位置为: " << endl;cout << * lower_bound(a, a + 7, 3) << "\t";cout << lower_bound(a, a + 7, 3) - a << endl;cout << "第一个 > 3 元素的大小为: 元素位置为: " << endl;cout << * upper_bound(a, a + 7, 3) << "\t";cout << upper_bound(a, a + 7, 3) - a << endl;
}
3.2 函数细节1——搜索之前必须是有序序列
我们设计一个没有排序的队列尝试一下,也可以看看其内部的搜索顺序是二分查找的一个顺序,我们可以看看结果。
这个序列第一个二分查找的元素就是9,然后查找 2 不合法,然后 1 9 中会将9作为结果输出
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
int main(){int a[7] = {10, 2, 1, 9, 8, 2, 16};for(int i = 0; i < 7; i ++ ) cout << a[i] << ' ';cout << "\n第一个 >= 3 元素的大小为: 元素位置为: " << endl;cout << * lower_bound(a, a + 7, 3) << "\t";cout << lower_bound(a, a + 7, 3) - a << endl;}
3.3 函数细节2——搜索对象必须是可以传入迭代器参数的序列
没有迭代器成员函数的容器是无法使用的例如 queue , 其他迭代器都可以正常使用例如vector, set等
常用的一般就是 vector容器, 也可以用 vector容器和set容器, deque容器 等(提醒:set容器本身内部就是有序)
vector容器
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long LL;
int main(){vector<int> v;v.push_back(4), v.push_back(8), v.push_back(1), v.push_back(2), v.push_back(6);sort(v.begin(), v.end());cout << "第一个 >= 3 的元素位置为: " << endl;cout << lower_bound(v.begin(), v.end(), 3) - v.begin() << endl;cout << "第一个 >= 3 的元素大小为: " << endl;cout << *lower_bound(v.begin(), v.end(), 3) << endl;
}
set容器本身内部即有序(不需要排序操作)
#include<iostream>
#include<algorithm>
#include<set>
using namespace std;
typedef long long LL;
int main(){set<int> s;s.insert(4), s.insert(2), s.insert(1), s.insert(5), s.insert(3);set<int>::iterator it = s.begin();for(; it != s.end(); it ++ ){cout << * it << ' ';}cout << '\n';cout << "第一个 >= 2 的数字为" << endl;cout << * lower_bound(s.begin(), s.end(), 2) << endl;}
3.4 函数细节3——若无法搜索到合法答案返回末尾迭代器
#include<iostream>
#include<algorithm>
#include<set>
using namespace std;
typedef long long LL;
int main(){int a[4] = {1, 2, 3, 4};cout << "找到第一个 >= 5 的元素的大小" << endl;cout << * lower_bound(a, a + 4, 5) << endl;cout << "找到第一个 >= 5 的元素的相对位置" << endl;cout << lower_bound(a, a + 4, 5) - a << endl;if(lower_bound(a, a + 4, 5) == a + 4){cout << "没有正确的结果, 返回元素末尾[last]的位置" << endl;}
lower_bound()/upper_bound()函数(C++)相关推荐
- C++ lower_bound() upper_bound() 函数用法详解(深入了解,一文学会)
find().find_if().search() 等.值得一提的是,这些函数的底层实现都采用的是顺序查找(逐个遍历)的方式,在某些场景中的执行效率并不高.例如,当指定区域内的数据处于有序状态时,如果 ...
- c++ 二分查找的函数 lower_bound upper_bound binary_search
简介 C++ STL 中二分查找函数主要有这三种: lower_bound() upper_bound() binary_search() 这三个函数都运用于有序区间. 用法 1. lower_bou ...
- C++ lower_bound 与 upper_bound 函数
头文件: #include <algorithm> 二分查找的函数有 3 个: 参考:C++ lower_bound 和upper_bound lower_bound(起始地址,结束地址 ...
- C++中lower_bound函数和upper_bound函数
STL中关于二分查找的函数有三个lower_bound .upper_bound .binary_search .这三个函数都运用于有序区间(当然这也是运用二分查找的前提),下面记录一下这两个函数. ...
- 【C++ 二分函数——lower_bound upper_bound用法】
大家好,我是Amy~ 好久不见啊(主要是我太懒了,这几天比较忙,不想更新--再加上快开学了,我的作业还没有做完QAQ)你们的暑假作业都做完了吗(哦对,大佬不用做作业QAQ) 那今天我们就接着上次的bi ...
- C语言bound函数,C++中lower_bound函数和upper_bound函数
STL中关于二分查找的函数有三个lower_bound .upper_bound .binary_search .这三个函数都运用于有序区间(当然这也是运用二分查找的前提),下面记录一下这两个函数. ...
- lower_bound()和upper_bound( )函数详解
lower_bound( )和upper_bound( )都是利用二分查找的方法在一个排好序的数组中进行查找的.两个函数的用法类似,在一个左闭右开的有序区间里进行二分查找,需要查找的值由第三个参数给出 ...
- STL源码剖析 lower_bound | upper_bound | binary_search
lower_bound 二分查找的一种版本,试图在已经排序的区间内查找元素value,如果区间内存在和value数值相等的元素,便返回一个迭代器,指向其中的第一个元素. 如果没有数值相等的元素,会返回 ...
- pair用法 lower_bound upper_bound
int a,b;pair<int,int>p;cin>>a>>b;p=make_pair(a,b);cout<<p.first<<" ...
最新文章
- Enterprise Library 4 数据访问应用程序块
- EDAS微服务应用同城容灾最佳实践
- oracle高级复制管理里面,配置高级复制问题,请大家指点!
- 如何基于谷歌的最强 NLP 模型进行影评分析?
- java mvc 源码分析_SpringMVC 源码解读笔记
- mysql create database 语法_MySQL中CREATE DATABASE语法总结
- struts2 Unable to load configuration
- 移远NBIOT BC95-B5使用CoAP协议接入华为IoT平台第一篇
- PyCharm快捷键——搜索/替换快捷键
- 小说阅读器,记录上次阅读位子。
- fault tolerance中的错误和故障检测(Error and Fault Detection Mechanisms)
- 用机器学习计算工作技能匹配度
- 第 9 章 Part / Chapter / Section
- Spring调用Feign报错:java.io.IOException: Incomplete output stream
- VC++, VC#, VB.NET 编码规范 (微软一站式示例代码库)
- 如何基于nonebot2做一个q群机器人
- 高通ar android,高通AR 入门
- 几何原本(数学家的儿童玩具)
- 织梦模板下载:政府供销社类部门织梦网站模板
- canvas编写的dota版连连看 demo放出