非變動性算法代碼分析與示例:
一、for_each
函數以模闆實作,_Inlt 即 iterator 類型,_Fn1 是函數指針,函數體内首先判斷疊代器是否在範圍内以及傳遞的第三個參數是否是函
數指針,接下去兩行實際上就是定義兩個臨時的疊代器,相當于 _Inlt ChkFirst(_First); 在周遊的過程中将每個容器元素取出并當作參
數傳遞給函數指針,即 _Func(*ChkFirst); for_each 函數傳回值是函數指針
二、max_element、min_element
兩個函數實作差不多,隻看min_element:
首先 #define _ASSIGN_FROM_BASE(_Dest, _Src) _Dest = (_Src) 即将_Min_element 函數的傳回值複制給_First,而在
_Min_element 函數内就是周遊容器,不斷儲存最小元素的位置,其中 #define _DEBUG_LT(x, y) ((x) < (y)) 故
_DEBUG_LT(*_First, *_Found) 也就是取出元素比較大小,傳回最後儲存的最小元素位置。
實際上min_element 還重載了另一個函數模闆:
主要的差別隻是在于這個版本可以自定義進行比較,比如如果容器内不是裝着數值元素,而是string 或者其他類型,也許它們沒有重
載 operator<,可以自定義一個函數對它們進行比較大小,如 #define _DEBUG_LT_PRED(pred, x, y) pred(x, y) 就是這個意思。
三、find、find_if
裡面很多宏跟前面函數出現的是一樣的,find 就是周遊容器,找出與Val 相等的第一個元素位置,函數傳回疊代器 。
find_if 則可以自定義查找,不一定是與某值相等,也可以其他比較如大于小于等,如 if (_Pred(*_First)) 如果_Pred 函數傳回為真
則break,至于_Pred 怎樣實作就不關find_if 的事了。
示例代碼1:
四、search
函數傳入4個疊代器,假設前兩個疊代器訓示的位置有10個元素,後兩個疊代器訓示的位置有2個元素,如果在第一個區間能夠找到
完全比對第二個區間的元素,則傳回起始位置,如果不能則傳回Last1,即第一個區間末尾,注意必須順序比對2個元素,也可以看
成在第一個區間尋找第一次出現的第二個區間子段。
函數的實作也不難了解,雙重循環,比如首先比較L1[0] 與 L2[0] , 如果相等再比較L1[1] 與 L2[1]; 如果不等則移動,從L1[1] 開始比
較,假設L1[4], L1[5] 與L2[0], L2[1] 完全比對,則傳回值是指向L1[4] 的 iterator。
此外seach 也重載了另一個版本,可以自定義比較,代碼比較長且跟上面重複較多就不貼了,主要的變化就是将上面24行的代碼
換成 else if (!_Pred(*_Mid1, *_Mid2)) 也就是自定義比較邏輯。
下面貼一個MSDN 的例子:
參考:
C++ primer 第四版
Effective C++ 3rd
C++程式設計規範