STL中二分查詢

2021-09-25 05:59:44 字數 1926 閱讀 6342

偶然遇到了一些問題,記錄一下

標頭檔案#include

1.binary_search:查詢某個元素是否出現。

函式原型:bool lower_bound(forwarditer first, forwarditer last,const _tp& val)

函式功能:在陣列中以二分法檢索的方式查詢,若在陣列(要求陣列元素非遞減)中查詢到val元素則真,若查詢不到則返回值為假。

2.lower_bound:查詢第乙個大於或等於某個元素的位置。

函式原型:forwarditer lower_bound(forwarditer first, forwarditer last,const _tp& val)

函式功能:要求陣列已排序,返回乙個非遞減序列[first, last)中的第乙個大於等於值val的位置(迭代器)。如果所有元素都小於val,則返回last的位置,該位置可能越界,為容器的end()。

3.upper_bound:查詢第乙個大於某個元素的位置。

函式原型:forwarditer upper_bound(forwarditer first, forwarditer last, const _tp& val)

函式功能:要求陣列已排序,返回乙個非遞減序列[first, last)中第乙個大於val的位置(迭代器)。如果所有元素都小於val,則返回last的位置,該位置可能越界,為容器的end()。

舉個例子:

std::vectorvec;

std::vector::iterator it1 = std::lower_bound(vec.begin(), vec.end(), 4);

it1表示第乙個數值為4 的位置

std::vector::iterator it2 = std::upper_bound(vec.begin(), vec.end(), 4);

it2表示數值為5的位置

基礎用法應該很容易理解,那麼如果是二維陣列呢?

假設 乙個行和列都是遞增的二維陣列,std::vector> vec2 = , , };

函式的第三個引數應該是一維陣列,如果定義函式 bool find(int target, std::vector> array)意在尋找target是否存在於該陣列中,那麼函式可以這麼寫(函式寫的有問題,只是想說明寫法而已):

bool find(int target, std::vector> array) );

//...這裡省略it3判斷

return std::binary_search(it3->begin(), it3->end(), target);

}

呼叫find(2, vec2);  那麼it3會返回第二行,也就是。

相同地,如果要找的是結構體,那麼也要構造結構體。

假設乙個結構體

struct stu

stu(int a, int b) :id(a), age(b) {}

bool operator<(const stu m)const

};int main()

,, };

std::vector::iterator it4 = std::upper_bound(vec2.begin(), vec2.end(), stu(2, 0));

std::cout << it4->id << " " << it4->age << std::endl; //輸出3 80

}

結構體裡必須過載比較運算子,因為是根據id值來排序,因此構造stu第二個引數可以隨便寫,第乙個引數是要找的基準。

python中二分查詢

二分查詢也稱折半查詢,它的效率較高。但是二分查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列。寫二分查詢時有兩個方法,乙個是用遞迴,乙個不用遞迴。用遞迴的方法如下 coding utf 8 def binary search alist,item 二分查詢。遞迴法 n len ali...

Java中二分查詢

給定乙個陣列,我們要查詢當前資料在陣列中的位置,雖然可以使用迴圈乙個個遍歷,但是由於要使 執行時間盡可能的小,所以我們要採用二分法來查詢。先上 public class binarysearch else if k arr m else return 1 public static void mai...

stl 二分查詢

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