- algorithm是一個(gè)函數(shù)模板设哗,他看不見(jiàn)container,對(duì)其一無(wú)所知两蟀,所以他需要的一切信息都必須從iterators取得网梢,而iterator必須能夠回答algorithm的所有提問(wèn),體能搭配algorithm的所有操作赂毯。
- 在typeinfo頭文件中的typeid操作符獲得一個(gè)對(duì)象战虏,對(duì)這個(gè)對(duì)象調(diào)用name()可以獲得它的類型名稱拣宰。
- iteator的分類 iterator_category
共分為五類,iterator的分類直接影響算法的效率烦感。
以copy()算法為例
- 對(duì)于count,count_if,find,find_if對(duì)于關(guān)聯(lián)容器和無(wú)序關(guān)聯(lián)容器有專門(mén)的成員函數(shù)巡社。
- 對(duì)于sort對(duì)于list,forward_list有專門(mén)的成員函數(shù)手趣。
- 算法binary_search必須作用一個(gè)排序后的容器晌该。
- 仿函數(shù)就是一種類,它沒(méi)有別的東西回懦,只有一個(gè)重載的運(yùn)算符()气笙,仿函數(shù)主要服務(wù)于算法,用于傳遞給算法運(yùn)算準(zhǔn)則怯晕,因?yàn)樗墓δ茴愃婆c函數(shù)潜圃,所以叫他仿函數(shù)。
- 對(duì)于一個(gè)類型名后面直接加一個(gè)()舟茶,則表示創(chuàng)建一個(gè)類型為這個(gè)類的臨時(shí)變量谭期,此用法多用向算法傳入運(yùn)算規(guī)則的仿函數(shù)。例如:
sort(a.begin(),b.end(),less<int>())
/*
less<int>為一個(gè)類吧凉,它是一個(gè)仿函數(shù)隧出,less<int>()表示創(chuàng)建一個(gè)less<int>類型的臨時(shí)變量傳入到srot中
*/
-
在STL體系結(jié)構(gòu)中,仿函數(shù)要選擇適當(dāng)?shù)念愡M(jìn)行進(jìn)行繼承阀捅。類除了能繼承函數(shù)外胀瞪,還能繼承類型別名。
一個(gè)仿函數(shù)的可適配條件是它能回答一些問(wèn)題饲鄙,如first_argument_type是什么類型凄诞,所以這個(gè)仿函數(shù)除了要完成操作符()的重載外,還要繼承例如binary_function的類來(lái)實(shí)現(xiàn)回答問(wèn)題的功能忍级,例如:
myclass類不能回答類似first_argument_type是什么類型這種問(wèn)題帆谍。 -
多重adapters
adapter即定義類型別名,或者改變函數(shù)名等等轴咱。
-
新型適配器bind
1.using namespace std::placeholder;//可以使用占位符_1 ,_2......表示第一第二個(gè)參數(shù)......
2.my_divide也可以是一個(gè)仿函數(shù)(function objects)
3.bind<int>表示確定返回值類型為int型
4.綁定成員函數(shù)和成員變量時(shí)汛蝙,有一個(gè)默認(rèn)的參數(shù)this -
通過(guò)編寫(xiě)適配器可以改變已有算法的行為。例如:
copy本來(lái)的行為是直接覆蓋插入點(diǎn)后的數(shù)據(jù)朴肺,而且也不檢查復(fù)制行為是否越界窖剑,通過(guò)編寫(xiě)inserter迭代器適配器來(lái)改變copy中*result=*first
中操作符=的行為,從而得到類似插入的操作戈稿。inserter為一個(gè)輔助函數(shù)西土,insert_iterator為實(shí)現(xiàn)功能的主要適配器。insert_iterator中的protected成員變量為需要保存的類型信息器瘪。insert_iterator中對(duì)操作符=的重載實(shí)現(xiàn)具體功能翠储。