二分查詢適用於有序序列。
lower_bound()函式
返回第一次出現大於等於那個要查詢的數的位址
upper_bound()函式
返回的是第乙個比要查詢的數大的數的位址 (注意 這裡是大於 不包括等於)
注意 返回的是乙個迭代器 也就是指標 所以 我們一般這樣寫//返回乙個迭代器,表示第乙個大於等於val的元素,如果不存在這樣的元素,則返回end。
lower_bound(beg, end, val);
lower_bound(beg, end, val, comp);//自定義過載運算子
//返回乙個迭代器,表示第乙個大於val的元素,如果不存在這樣的元素,則返回end。
upper_bound(beg, end, val);
upper_bound(beg, end, val, comp);//自定義過載運算子
unique()
unique()是c++標準庫函式裡面的函式,其功能是去除相鄰的重複元素(只保留乙個),所以使用前需要對陣列進行排序
原理
它並沒有將重複的元素刪除,而是把重複的元素放到陣列的最後麵藏起來了 返回給你乙個指向不重複序列的最後乙個數字的迭代器,所以要用返回的迭代器減去a的首位址 就得到了 去重後的陣列長度
使用方法:對於長度為n陣列a,unique(a,a+n) - a 返回的是去重後的陣列長度
next_permutation(start,end),和prev_permutation(start,end)。
這兩個函式作用是一樣的,區別就在於前者求的是當前排列的下乙個排列,後乙個求的是當前排列的上乙個排列。至於這裡的「前乙個」和「後乙個」,我們可以把它理解為序列的字典序的前後,嚴格來講,就是對於當前序列pn,他的下乙個序列pn+1滿足:不存在另外的序列pm,使pn對於next_permutation函式,其函式原型為:
#include
bool next_permutation(iterator start,iterator end)
當當前序列不存在下乙個排列時,函式返回false,否則返回true
看具體用法:
例題 51nod1384
#include#include#include#includeusing namespace std;
int main()while(next_permutation(ch,ch+l));
return 0;
}
離散化 去重 二分查詢
離散化是程式設計中乙個常用的技巧,它可以有效的降低時間複雜度。其基本思想就是在眾多可能的情況中,只考慮需要用的值。離散化可以改進乙個低效的演算法,甚至實現根本不可能實現的演算法。要掌握這個思想,必須從大量的題目中理解此方法的特點。例如,在建造線段樹空間不夠的情況下,可以考慮離散化。1 排序 2 去重...
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...