STL中的二分查詢

2022-09-12 20:09:09 字數 2229 閱讀 7047

本文**於

使用的時候注意:必須用在非遞減的區間中

二分查詢的原理非常簡單,但寫出的**中很容易含有很多bug,二分查詢一文中講解過如何實現不同型別的二分查詢,但是否一定要自己去實現二分查詢呢?答案顯然是否定的,本文將講解stl中與二分查詢有關函式的具體使用方法及其實現原理。

stl中與二分查詢相關的函式有4個,分別是lower_bound, upper_bound, equal_range和binary_search,下面通過乙個簡單的例子說明各個函式的使用方法。

其中每個函式實現的功能如下:

binary_search試圖在已排序的[first, last)中尋找元素value。如果[first, last)內有等價於value的元素,它會返回true,否則返回false,它不返回查詢位置。

lower_bound它試圖在已排序的[first,last)中尋找元素value。如果[first, last)具有等價於value的元素,lower_bound返回乙個iterator指向其中第乙個元素。如果沒有這樣的元素存在,它便返回假設這樣的元素存在的話,會出現的位置。即指向第乙個不小於value的元素。如果value大於[first, last)的任何乙個元素,則返回last。

upper_bound它試圖在已排序的[first,last)中尋找value,返回可安插value的最後乙個合適的位置。如果value存在,lower_bound 返回的是指向該元素的iterator。相較之下upper_bound並不這麼做,它返回value可被安插的最後乙個合適位置。如果value存在,那麼它返回的iterator將指向value的下乙個位置,而非value自身。

equal_range的返回值本質上結合了lower_bound和upper_bound兩者的返回值。其返回值是一對iterator i 和 j , 其中i是value可安插的第乙個位置,j則是value可安插的最後乙個位置。可以推演出:[i,j)中的每個元素都等價於value,而且[i, j)是[first, last)之中符合上述性質的乙個最大子區間。  演算法lower_bound返回該range的第乙個iterator, 演算法upper_bound返回該range的past-the-end iterator,演算法equal_range則是以pair的形式將兩者都返回。

stl 中的 lower_bound(),

函式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的位置是越界的!!~

#include #include 

#include

#include

#include

#include

#include

#include

using

namespace

std;

intmain() ;

int tmp = upper_bound(point, point + 5, 7)- point;//

按從小到大,7最多能插入陣列point的哪個位置

printf("

%d\n

",tmp);

tmp = lower_bound(point, point + 5, 7) - point;///

/按從小到大,7最少能插入陣列point的哪個位置

printf("

%d\n

",tmp);

return

0;

}

stl 二分查詢

在stl中對二分查詢進行了封裝,有兩種 upper bound,lower bound。例如 pos lower bound a,a n,value 查詢value值在長度為n的陣列a中的位置 關於返回值,函式lower bound 在first和last中的前閉後開區間進行二分查詢,返回大於或等於...

STL 二分查詢

實現原始碼 1.在乙個遞增的陣列 或vector 中查詢元素屬於 s e 的下標 2.查詢遞增陣列中元素是否存在 使用binary search 注 對於結構體,要麼過載小於符號 bool operator 要麼定義有小於符號含義的cmp函式。3.應用在遞減序列中 include include i...

STL中的二分查詢(binary search)

stl中對於有序序列 vector,list等 提供了相當相當強大的二分搜尋binary search演算法。對於可以隨機訪問容器 如vector等 binary search負載度為對數級別 logn 對於非隨機訪問容器 如list 則演算法複雜度為線性。現在簡要介紹一下幾種常用的binary s...