STL学习之——lower_bound && upper_bound

C++ STL lower_bound与upper_bound详解
本文详细介绍了C++ STL中lower_bound与upper_bound函数的使用方法及原理。lower_bound用于查找有序数列中第一个大于等于指定值的位置;upper_bound则用于查找第一个大于指定值的位置。文章通过示例代码展示了这两个函数的应用。

1.lower_bound

  • 简介:是指返回一个有序数列中第一个大于等于key的位置.如果所有元素都小于key,则返回最后一个数last
  • 头文件:#include <algorithm>
  • 用法:
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 using namespace std;
 5 int a[]={1,2,3,3,4,5};
 6 int main()
 7 {
 8     cout<<lower_bound(a, a+6, 3)-a<<endl;   //key=
 9     system("pause");
10     return 0;
11 }
  • 运行结果:4
  • 拓展:c++ STL 中的 lower_bound
 1 //这个算法中,first是最终要返回的位置
 2 int lower_bound(int *array, int size, int key)
 3 {
 4     int first = 0, middle;
 5     int half, len;
 6     len = size;
 7 
 8     while(len > 0) {
 9         half = len >> 1;
10         middle = first + half;
11         if(array[middle] < key) {     
12             first = middle + 1;          
13             len = len-half-1;       //在右边子序列中查找
14         }
15         else
16             len = half;            //在左边子序列(包含middle)中查找
17     }
18     return first;
19 }

 2.upper_bound

  • 简介:是指返回一个有序数列中第一个大于key的位置.如果所有元素都小于key,则返回最后一个数last
  • 头文件:同lower_bound
  • 用法:

 

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 using namespace std;
 5 int b[]={9,8,7,7,6,5};
 6 int main()
 7 {
 8     cout<<upper_bound(a, a+6, 3)-a<<endl;   //key=3
 9     system("pause");
10     return 0;
11 }
  • 运行结果:2
  • 拓展:c++ STL 中的 upper_bound:

 

 1 int upper_bound(int *array, int size, int key)
 2 {
 3     int first = 0, len = size-1;
 4     int half, middle;
 5 
 6     while(len > 0){
 7         half = len >> 1;
 8         middle = first + half;
 9         if(array[middle] > key)     //中位数大于key,在包含last的左半边序列中查找。
10             len = half;
11         else{
12             first = middle + 1;    //中位数小于等于key,在右半边序列中查找。
13             len = len - half - 1;
14         }
15     }
16     return first;
17 }

 

转载于:https://www.cnblogs.com/lulala/p/7162310.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值