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)指正绸栅。

上周對(duì)于STL,老師做了一個(gè)大概的介紹页屠,本周接著上周的內(nèi)容繼續(xù)學(xué)習(xí)了分配器以及各類容器的結(jié)構(gòu)與分類粹胯。

一.OOP與GP的區(qū)別

OOP(Object-Oriented programming)企圖將datas和methods關(guān)聯(lián)在一起

GP(Generic Programming)卻是將datas和methods分開來(lái),如下圖所示:


采用GP卷中,Containerns和Algorithms兩個(gè)團(tuán)隊(duì)可以閉門造車矛双,其間以Iterator溝通即可。Algorithms通過(guò)Iterators確定操作范圍蟆豫,并通過(guò)Iterators取用Container中的元素议忽。

二.特化(Specialization)和偏特化(Partial Specialization)

C++源碼中運(yùn)用了大量的操作符重載(Operator Overloading)以及模板(Templates),操作符重載的相關(guān)規(guī)則這里就不再贅述十减,模板的運(yùn)用分為類模板(Class Templates)栈幸、函數(shù)模板(Function Templates)和成員模板(Member Templates)愤估,之前的課程有詳細(xì)講過(guò),老師也進(jìn)行了復(fù)習(xí)速址,這里也不再贅述玩焰。

我的理解是,特化就是泛化的反面芍锚,常規(guī)的模板都是泛化的昔园,所謂特化,就是當(dāng)模板替代類型中的一個(gè)類型有它特有的處理方法時(shí)并炮,我們可以將template< >中的內(nèi)容抽離出來(lái)默刚,即為這個(gè)類型定義它特有的方法,如下代碼所示:


偏特化分為個(gè)數(shù)上的偏和范圍上的偏逃魄。

個(gè)數(shù)上的偏很好理解荤西,就是具有多個(gè)模板參數(shù)時(shí),將一部分模板參數(shù)特化伍俘,其他模板參數(shù)保持泛化邪锌,如下代碼所示:


這里值得注意的是,特化部分參數(shù)只能從左至右特化癌瘾,也就是說(shuō)觅丰,不能第一個(gè)模板參數(shù)泛化,而將第二個(gè)模板參數(shù)特化妨退。

我理解的范圍上的偏就是模板參數(shù)的類型是一個(gè)指針舶胀,那么模板參數(shù)所代表的類型就是這個(gè)指針?biāo)赶虻念愋汀H缦麓a所示:


這里值得注意的是碧注,該指針指向什么由程序員自己定義嚣伐。

三.分配器(allocators)

分配器最重要的兩個(gè)函數(shù):allocate()和deallocate()

VC6所附的標(biāo)準(zhǔn)庫(kù),其分配器的實(shí)現(xiàn)只是以::operator new()和::operator delete()來(lái)完成allocate()和deallocate()萍丐,并沒(méi)有任何特殊的設(shè)計(jì)轩端。


而operator new()和operator delete()本質(zhì)上還是調(diào)用基本的內(nèi)存分配函數(shù)malloc()和內(nèi)存釋放函數(shù)free():


BC++與VC6一樣,最終還是調(diào)用malloc()和free()逝变,并且也是分配512ints基茵,但是分配多少內(nèi)存就要還多少內(nèi)存,因此其接口設(shè)計(jì)非常不利于直接使用壳影。


G2.9并沒(méi)用使用分配器allocator拱层,而創(chuàng)造了另一個(gè)分配器alloc,


alloc的實(shí)現(xiàn)如下圖所示:


用鏈表的方式來(lái)分配內(nèi)存宴咧,盡量減少調(diào)用malloc的次數(shù)根灯,這樣程序運(yùn)行效率更高,節(jié)省了額外的開銷。

但是之后的G4.9并沒(méi)有使用這種高效率的alloc分配器(原因不得而知)烙肺,而是改用了new_allocator分配器纳猪,這又與之前提到的VC/BC一致了,本質(zhì)上還是調(diào)用malloc和free桃笙。但是G4.9所附的標(biāo)準(zhǔn)庫(kù)中氏堤,有許多extention allocators,其中_pool_alloc就是G2.9中的alloc

四.容器——結(jié)構(gòu)與分類

先來(lái)一張老師整理出的各種容器類型和所占字節(jié)數(shù)的圖:


1.容器list

List其實(shí)是一個(gè)環(huán)狀雙向鏈表搏明,用雙向指針串起來(lái)鼠锈,如下圖所示:


List的iterator是一個(gè)類,G2.9中星著,這個(gè)類與list是包含關(guān)系脚祟。


這里值得注意的是,除了array和vector之外强饮,所有容器的iterator都必須是class


之前說(shuō)到過(guò)GP的好處就是將data和algorithm分開,那么iterator就是它們之間的橋梁为黎,算法提出的問(wèn)題邮丰,iterator要必須都能回答,這是iterator必須遵循的原則铭乾。

Iterators的五個(gè)associated types:

①Iterator_category()分類

②Difference_type()距離

③Value_type()指向值的類型

④Reference

⑤Pointer

后面兩個(gè)目前還未使用剪廉。

萃取機(jī)(Iterator Traits)用以分離class iterators(直接問(wèn))和non-class iterators(間接問(wèn))

加入中間層traits,利用偏特化回答non-class類型


2.容器vector

Vector是一種單向開口先進(jìn)后出的容器炕檩,它所占用的是連續(xù)內(nèi)存空間斗蒋,因此它不能原地?cái)U(kuò)充,一旦空間不夠笛质,它必須尋找新的空間擴(kuò)充泉沾,并且二倍增長(zhǎng),整個(gè)搬離到新開辟的兩倍空間妇押。


Vector靠3根指針控制整個(gè)容器:


因其是占用連續(xù)內(nèi)存空間跷究,所以它的iterator不必設(shè)計(jì)成class

3.容器array

Arry跟vector一樣,也是占用連續(xù)的內(nèi)存空間敲霍,其iterator是native pointer


4.容器forward_list

Forward_list是一種線狀單向串列俊马,與雙向鏈表list差不多


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市肩杈,隨后出現(xiàn)的幾起案子柴我,更是在濱河造成了極大的恐慌,老刑警劉巖扩然,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件艘儒,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)彤悔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門嘉抓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人晕窑,你說(shuō)我怎么就攤上這事抑片。” “怎么了杨赤?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵敞斋,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我疾牲,道長(zhǎng)植捎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任阳柔,我火速辦了婚禮焰枢,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘舌剂。我一直安慰自己济锄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布霍转。 她就那樣靜靜地躺著荐绝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪避消。 梳的紋絲不亂的頭發(fā)上低滩,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音岩喷,去河邊找鬼恕沫。 笑死,一個(gè)胖子當(dāng)著我的面吹牛纱意,可吹牛的內(nèi)容都是我干的昏兆。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼妇穴,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼爬虱!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起腾它,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤跑筝,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后瞒滴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體曲梗,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赞警,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了虏两。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片愧旦。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖定罢,靈堂內(nèi)的尸體忽然破棺而出笤虫,到底是詐尸還是另有隱情,我是刑警寧澤祖凫,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布琼蚯,位于F島的核電站,受9級(jí)特大地震影響惠况,放射性物質(zhì)發(fā)生泄漏遭庶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一稠屠、第九天 我趴在偏房一處隱蔽的房頂上張望峦睡。 院中可真熱鬧,春花似錦权埠、人聲如沸榨了。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至粱快,卻和暖如春秩彤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背事哭。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工漫雷, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鳍咱。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓降盹,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親谤辜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蓄坏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容