(Boolan) STL與泛型編程第四周筆記(上)

1 STL組建(STL Components)

關(guān)鍵組建:容器,迭代器,算法

STL的基本觀念就是將數(shù)據(jù)和操作分離,數(shù)據(jù)由容器類加以管理,操作則由可定制的算法定義之, 迭代器在兩者之間充當(dāng)粘合劑,使任何算法都可以和任何容器交互運(yùn)作

2 容器(Containers)和迭代器

迭代器的分類:

1 雙向迭代器:

可以雙向進(jìn)行,以遞增運(yùn)算前進(jìn)或以遞減運(yùn)算符后退(list set multiset map multimap 均提供此類迭代器)

2隨機(jī)存期迭代器:

隨機(jī)存取迭代器具備雙向迭代器的所有有屬性還具備隨機(jī)訪問能力:vector deque string

3之間差異:

只有隨機(jī)訪問迭代器才支持operation <<; 所以代碼一般會(huì)寫成第一種

容器相關(guān)函數(shù):

reverse()將區(qū)間能元素翻轉(zhuǎn)

coll2.resize(coll.size());// 改變coll2元素個(gè)數(shù)

dequecoll3(coll1.size());初始化時(shí)指明要有的足夠空間

六迭代器之配接器:

(一)三種迭代器配接器:

1 Insert iterators(安插型迭代器)

2stream iterators(流迭代器)

3Reverse iterators(逆向迭代器)

安插型迭代器:

Inset iterators 可以使算法以安插的方式而非覆寫方式運(yùn)作可以解決算法的“目標(biāo)空間不足” 的問題是的它會(huì)促使目標(biāo)區(qū)間的大小按需要成長(zhǎng)

如果對(duì)某個(gè)元素設(shè)值會(huì)引發(fā)所屬群集的安插操作,至于插入位置在容器的最前還是最后或是某個(gè)指定位置上,需要視三種情況而定:

(1) 單步前進(jìn)不造成任何動(dòng)靜

1.1 Back inserters(安插于容器最尾端)

Back inseters 內(nèi)部調(diào)用push_back()在容器尾端插入元素

For(pos=coll.begin();pos!=coll.end();++pos) { ………………… } For(pos=coll.begin();pos

Copy(coll1.begin(),coll1.end(),back_inserter(coll2)

(只有vector deque list提供push_back())

2.2 Front Inserters(安插于容器最前端)

Copy(coll1.begin(),coll1.end(),front_inserter(coll3));

這種動(dòng)作逆轉(zhuǎn)了被安插元素的次序如果先安插1再向前安插2那么1會(huì)在2后邊提供push_front的容器只有:deque list

2.3 Generalinerters(一般性安插器):

一般性的inserters它的作用是將元素插入初始化時(shí)接受第二個(gè)參數(shù)的位置的前方inserters 內(nèi)部調(diào)用成員函數(shù)insert()并以新值和新位置做參數(shù)所有STL容器都提供insert()函數(shù)

(2)Stream Iterator(流迭代器)

copy(istream_iterator(cin),istream_iterator(),back_inserter(coll));

sort(coll.begin(),coll.end());

unique_copy(coll.begin(),coll.end(),ostream_iterator(cout,"\n"));

2.1istream_iterator(cin)

這個(gè)產(chǎn)生一個(gè)可從標(biāo)準(zhǔn)輸入流cin讀取數(shù)據(jù)的streamiterator

2.2 istream_iterator()

調(diào)用istreamiterator 的default構(gòu)造函數(shù)產(chǎn)生一個(gè)代表”流結(jié)束”符號(hào)的迭代器它表示你不能在從中讀取任何東西

2.3 ostream_iterator(cout,”\n”)

產(chǎn)生一個(gè)output stream iterator,透過operator<< 向cout寫入strings第二個(gè)參數(shù)作為元素之間分割符

(2) Reverse Iterator(逆向迭代器)

逆向方式進(jìn)行操作

所有容器都可以通過成員函數(shù)rbegin()和rend()產(chǎn)生出reverse iterator

(二)更易型算法(manipulatingalgorithm刪除或重排或修改元素的算法)

1 算法remove()自某個(gè)區(qū)間刪除元素

for(inti=1;i<=6;++i)

? ? {

? ? ? ? coll.push_front(i);

? ? ? ? coll.push_back(i);

? ? }

remove(coll.begin(),coll.end(),3);

結(jié)果:654211245656

數(shù)值為3刪除后被其后元素覆蓋,至于群集尾端那些違背覆蓋的元素,原封不動(dòng)但從邏輯上說,那些元素已經(jīng)不屬于這個(gè)群集了

改進(jìn):

List::iterator end=remove(coll.begin(),coll.end(),3)

copy(coll.begin()end,ostream_iterator(cout,","));

結(jié)果:6542112456

或者采用:

Distance(end,coll.end());

Distance()是返回兩個(gè)迭代器之間的距離

如果真想把刪除的元素?cái)夭莩惚仨氄{(diào)用該容器的相應(yīng)成員函數(shù)容器提供成員函數(shù)erase()適用此目的erase()可以刪除“ 參數(shù)所指示區(qū)間”內(nèi)的全部元素

2更易型算法和相關(guān)容器

Erase()成員函數(shù)返回刪除元素的個(gè)數(shù)

(三)以函數(shù)作為算法的參數(shù)

void print(intelem)

{

? ? cout<

}

for_each(coll.begin(),coll.end(),print);

2判斷式(predicate)

所謂predicate就是返回布爾值的函數(shù)他們通常用來指定排序規(guī)則和搜索準(zhǔn)則,并非任何返回bool值得一元函數(shù)或二元函數(shù)就是合法的predicate STL要求面對(duì)相同的值predicate必須得出相同的結(jié)果,這條戒律將那些“被調(diào)用時(shí)會(huì)改變自己內(nèi)部狀態(tài)的函數(shù)排除了”

3仿函數(shù)(functors,FunctionObject即函數(shù)對(duì)象)

傳遞給算法的“函數(shù)參數(shù)”不一定是函數(shù),可以是行為類似函數(shù)的對(duì)象

仿函數(shù)的優(yōu)點(diǎn):

(1) 智能型含糊 smart point

仿函數(shù)可擁有成員函數(shù)和成員變量這意味著仿函數(shù)擁有狀態(tài),其次你可以在初始時(shí)初始化他們,當(dāng)然必須在他們被調(diào)用之前

(2) 仿函數(shù)都有自己的型別(可以設(shè)計(jì)函數(shù)繼承體系)

(3) 仿函數(shù)比一般函數(shù)要快

預(yù)定義的仿函數(shù):

Setcoll;會(huì)被擴(kuò)展為set>coll;

所以反向排列這些元素可以是set>coll;

透過一些特殊函數(shù)配接器你可以將預(yù)定義的仿函數(shù)和其它數(shù)值組合到一起或使用特殊狀況

例如:

Transform(coll.begin(), coll.end(),back_inserter(coll2),bind2d(mltiiplies(),10)

將coll中的所有元素乘以10后安插到coll2中這里使用配接器使得multiple運(yùn)算時(shí)以源群集的元素作為第一個(gè)參數(shù),10作為第二個(gè)參數(shù)

仿函數(shù)一般聲明為:inline

特殊仿函數(shù):

For_each(coll.begin(),coll.end(),mem_fun_ref(&Person::save());

仿函數(shù)mem_fun_ref用來調(diào)用他所作用的元素的某個(gè)成員函數(shù)

(四)容器內(nèi)的元素

1 容器元素的條件

(1)必須可以通過copy構(gòu)造函數(shù)進(jìn)行復(fù)制, copy函數(shù)的性能盡可能優(yōu)化

(2)必須可以透過assignment操作符完成賦值操作(即=號(hào))

(3)必須可以通過析構(gòu)函數(shù)完成銷毀動(dòng)作析構(gòu)函數(shù)決不能設(shè)計(jì)成preivate

析構(gòu)函數(shù)決不能拋出異常

(4) 對(duì)于序列式容器而言,元素的default構(gòu)造函數(shù)必須可用

(5) 對(duì)于某些動(dòng)作必須定義operatpor==以執(zhí)行相等測(cè)試

(6)在關(guān)聯(lián)式容器中元素必須定義排序準(zhǔn)則缺省情況下operator<透過仿函數(shù)less<>調(diào)用

?著作權(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)容