C 學習筆記 泛型演算法

2021-07-16 16:41:42 字數 2319 閱讀 2668

標準庫給容器定義了一些基本的操作,還定義了一組泛型演算法,稱它們為演算法,是因為它們實現了一些經典演算法的公共介面,如排序和搜尋,稱它們是泛型的,是因為它們可以用於不同型別的元素和多種容器型別,甚至包括內建陣列型別。

泛型演算法通過迭代器來進行相應的操作,根據操作的不同,可以將泛型演算法分為唯讀演算法(如查詢、比較)、寫容器元素演算法(如拷貝)、重排容器元素的演算法(如排序、剔重)、以及隨機數生成演算法等。

迭代器使得泛型演算法不依賴於容器,但演算法依賴於元素型別的操作。如查詢演算法需要比較當前元素是否等於要查詢的元素,這時需要==操作符,如果該元素型別定義了==操作符,則直接使用元素型別定義的版本,否則需要使用者自行定義類似操作符功能的函式,然後將該函式作為引數傳遞給泛型演算法的介面。排序演算法需要《操作符,如果元素型別沒有定義《操作符,那麼也是需要定義相應的函式。在某些使用自定義函式不能滿足要求的場合,可以使用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...