STL之二分查找(binary_search(),lower_bound(),upper_bound() )

二分查找(二分检索):

 

二分法检索又称折半检索,二分法检索的基本思想是设字典中的元素从小到大有序地存放在 数组 array )中,      首先将给定值key与
 
字典 中间位置上元素的关键码(key)比较,如果相等,则检索成功;        否则,若key小,则在字典前半部分中继续进行二分法检索;
 
k ey大,则 在字典后半部分中继续进行二分法检索。      这样,经过一次比较就缩小一半的检索区间,如此进行下去,直到检索成功或
 
检索失败。      数个取中间2个其中任何一个作为中间元素。        二 分法检索是一种效率较高的检索方法,要求字典在 顺序表 中按
 
键码 排序。
 
 
 
二分查找函数: binary_search():
 
头文件:  #include
 
函数模板:binary_search(arr[],  size  ,  indx)         
 
参数说明:     arr[]: 数组首地址;
                         size:  数组元素个数;
                         indx:    需要查找的值。
 
函数功能:  在数组中以二分法检索的方式查找,若在数组(要求数组元素非递减)中查找到indx元素则返回其下标,若查找不到则返回值为假。
 
 
 
lower_bound():
 
头文件:  #include
 
函数模板: 如 binary_search()
 
函数功能:  函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小于val,则返回last的位置
 
举例如下:
 

一个数组number序列为:4,10,11,30,69,70,96,100.设要插入数字3,9,111.pos为要插入的位置的下标

 

pos = lower_bound( number, number + 8, 3) - number,pos = 0.即number数组的下标为0的位置。

 

pos = lower_bound( number, number + 8, 9) - number, pos = 1,即number数组的下标为1的位置(即10所在的位置)。

pos = lower_bound( number, number + 8, 111) - number, pos = 8,即number数组的下标为8的位置(但下标上限为7,所以返回最后一个元素的下一个元素)。

 

所以,要记住:函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小于val,则返回last的位置,且last的位置是越界的!!~

返回查找元素的第一个可安插位置,也就是“元素值>=查找值”的第一个元素的位置

 

upper_bound():

 

头文件:#include

 

函数模板: 如binary_search()

 

函数功能:函数upper_bound()返回的在前闭后开区间查找的关键字的上界,返回大于val第一个元素位置

 

例如:一个数组number序列1,2,2,4.upper_bound(2)后,返回的位置是3(下标)也就是4所在的位置,同样,如果插入元素大于数组中全部元素,返回的是last。(注意:数组下标越界)

返回查找元素的最后一个可安插位置,也就是“元素值>查找值”的第一个元素的位置

 

注意:

          lower_bound(val): 返回容器中第一个值【大于或等于】val的元素的iterator位置。
         upper_bound(val): 返回容器中第一个值【大于】val的元素的iterator位置。
 
拓展:
         insert()用法:
              比如vector _rows中已经有了{0,1,3,5}
              这时要放入4,则std::lower_bound( _rows.begin(), _rows.end(), 4);将会返回5,就是应该插入的那个位置后面的那个值
             然后_rows.insert( iter, 4);这句将按照从小到大的顺序将4放进去,最后的顺序是{0,1,3,4,5}

你可能感兴趣的:(C++小知识)