3.0L2-C09-二分查找
题单介绍
## 课程教学目标:
#### $1.手搓二分左边界模板;$
#### $2.手搓二分右边界模板;$
```cpp
/*
lower_bound(begin, end, val)
在有序数组中连续地址[begin, end)中找到第1个位置并返回其地址,使得val插入在这个位置前面,有序
如果找不到这种元素则返回 插入之后依然有序的位置。
upper_bound(begin, end, val)
在有序数组中连续地址[begin, end)中找到最后一个位置+1并返回其地址,使得val插入在这个位置前面,有序
如果找不到这种元素则返回 插入之后依然有序的位置。
*/
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
int n = 10;
int val = 2;
int a[10]= {0,0,2,2,2,2,4,4,5};
printf("下标:");
for (int i=0; i<10; i++) printf("%d ", i);
printf("\n数值:");
for (int i=0; i<10; i++) printf("%d ", a[i]);
// //直接返回的是地址
cout << "\n\nlower_bound(begin, end, val):\n第1次出现的地址为:";
cout << lower_bound(a, a+n, val) << endl; //第1次出现的位置
cout << "数组下标为:";
cout << lower_bound(a, a+n, val) - a << endl; //计算位置编号
val = 3;
cout << "如果没有则返回的位置是插入后依然有序的位置:";
cout << lower_bound(a, a+n, val) - a << endl;
val = 2;
cout << "\nupper_bound(begin, end, val):\n最后出现的位置+1的地址为:";
cout << upper_bound(a, a+n, val) << endl;
cout << "数组下标为:"<<upper_bound(a, a+n, val)-a << endl; //6 , [gegin, end)
#if 1
val = 3;
cout << "如果没有则返回的位置是插入之后依然有序的位置:";
cout << upper_bound(a, a+n, val) - a << endl;
#endif
return 0;
}
```