文章目录
1.头文件
#include <algorithm>
2.使用方法
1.binary_search:查找某个元素是否出现。(范围包括前, 不包括尾)
函数模板:普通数组: binary_search(arr[], arr[] + size, val)
vector: binary_search(arr.begin(), arr.end(), val)
binary_search(arr.begin(), arr.begin() + cnt, val)
函数功能: 在数组中以二分法检索的方式查找,若在数组(要求数组元素升序)中查找到val元素则返回true
,若查找不到则返回false
。
如果数组是降序怎么办?
bool cmp(int a, int b) return a > b;
binary_search(arr.begin(), arr.end(), val, cmp);
重新定义二分规则
#include<bits/stdc++.h>
using namespace std;
vector<int>x = {
0, 2, 3, 3, 4, 5, 6, 9, 10, 11 };
vector<int>y = {
11, 10, 9, 6, 5, 4, 3, 3, 2, 0 };
vector<int>z = {
0, 2, 3, 3, 4, 5, 9, 7, 6, 11 };
bool cmp(int a, int b) {
//从左往右找数组第一个小于等于val的
return a > b; //规则是传入的val大于数组中的值, 但是函数要找第一个违反规则的
}
int main()
{
for(int i = 0;i <= 11; i++)cout << binary_search(x.begin(), x.end(), i);
puts(" 升序结果");
for (int i = 0; i <= 11; i++)cout << binary_search(y.begin(), y.end(), i, cmp);
puts(" 降序+规则结果");
for (int i = 0; i <= 11; i++)cout << binary_search(z.begin(), z.end(), i);
puts(" 半升序结果, 5之前满足升序可以正常判断, 后面部分都不能正常判断");
}
binary_search 算法底层实现
//第一种语法格式的实现
template <class ForwardIterator, class T>
bool binary_search (ForwardIterator first, ForwardIterator last, const T& val)
{
first = std::lower_bound(first,last,val);
return (first!=last && !(val<*first));
}
//第二种语法格式的底层实现
template<class ForwardIt, class T, class Compare>
bool binary_search(ForwardIt first, ForwardIt last, const T& val, Compare comp)
{
first = std::lower_bound(first, last, val, comp);
return (!(first == last) && !(comp(val, *first)));
}
其使用的lower_bound()
查找第一个大于等于val的元素, 如果lower_bound()
返回值有解且等于val 那就找到了
这里传入的规则, 其实是传入给lower_bound()
一个规则, 更改二分查找方式, 如果lower_bound()
返回值有解, 并且结果不满足规则 (这里为什么是不满足规则, 是因为lower_bound函数就是找首个不满足规则的数据, 具体看后面)
2.lower_bound:查找第一个大于或等于某个元素的位置。
函数模板:普通数组: lower_bound(arr[], arr[] + size, val)
vector: lower_bound(arr.begin(), arr.end(), val)
lower_bound(arr.begin(), arr.begin() + cnt, val)
函数功能: 函数lower_bound()
在first
和last
中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置(注意是地址)。如果所有元素都小于val,则返回last的位置
这里同样也只支持升序, 不支持降序数组
解决方法: 使用自定义规则
#include<bits/stdc++.h>
using namespace std;
vector<int>x = {
0, 2, 3, 3, 4,