头文件:#include<algorithm>
upper_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
lower_bound( )和upper_bound( )都是利用二分查找的方法在一个排好序的数组中进行查找的。
举例说明:
vector<int> v={0 ,2 ,1 ,4 ,7 ,6}; vector<int>::iterator up1; up1=upper_bound(v.begin(),v.end(),3); cout<<up1-v.begin()<<endl;
类似的,我们可以写下如下程序:
int a[6]={1,3,5,6,7,9}; int temp=upper_bound(a,a+6,7)-a; cout<<temp<<endl;
类似:
int num[6]={1,2,4,7,15,34}; sort(num,num+6); //按从小到大排序 int pos1=lower_bound(num,num+6,7)-num; //返回数组中第一个大于或等于被查数的值 int pos2=upper_bound(num,num+6,7)-num; //返回数组中第一个大于被查数的值 cout<<pos1<<" "<<num[pos1]<<endl; cout<<pos2<<" "<<num[pos2]<<endl; sort(num,num+6,cmd); //按从大到小排序
其实也是第一种情况的部分,只不过换了一种形式
当set里所有值都小于关键字时,lower_bound返回a.end()
以std::map为例,
lower_bounder()返回的迭代器指向第一个[大于等于]目标值的元素(以升序为例),
upper_bound()返回的迭代器指向第一个 [大于]目标值的元素(以升序为例)。
#include <iostream> #include <map> int main() { std::map<char, int> mymap; std::map<char, int>::iterator itlow, itup; mymap['a'] = 20; mymap['b'] = 40; mymap['c'] = 60; mymap['d'] = 80; mymap['e'] = 100; itlow = mymap.lower_bound('b'); // itlow points to b itup = mymap.upper_bound('d'); // itup points to e (not d!) mymap.erase(itlow, itup); // erases [itlow,itup) // print content: for (std::map<char, int>::iterator it = mymap.begin(); it != mymap.end(); ++it) std::cout << it->first << " => " << it->second << '\n'; return 0; }
---------------------------------------------------------------------------------------------------------------------------------
除此之外的一些小知识