下标从1开始,返回长度为n的数组a中最后一个等于key的下标
int search1(int a[], int n, int key){
  int l = 1, r = n, ans;
  while (l <= r){
    int mid = (l + r) / 2;
    if (a[mid] <= key){
      l = mid + 1;
      ans = mid;
    }else{
      r = mid - 1;
    }
  }
  return a[ans]==key ? ans : -1;
}下标从1开始,返回长度为n的数组a中最第一个等于key的下标
int search2(int a[], int n, int key){
  int l = 1, r = n, ans;
  while (l <= r){
    int mid = (l + r) / 2;
    if (a[mid] < key){
      l = mid + 1;
    }else{
      r = mid - 1;
      ans = mid;
    }
  }
  return a[ans] == key ? ans, -1;
}low_bound、upper_bound
using namespace std;
int main(){
  int a[11]={0,1,2,3,4,4,4,5,6,7,8};
  //lower_bound(begin, end, key)
  //二从数组的begin位置到end-1位置二分查找第一个大于或等于key的数字,
  //找到返回该数字的地址,不存在则返回end。
  int pos = lower_bound(a+1, a+10+1, 4) - a;
  cout<<pos<<endl;
  
  //upper_bound(begin, end, key)
  //从数组的begin位置到end-1位置二分查找第一个大于key的数字,
  //找到返回该数字的地址,不存在则返回end。
  int pos2 = upper_bound(a+1, a+10+1, 4) - a;
  cout<<pos2<<endl; 
  return 0;
}                
                









