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

1 STL組建(STL Components)
關鍵組建:容器枷餐,迭代器残黑,算法
STL的基本觀念就是將數(shù)據(jù)和操作分離,數(shù)據(jù)由容器類加以管理晃危,操作則由可定制的算法定義之叙赚,迭代器在兩者之間充當粘合劑,使任何算法都可以和任何容器交互運作
2 容器(Containers)和迭代器
迭代器的分類:
1 雙向迭代器:
可以雙向進行僚饭,以遞增運算前進或以遞減運算符后退(list set multiset map multimap 均提供此類迭代器)
2隨機存期迭代器:
隨機存取迭代器具備雙向迭代器的所有有屬性還具備隨機訪問能力:vector deque string
3之間差異:
For(pos=coll.begin();pos!=coll.end();++pos) { ………………… } For(pos=coll.begin();pos<coll.end();++pos) ………
只有隨機訪問迭代器才支持operation<<; 所以代碼一般會寫成第一種
容器相關函數(shù):
reverse()將區(qū)間能元素翻轉
coll2.resize(coll.size());//改變coll2元素個數(shù)
deque<int>coll3(coll1.size());初始化時指明要有的足夠空間
六迭代器之配接器:
(一)三種迭代器配接器:
1 Insert iterators(安插型迭代器)
2stream iterators(流迭代器)
3Reverse iterators(逆向迭代器)
安插型迭代器:
Inset iterators 可以使算法以安插的方式而非覆寫方式運作可以解決算法的“目標空間不足”的問題是的它會促使目標區(qū)間的大小按需要成長
如果對某個元素設值會引發(fā)所屬群集的安插操作震叮,至于插入位置在容器的最前還是最后或是某個指定位置上,需要視三種情況而定:
(1) 單步前進不造成任何動靜
1.1 Back inserters(安插于容器最尾端)
Back inseters 內部調用push_back()在容器尾端插入元素

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));

這種動作逆轉了被安插元素的次序如果先安插1再向前安插2那么1會在2后邊提供push_front的容器只有:deque list
2.3 Generalinerters(一般性安插器):
一般性的inserters它的作用是將元素插入初始化時接受第二個參數(shù)的位置的前方inserters 內部調用成員函數(shù)insert()并以新值和新位置做參數(shù)所有STL容器都提供insert()函數(shù)
(2)Stream Iterator(流迭代器)

copy(istream_iterator<string>(cin),istream_iterator<string>(),back_inserter(coll));
sort(coll.begin(),coll.end());
unique_copy(coll.begin(),coll.end(),ostream_iterator<string>(cout,"\n"));

2.1istream_iterator<string>(cin)
這個產(chǎn)生一個可從標準輸入流cin讀取數(shù)據(jù)的streamiterator

2.2 istream_iterator<string>()
調用istreamiterator 的default構造函數(shù)產(chǎn)生一個代表”流結束”符號的迭代器它表示你不能在從中讀取任何東西

2.3 ostream_iterator<string>(cout,”\n”)
產(chǎn)生一個output stream iterator浪慌,透過operator<<向cout寫入strings第二個參數(shù)作為元素之間分割符

(2) Reverse Iterator(逆向迭代器)
逆向方式進行操作
所有容器都可以通過成員函數(shù)rbegin()和rend()產(chǎn)生出reverse iterator
(二)更易型算法(manipulatingalgorithm刪除或重排或修改元素的算法)
1 算法remove()自某個區(qū)間刪除元素

for(inti=1;i<=6;++i)
    {
        coll.push_front(i);
        coll.push_back(i);
 
    }
remove(coll.begin(),coll.end(),3);
結果:654211245656

數(shù)值為3刪除后被其后元素覆蓋冤荆,至于群集尾端那些違背覆蓋的元素朴则,原封不動但從邏輯上說权纤,那些元素已經(jīng)不屬于這個群集了
改進:

List<int>::iterator end=remove(coll.begin(),coll.end(),3)
copy(coll.begin()end,ostream_iterator<int>(cout,","));
結果:6542112456

或者采用:
Distance(end,coll.end());
Distance()是返回兩個迭代器之間的距離
如果真想把刪除的元素斬草除根你必須調用該容器的相應成員函數(shù)容器提供成員函數(shù)erase()適用此目的erase()可以刪除“參數(shù)所指示區(qū)間”內的全部元素
2更易型算法和相關容器
Erase()成員函數(shù)返回刪除元素的個數(shù)
(三)以函數(shù)作為算法的參數(shù)

void print(intelem)
{
    cout<<elem<<" ";
}
for_each(coll.begin(),coll.end(),print);

2判斷式(predicate)
所謂predicate就是返回布爾值的函數(shù)他們通常用來指定排序規(guī)則和搜索準則,并非任何返回bool值得一元函數(shù)或二元函數(shù)就是合法的predicate STL要求面對相同的值predicate必須得出相同的結果乌妒,這條戒律將那些“被調用時會改變自己內部狀態(tài)的函數(shù)排除了”
3仿函數(shù)(functors,FunctionObject即函數(shù)對象)
傳遞給算法的“函數(shù)參數(shù)”不一定是函數(shù)汹想,可以是行為類似函數(shù)的對象
仿函數(shù)的優(yōu)點:
(1) 智能型含糊 smart point
仿函數(shù)可擁有成員函數(shù)和成員變量這意味著仿函數(shù)擁有狀態(tài),其次你可以在初始時初始化他們撤蚊,當然必須在他們被調用之前
(2) 仿函數(shù)都有自己的型別(可以設計函數(shù)繼承體系)
(3) 仿函數(shù)比一般函數(shù)要快
預定義的仿函數(shù):
Set<int>coll;會被擴展為set<int,less<int>>coll;
所以反向排列這些元素可以是set<int,greater<int>>coll;
透過一些特殊函數(shù)配接器你可以將預定義的仿函數(shù)和其它數(shù)值組合到一起或使用特殊狀況
例如:
Transform(coll.begin(),coll.end(),back_inserter(coll2),bind2d(mltiiplies<int>(),10)
將coll中的所有元素乘以10后安插到coll2中這里使用配接器使得multiple<int>運算時以源群集的元素作為第一個參數(shù)古掏,10作為第二個參數(shù)
仿函數(shù)一般聲明為:inline
特殊仿函數(shù):

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

仿函數(shù)mem_fun_ref用來調用他所作用的元素的某個成員函數(shù)
(四)容器內的元素
1 容器元素的條件
(1)必須可以通過copy構造函數(shù)進行復制,copy函數(shù)的性能盡可能優(yōu)化
(2)必須可以透過assignment操作符完成賦值操作(即=號)
(3)必須可以通過析構函數(shù)完成銷毀動作析構函數(shù)決不能設計成preivate
析構函數(shù)決不能拋出異常
(4) 對于序列式容器而言侦啸,元素的default構造函數(shù)必須可用
(5) 對于某些動作必須定義operatpor==以執(zhí)行相等測試
(6)在關聯(lián)式容器中元素必須定義排序準則缺省情況下operator<透過仿函數(shù)less<>調用

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末槽唾,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子光涂,更是在濱河造成了極大的恐慌庞萍,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件忘闻,死亡現(xiàn)場離奇詭異钝计,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門私恬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來债沮,“玉大人,你說我怎么就攤上這事本鸣∫唏茫” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵荣德,是天一觀的道長隧土。 經(jīng)常有香客問我,道長命爬,這世上最難降的妖魔是什么曹傀? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮饲宛,結果婚禮上皆愉,老公的妹妹穿的比我還像新娘。我一直安慰自己艇抠,他們只是感情好幕庐,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著家淤,像睡著了一般异剥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上絮重,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天冤寿,我揣著相機與錄音,去河邊找鬼青伤。 笑死督怜,一個胖子當著我的面吹牛,可吹牛的內容都是我干的狠角。 我是一名探鬼主播号杠,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼丰歌!你這毒婦竟也來了姨蟋?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤立帖,失蹤者是張志新(化名)和其女友劉穎眼溶,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體厘惦,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡偷仿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年哩簿,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酝静。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡节榜,死狀恐怖,靈堂內的尸體忽然破棺而出别智,到底是詐尸還是另有隱情宗苍,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布薄榛,位于F島的核電站讳窟,受9級特大地震影響,放射性物質發(fā)生泄漏敞恋。R本人自食惡果不足惜丽啡,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望硬猫。 院中可真熱鬧补箍,春花似錦、人聲如沸啸蜜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽衬横。三九已至裹粤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蜂林,已是汗流浹背遥诉。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留悉尾,地道東北人突那。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓挫酿,卻偏偏與公主長得像构眯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子早龟,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內容