stl的二分函数

1.stable_sort在数组里和sort函数是一样的,区别在于前者对于数值相等的两个变量并不会交换顺序,所以只有在结构体里才能看出区别

2.lower_bound函数返回数组中第一个大于等于某数的位置,而upper_bound返回数组中第一个大于某数的位置。所以两个函数相减经常用来求一个数组之内有多少个某元素

测试了一下代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<vector> 
using namespace std;
int a[10]={1,2,3,3,3,4,5,6,66,9};
int main()
{
	int cnt3;
	printf("%d\n",upper_bound(a,a+10,3));
	printf("%d\n",lower_bound(a,a+10,3));
	cnt3=upper_bound(a,a+10,3)-lower_bound(a,a+10,3);
	printf("%d\n",cnt3);
	return 0;
}
打印出upper_bound和lower_bound后是一个奇怪的数,后来才知道他打出来的是iterator(迭代器——在stl中的一个专属抽象概念名词,可以简单粗暴地理解成stl设计模式中的指针),cnt3计算的便是这里3的个数为3



<think>好的,我现在需要帮助用户查找C++ STL二分函数的用法,并提供示例。首先,我得回忆一下STL中的二分相关函数。常见的二分查找函数有lower_bound、upper_bound、binary_search和equal_range。这四个函数通常作用于已排序的区间上,所以用户需要注意先对容器进行排序。 接下来,我需要逐一整理每个函数的作用、参数和返回值。比如,lower_bound返回第一个不小于目标值的元素位置,upper_bound返回第一个大于目标值的元素位置,binary_search判断是否存在目标值,equal_range则返回一个包含lower和upper结果的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()); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值