STL源碼剖析之六:演算法

來源:互聯網
上載者:User

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了。

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.