標準庫給容器定義了一些基本的操作,還定義了一組泛型演算法,稱它們為演算法,是因為它們實現了一些經典演算法的公共介面,如排序和搜尋,稱它們是泛型的,是因為它們可以用於不同型別的元素和多種容器型別,甚至包括內建陣列型別。
泛型演算法通過迭代器來進行相應的操作,根據操作的不同,可以將泛型演算法分為唯讀演算法(如查詢、比較)、寫容器元素演算法(如拷貝)、重排容器元素的演算法(如排序、剔重)、以及隨機數生成演算法等。
迭代器使得泛型演算法不依賴於容器,但演算法依賴於元素型別的操作。如查詢演算法需要比較當前元素是否等於要查詢的元素,這時需要==操作符,如果該元素型別定義了==操作符,則直接使用元素型別定義的版本,否則需要使用者自行定義類似操作符功能的函式,然後將該函式作為引數傳遞給泛型演算法的介面。排序演算法需要《操作符,如果元素型別沒有定義《操作符,那麼也是需要定義相應的函式。在某些使用自定義函式不能滿足要求的場合,可以使用c++11新增的lambda表示式,參考《c++ primer》第5版 p345。
如果使用容器定義的操作或者增加少量的**就能滿足某些要求,那麼盡量不要使用泛型演算法,所有的泛型演算法見《c++ primer》第5版 p770。下面僅列出比較實用,但自己實現有些麻煩的泛型演算法。
(1)二分搜尋演算法
binary_search(beg,end,val)
binary_search(beg,end,val,comp) comp是自定義的用於比較兩個元素型別是否相等的函式
(2)排序演算法
sort(beg,end)
stable_sort(beg,end)
sort(beg,end,comp)
stable_sort(beg,end,comp) comp是自定義的用於比較兩個元素型別大小的函式
(3)重排演算法
unique(beg,end) 要先進行sort使得重複元素相鄰,然後才可以使用此演算法對相鄰的重複元素,
通過覆蓋它們來進行「刪除」,參考《c++ primer》第5版 p343
unique(beg,end,binarypred) binarypred是自定義的用於比較相鄰兩個元素型別是否相等的函式
random_shuffle(beg,end) 混洗輸入序列中的元素
random_shuffle(beg,end,rand) 生成(0,rand)區間內的服從均勻分布的隨機整數
shuffle(beg,end,uniform_rand) uniform_rand必須滿足均勻分布隨機生成器的要求(這好像是乙個可呼叫的函式名?)
(4)有序序列的集合演算法
注意,使用下面這些演算法要求序列已經是有序的。這些演算法提供了類似集合操作的行為,適用於普通順序容器,但是標準容器set反而沒有提供這些行為。參考《c++ primer》第5版 p779。
includes(beg,end,beg2,end2)
includes(beg,end,beg2,end2,comp)
set_union(beg,end,beg2,end2,dest)
set_union(beg,end,beg2,end2,dest,comp)
set_intersection(beg,end,beg2,end2,dest)
set_intersection(beg,end,beg2,end2,dest,comp)
set_difference(beg,end,beg2,end2,dest)
set_difference(beg,end,beg2,end2,dest,comp)
set_symmetric_difference(beg,end,beg2,end2,dest)
set_symmetric_difference(beg,end,beg2,end2,dest,comp)
(5)最小值和最大值
有18個演算法,此處不一一列出,參考《c++ primer》第5版 p779。
(6)數值演算法
上面提到的演算法都定義在中,數值演算法定義在中
accumulate(beg,end,init) 對序列中所有值進行累加求和,初始值為init,使用元素型別的+運算子
accumulate(beg,end,init,binarypred) 使用指定的二元操作binarypred
inner_product(beg1,end1,beg2,init) 對兩個序列求內積,即對應元素的積的和,和的初始值為init
inner_product(beg1,end1,beg2,init,binop1,binop2) 使用binop1代替加法,binop2代替乘法
(7)隨機數
很少用到,不一一列出,參考《c++ primer》第5版 p781。
C 學習筆記之泛型演算法
先貼個 有時間的再補筆記 1 include2 using namespace std 34 模板類在接收了引數之後會將引數例項化5 自然可以接收 vector和 vector 67 templatevoid print t vec 列印該例項 813 cout 1516 templatevoid ...
C 學習筆記 泛型
泛型將型別引數的概念引入了.net,當我們需要設計類和方法,並將它們的型別制定推遲到客戶端 宣告,並例項化該型別和方法時,可以使用泛型。泛型使之前的想法成為了可能。使用泛型避免了執行時強制轉換或裝箱操作帶來的風險。簡單來說,首先制定乙個特定符號代替實際型別,當建立該型別的例項時,才指定它的實際型別。...
C 泛型學習筆記
泛型概述 使用泛型型別可以最大限度地重用 保護型別的安全以及提高效能。泛型最常見的用途是建立集合類。net framework 類庫在 system.collections.generic 命名空間中包含幾個新的泛型集合類。應盡可能地使用這些類來 代替普通的類,如 system.collection...