stl二分函数

菜鸟笔记1
第一次使用stl中的函数。
很不幸题目没法复制粘贴,简述题目如下:
输入n个整数,进行m次查找(就是查找程序运行m遍)每次查找找一个数。
题目如下:
输入样例:
第一行 2 个整数 n 和 m,表示数字个数和询问次数。
第二行 n 个整数,表示这些待查询的数字。
第三行 m 个整数,表示询问这些数字的编号,从 1 开始编号。
eg:输入
11 3
1 3 3 3 5 7 9 11 13 15 15
1 3 6
输出
1 2 -1

#include<cstdio>//及时复习,有关stl的问题
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
	long long a[1000010];
	long long t;
	long int n,m;
	scanf("%ld%ld",&n,&m);
	for(int i=0;i<n;i++)
		scanf("%lld",&a[i]);
	for(int j=0;j<m;j++)
	{
		scanf("%lld",&t);
		int answer=lower_bound(a,a+n,t)-a;
		if(a[answer]!=t)
			printf("-1 ");
		else
			printf("%d ",++answer);//注意输出的是第几个数,而不是再数组中的位位置
	}
	return 0;
}

简述思想就是利用stl中的函数,可以轻易的查找到那个值,括号中第一个是首地址,逗号,尾地址,逗号,要查找的数据,
返回的是是一个地址,所以注意减a。
这两个函数的作用是二分查找一个数在数组中出现的位置。区别是 upper 返回第一个大于搜索数的位置,而 lower 是第一个大于等于的数的位置。显然这道题用的是 lower。
如果找不到,那么返回last的地址。
附带私货cmp

bool cmp(int a, int b)
{
	return a > b;
}

专用于反向
return code;

<think>好的,我现在需要帮助用户查找C++ STL二分函数的用法,并提供示例。首先,我得回忆一下STL中的二分相关函数。常见的二分查找函数有lower_bound、upper_bound、binary_searchequal_range。这四个函数通常作用于已排序的区间上,所以用户需要注意先对容器进行排序。 接下来,我需要逐一整理每个函数的作用、参数返回值。比如,lower_bound返回第一个不小于目标值的元素位置,upper_bound返回第一个大于目标值的元素位置,binary_search判断是否存在目标值,equal_range则返回一个包含lowerupper结果的pair。 然后,我得考虑如何用示例代码展示这些函数的用法。可能需要用vector作为示例容器,填充一些数据,先排序,再分别调用各个函数。例如,创建一个vector<int>,排序后,用lower_bound查找某个值的位置,并输出结果。 同时,用户可能需要知道如何自定义比较函数,比如在结构体自定义排序规则的情况下使用这些函数。例如,使用greater<int>()进行降序排列时,如何调整比较函数。这时候需要参考引用中的仿函数部分,如引用[2]提到的Greater结构体,可能需要类似的实现。 另外,需要注意代码的完整性可编译性,包括必要的头文件使用命名空间。例如,使用algorithm头文件,以及using namespace std;,者显式指定std::。 在解释过程中,要强调这些函数的前提条件,即区间必须有序,否则结果不正确。同时,指出这些函数的时间复杂度是O(log n),适用于随机访问迭代器。 最后,生成相关问题时要围绕二分函数的应用场景、注意事项、自定义比较方法以及性能等方面提问,帮助用户进一步理解应用这些函数。</think>### C++ STL二分函数使用方法详解 在C++ STL中,二分查找相关函数主要包含四个核心函数,均定义在`<algorithm>`头文件中,要求输入区间必须是有序的[^2]。 #### 1. `std::lower_bound` - **作用**:查找第一个**不小于**目标值的元素位置 - **原型**:`ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last, const T& val)` - **示例**: ```cpp #include <algorithm> #include <vector> int main() { std::vector<int> vec = {1,3,5,7,9}; auto it = std::lower_bound(vec.begin(), vec.end(), 6); // 返回指向7的迭代器 int pos = it - vec.begin(); // 索引位置3 return 0; } ``` #### 2. `std::upper_bound` - **作用**:查找第一个**大于**目标值的元素位置 - **原型**:`ForwardIterator upper_bound (ForwardIterator first, ForwardIterator last, const T& val)` - **示例**: ```cpp auto it = std::upper_bound(vec.begin(), vec.end(), 5); // 返回指向7的迭代器 ``` #### 3. `std::binary_search` - **作用**:判断目标值是否存在于区间 - **原型**:`bool binary_search (ForwardIterator first, ForwardIterator last, const T& val)` - **示例**: ```cpp bool found = std::binary_search(vec.begin(), vec.end(), 5); // 返回true ``` #### 4. `std::equal_range` - **作用**:返回包含目标值的子范围 - **原型**:`pair<ForwardIterator,ForwardIterator> equal_range (ForwardIterator first, ForwardIterator last, const T& val)` - **示例**: ```cpp auto range = std::equal_range(vec.begin(), vec.end(), 5); // range.first指向5,range.second指向7 ``` #### 自定义比较版本 所有函数都支持自定义比较器,适用于特殊排序规则: ```cpp struct Compare { bool operator()(const MyStruct& a, const MyStruct& b) { return a.key < b.key; } }; std::lower_bound(vec.begin(), vec.end(), target, Compare()); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值