stl提供了很多泛型演算法,基本涵蓋了一般程式所能應用到的所有演算法。本篇以目錄式的方式,介紹stl的包含的演算法。在以後的編程實踐中,如果遇到相似的問題,應該參考stl的演算法代碼。
數值演算法
1、T accumulate(InputIterator first, InputIterator last, T init)
累加,該演算法要求提供一個明確的初始值init,原因是這樣可以確保當first和last之間沒有元素時,函數的傳回值是確定的。
2、OutputIterator adjacent_difference(InputIterator first, InputIterator last, OutputIterator result)
計算相鄰元素的差值,儲存在result開始的序列中。第一個位置,即result處,儲存的就是first的值。
3、T inner_product(InputIterator first1, InputIterator last1,InputIterator first2, InputIterator last2, T init);
內積
4、OutputIterator adjacent_difference(InputIterator first, InputIterator last, OutputIterator result)
計算相鄰元素的和值,將*first賦給*resut,(*first+*(first+1))賦值給*(result+1),以此類推。該操作和adjacent_difference互為逆操作
5、T power(T x, integer n)
冪運算,該演算法的實現提示,提升求冪的效率為(lgn)。
Set演算法
這部分演算法不適用於hash_table,hash_set這樣的容器。
1、set_union
並集
2、set_intersection
交集
3、set_difference
差集
4、set_symmetric_difference
對稱差集
heap演算法
1、make_heap
2、push_heap
3、pop_heap
4、sort_heap
其他演算法
1、adjacent_find
需找滿足條件的相鄰元素
2、count
計算等於某個值的元素個數
3、count_if
計算滿足某個條件的元素個數
4、find
尋找第一個等於某個值的元素
5、find_if
尋找第一個滿足某個條件的元素
6、find_end
ForwardIterator find_end(ForwardIterator first1, ForwardIterator last1,ForwardIterator first2, ForwardIterator last2);
尋找[first1,last1)所涵蓋的區間中,尋找序列[first2,last2)最後出現的點。
7、find_first_of
和6類似,尋找第一次出現的點
8、includes
bool includes(InputIterator first1,InputIterator last1, Inputterator first2,InputIterator last2)
判斷序列1是否涵蓋序列2,相當於集合的包含。
9、merg
合并兩段有序序列
10、partition
將區間的元素重排,滿足某個條件的被置於區間的前端,否則被置於區間的後段。該演算法不保證元素的原始相對位置。
11、remove
移除區間內某個值的元素
12、replace
void replace(ForwardIterator first,ForwardIterator last, const T& old_value, const T& new_value);
將區間內的元素所有的old_value,替換為new_value
13、replace_if
14、reverse
將序列重排
15、rotate
void rotate(ForwardIterator first,ForwardIterator middle, ForwardIterator last)
將[first, middle)和[middle,last)內的元素互換,無論這兩段長度是否一致。
16、unique
移除相鄰,相等的元素
17、lower_bound
應用於有序區間,二分尋找的一種版本,返回“不破壞排序狀態下第一個可插入value的位置。
18、upper_bound
與lower_bound類似,返回”不破壞排序狀態下,最後一個可插入value的位置“;
19、binary_search
二分尋找,返回true或false,指示有序序列中是否包含value。該演算法實際上是基於17或18實現的。
20、next_permutation
首先說明一下什麼事“下一個排列”和“前一個排列”。考慮(a,b,c)三個字元組成的排列:abc,acb,bac,bca,cab,cba,這個六個排列是按less than做字典排序的。那麼abc的下一個排列就是acb,沒有前一個序列;cba的前一個序列是cab,沒有下一個排列。next_permutation(first,last)返回[first,last)所表示之排列的下一個排列。
演算法描述如下:從序列的尾端往前尋找兩個相臨的元素,第一個為i,第二個為ii,且滿足*i<*ii。找到這樣一組相鄰元素後,再從最尾端開始往前檢驗,找出第一個大於*i的元素,令為*j。將*i與*j對調,再將ii之後(包括ii)所有元素顛倒排列。所得序列即下一個排列。
21、prev_permutation
與next_permutation對應,演算法描述如下:從序列的尾端往前尋找兩個相臨的元素,第一個為i,第二個為ii,且滿足*i>*ii。找到這樣一組相鄰元素後,再從最尾端開始往前檢驗,找出第一個小於*i的元素,令為*j。將*i與*j對調,再將ii之後(包括ii)所有元素顛倒排列。所得序列即下一個排列。
22、random_shuffle
將[first,last)的元素隨機重排。該演算法描述如下:從first開始遍曆列表,將當前元素*i隨機地與[first,i]之間的某個元素交換位置。
23、partial_sort
本演算法使[first,last)k個最小元素以遞增順序位於[first,first+k)內。相對於將整個序列排序來說,該演算法的效率要高。演算法的描述如下:在[first,first+k)建立起一個最大堆,然後依次檢查[first+k,last)之間的元素,如果某元素比最大堆的最大元素大就忽略,否則進行交換,並重新保持最大堆特性。這樣當遍曆結束後,最小的k個元素已經位於[first,first+k),在對這個區間進行一次堆排序就OK了。