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