STL與泛型編程第四周學(xué)習(xí)筆記——Boolan

在完成了STL與泛型編程前三周的學(xué)習(xí)之后,有一些總結(jié)和心得在這里通過(guò)學(xué)習(xí)筆記的方式分享出來(lái),筆記我是跟著老師在視頻中所講的內(nèi)容按照順序記錄的,也不能說(shuō)是流水賬,對(duì)課程中的一些問(wèn)題還是添加了自己的理解和分析,供也在學(xué)習(xí)C++的小伙伴用作學(xué)習(xí)交流,如有理解不到位的地方,歡迎批評(píng)指正。

上兩周,老師就分配器和容器的結(jié)構(gòu)與分類做了詳細(xì)的介紹,本周接著之前的內(nèi)容繼續(xù)學(xué)習(xí)STL的另一個(gè)重要組成部分——算法。

一.算法簡(jiǎn)介

從語(yǔ)言層面上講,STL幾個(gè)重要部件中,只有算法Algorithm是函數(shù)模板,容器Container、迭代器Iterator、仿函數(shù)Functor、適配器Adaptor、分配器Allocator都是類模板。

算法是看不見容器的,它無(wú)法直接獲得容器中的信息。它所需要的一切信息都必須從迭代器取得,所以迭代器必須能夠回答算法的所有提問(wèn)才能搭配該算法的所有操作。


不同容器提供了不同的迭代器,各種迭代器之間實(shí)際是一種繼承關(guān)系:


可以隨意位置進(jìn)出的容器迭代器繼承自雙向進(jìn)出的容器迭代器,雙向進(jìn)出的容器迭代器繼承自單向進(jìn)出的容器迭代器,單向進(jìn)出的容器迭代器又繼承自input_iterator,output_iterator非容器提供。


二.Iterator_category和type_traits對(duì)算法的影響


對(duì)于以上代碼,是計(jì)算兩個(gè)迭代器之間的距離,返回類型是difference_type;從上面的代碼可以看出,算法本身是一個(gè)主函數(shù),根據(jù)迭代器不同的分類而調(diào)用不同的次函數(shù)。

至于type_traits對(duì)算法的影響,老師舉了一個(gè)copy算法的例子:


該算法需要三個(gè)變量,即來(lái)源端起始端、來(lái)源端終止端以及目的端起始端。從課件可以看出,算法copy不斷地檢查,到了分支的地方,決定調(diào)用哪個(gè)次函數(shù),來(lái)保證算法的最高效。

算法源碼中對(duì)iterator_category沒有限制,但會(huì)有“暗示”:


在C++標(biāo)準(zhǔn)庫(kù)中,它提供的algorithms以函數(shù)形式呈現(xiàn),老師舉了7個(gè)算法當(dāng)作例子。

1.算法accumulate

2.算法for_each

3.算法replace,replace_if,replace_copy

4.算法count,count_if

5.算法sort(這里需要注意:對(duì)于unordered容器,不需要調(diào)用sort算法,遍歷之后元素自動(dòng)排序,自然形成sorted狀態(tài))

6.算法find,find_if(這里需要注意的是:對(duì)于unordered容器,有自己的find算法,對(duì)于array,vector,list,forward_list,deque容器,它們帶有成員函數(shù)sort,因此標(biāo)準(zhǔn)庫(kù)中的find算法不適用)

7.算法binary_search(這里需要注意的是:lower_bound(v.begin(),v.end(),x),元素x安插在能夠安插進(jìn)去的最低點(diǎn);upper_bound(v.begin,v.end(),x),元素x安插在能夠安插進(jìn)去的最高點(diǎn))

三.仿函數(shù)(functors)

當(dāng)要求算法需要有一些特定準(zhǔn)則時(shí),就會(huì)編寫仿函數(shù)去告訴算法。標(biāo)準(zhǔn)庫(kù)提供的functors有幾大類:算術(shù)類(Arithmetic)、邏輯運(yùn)算類(Logical)、相對(duì)關(guān)系類(Relational),且標(biāo)準(zhǔn)庫(kù)提供的functors都有繼承關(guān)系。

仿函數(shù)functors的可適配(adaptable)條件:希望functors可以被修改,則必須選擇繼承適當(dāng)?shù)暮瘮?shù)struct;adaptor提問(wèn),functors回答,才能融合進(jìn)STL中。


存在多種Adapters:Functor Adapter與Functor、Iterator Adapter與Iterator、Container Adapter與Container之間都是內(nèi)含的關(guān)系,其實(shí)就相當(dāng)于改造。


在之前的內(nèi)容中,我們學(xué)過(guò)容器stack和容器queue可以用Sequence當(dāng)作底層容器,此時(shí)stack和queue被稱作容器適配器。同樣也存在函數(shù)適配器,這里老師舉了函數(shù)適配器binder2nd和not1的例子:


Binder2nd繼承自u(píng)nary_function,將某個(gè)Adaptable?Binary function轉(zhuǎn)換為Unary Function:


這里需要注意的是:Typename()表示創(chuàng)建臨時(shí)對(duì)象,在很長(zhǎng)的提問(wèn)之前都加上typename

C++11之后又添加了新型適配器bind,std::bind可以綁定functions、function?objects、member functions以及data members

四.迭代器適配器Iteratoradaptors

1.reverse_iterator

reverse_iterator默認(rèn)排序是由小到大,用rbegin()和rend()來(lái)由大到小排序。


逆向迭代器取值,是將對(duì)應(yīng)正向迭代器退一位:


2.inserter


上述代碼中foo是容器,it是迭代器


這個(gè)adapter將iterator的賦值操作改為安插(insert)操作,并將iterator右移一個(gè)位置。如此便可連續(xù)執(zhí)行表面上賦值而實(shí)際上insert的行為。


另外,在C++標(biāo)準(zhǔn)庫(kù)中,除了迭代器適配器,還有X適配器ostream_iterator和instream_iterator

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容