算法的形式
-容器container 是個(gè)class template
-算法algorithm 是個(gè)function template
算法是要來處理容器中的data,但是算法看不到容器只能通過迭代器獲取參數(shù)
算法向迭代器索取data,迭代器從容器中取得data提供給算法
算法在處理data時(shí)會(huì)需要知道data容器的形式,這由迭代器告訴算法
算法發(fā)出提問迭代器無法回答的時(shí)候編譯失敗
迭代器的分類 (category)
迭代器是要由容器來提供的,根據(jù)容器中數(shù)據(jù)移動(dòng)特性不同而不同
五種結(jié)構(gòu)為五種不同類型的迭代器,可以被封裝成對(duì)象
編譯過后,編譯器會(huì)在變量名前后加上其他附加字符作為變量標(biāo)號(hào)
不同標(biāo)準(zhǔn)庫版本的做法并不相同,但是接口必須一致
在有些繼承關(guān)系中的父類只做了一些類型的定義,沒有data和function,這時(shí)候子類可以繼承父類的各種類型
迭代器分類 (category) 對(duì)算法的影響
distance算法接受兩個(gè)參數(shù),計(jì)算兩個(gè)指針參數(shù)之間的距離
算法的精細(xì)可以大大提高操作的效率
在算法中對(duì)不同迭代器進(jìn)行分類操作,對(duì)不同的結(jié)構(gòu)進(jìn)行不同的操作可以提高運(yùn)行速度
而標(biāo)準(zhǔn)庫中的算法已經(jīng)很精細(xì)地寫出了各種分類的操作
對(duì)標(biāo)準(zhǔn)庫的信任和使用非常重要
算法對(duì)迭代器沒有強(qiáng)制要求,只有暗示,建議使用會(huì)使效率更高的迭代器
算法源代碼剖析 (11個(gè)例子)
c算法和c++算法的區(qū)別,是否以函數(shù)模板形式寫出來的
accumulate累計(jì)算法
有兩個(gè)版本
-每次將數(shù)值累加
-每次將元素做第三個(gè)參數(shù)所給出的累次操作,一般情況第三個(gè)參數(shù)所給的是一個(gè)可被調(diào)用的可以函數(shù)也可以是仿函數(shù)
for_each算法
對(duì)容器中的元素進(jìn)行依次操作
以一個(gè)for循環(huán)對(duì)每個(gè)元素進(jìn)行第三個(gè)參數(shù)的操作
也可以使用c++11新形式range-based for statement
replace、replace_if、replace_copy算法
取代算法,修改所有key value
條件取代算法,修改所有符合判定式子的value
拷貝取代算法,在新空間中拷貝元素,修改新空間所有key value
count、count_if算法
計(jì)數(shù)算法,對(duì)范圍內(nèi)所有元素計(jì)數(shù)
條件計(jì)數(shù)算法,對(duì)范圍內(nèi)復(fù)合條件的元素計(jì)數(shù)
在有些容器中,存在成員函數(shù)count,這時(shí)候要使用自己的count而不能使用全局count
成員函數(shù)中沒有count的容器才可以使用全局count
find、find_if算法
查找算法,順序查找算法
條件查找算法,附條件的順序查找算法
在有些容器中,存在成員函數(shù)find,這時(shí)候要使用自己的find而不能使用全局find
成員函數(shù)中沒有find的容器才可以使用全局find
sort算法
排序算法
在有些容器中,存在成員函數(shù)sort,這時(shí)候要使用自己的count而不能使用全局sort
成員函數(shù)中沒有sort的容器才可以使用全局sort
reverse iterator
逆序迭代器,rbegin()和rend()
迭代器,逆向指向容器頭尾
binary search算法
二分查找算法
要先排序,再查找
仿函數(shù)/函數(shù)對(duì)象
functors仿函數(shù),六大部件中最簡(jiǎn)單的一種
當(dāng)算法需要一些獨(dú)特的準(zhǔn)則時(shí),需要一些特定的操作,這時(shí)候要用一般函數(shù)或者仿函數(shù)來實(shí)現(xiàn)
三大類
-算數(shù)類
-邏輯運(yùn)算類
-相對(duì)關(guān)系類
仿函數(shù)要繼承才能與STL符合
存在多種Adapter
適配器,六大部件的最后一個(gè)
改造接口,不改變主要功能
以復(fù)合方式實(shí)現(xiàn)功能
Binder2nd
function adapter函數(shù)適配器
not1
bind
reverse_iterator
inserter
ostream_iterator
istream_iterator
.