C++二分查找相关函数用法总结

一、lower_bound()函数

函数lower_bound(begin,end,num)在begin和end中的前闭后开区间,进行二分查找。返回从begin开始的第一个大于或等于val的元素的地址。如果所有元素都小于val,则返回end的地址。
注意:

  • 如果所有元素都小于val,则返回end的位置,且end的位置是越界的!!
  • 数组必须是排好序的数组(升序)。
#include
// lower_bound(a.begin(), a.end(), 11) 等同于 a.lower_bound(11)
vector a = {4,10,11,30,69,70,96,100};
// 返回数组中第一个大于或等于被查数的地址,不存在的元素,返回最后一个元素的地址
auto pos = lower_bound(a.begin(), a.end(), 11); // pos == a.begin() + 3  
auto pos = lower_bound(a.begin(), a.end(), 12); // pos == a.begin() + 4
auto pos = lower_bound(a.begin(), a.end(), 111);// pos == a.end() 
二、upper_bound()函数

函数upper_bound( begin,end,num)在数组的begin位置到end-1位置进行二分查找,返回第一个大于num数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到大于num数字在数组中的下标。同样,如果num大于数组中全部元素,返回的是last。(注意:数组下标越界)

vector a = {4,10,11,30,69,70,96,100};
auto pos = upper_bound(a.begin(), a.end(), 11);//pos = a.begin()+3 返回数组中第一个大于被查数的地址 
auto pos = upper_bound(a.begin(), a.end(), 111);//pos == a.end()
vector t = {1,2,3,4,5,6,7,8};
int low = lower_bound(t.begin(), t.end(), 5) - t.begin();
int upp = upper_bound(t.begin(), t.end(), 5) - t.begin();
cout << low << endl; //4
cout << upp << endl; //5
三、binary_search()函数

**函数模板:**binary_search(arr,arr+size , value)

ps: begin和end中的前闭后开区间,其中begin为容器起始位置,end为容器最后一个元素的下一个元素的位置

参数说明:
arr[]: 数组首地址
size: 数组元素个数
value: 需要查找的值

在数组中以二分法检索的方式查找,若在数组(要求数组元素非递减,即要求升序)中查找到value元素则真,若查找不到则返回值为假。

vector a = { 4,10,11,30,69,70,96,100 };
bool is_found = binary_search(a.begin(), a.end(), 100);
cout << is_found << endl;

说明: 使用以上函数需要对数组进行升序排序。

参考:

https://www.cnblogs.com/wkfvawl/p/9475939.html

https://www.cnblogs.com/Tang-tangt/p/9291018.html

你可能感兴趣的:(C++)