Boolan - C++學(xué)習(xí)筆記 _STL - 第二周

STL與泛型編程
一、 STL是什么
STL(Standard Template Library),即標(biāo)準(zhǔn)模板庫(kù),是一個(gè)具有工業(yè)強(qiáng)度的,高效的C++程序庫(kù)。它被容納于C++標(biāo)準(zhǔn)程序庫(kù)(C++ Standard Library)中,是ANSI/ISO C++標(biāo)準(zhǔn)中最新的也是極具革命性的一部分。該庫(kù)包含了諸多在計(jì)算機(jī)科學(xué)領(lǐng)域里所常用的基本數(shù)據(jù)結(jié)構(gòu)和基本算法。為廣大C++程序員們提供了一個(gè)可擴(kuò)展的應(yīng)用框架,高度體現(xiàn)了軟件的可復(fù)用性。
從邏輯層次來(lái)看,在STL中體現(xiàn)了泛型化程序設(shè)計(jì)的思想(generic programming),引入了諸多新的名詞,比如像需求(requirements),概念(concept),模型(model),容器(container),算法(algorithmn),迭代子(iterator)等。與OOP(object-oriented programming)中的多態(tài)(polymorphism)一樣,泛型也是一種軟件的復(fù)用技術(shù);
從實(shí)現(xiàn)層次看,整個(gè)STL是以一種類型參數(shù)化(type parameterized)的方式實(shí)現(xiàn)的,這種方式基于一個(gè)在早先C++標(biāo)準(zhǔn)中沒(méi)有出現(xiàn)的語(yǔ)言特性--模板(template)。如果查閱任何一個(gè)版本的STL源代碼,你就會(huì)發(fā)現(xiàn),模板作為構(gòu)成整個(gè)STL的基石是一件千真萬(wàn)確的事情。除此之外,還有許多C++的新特性為STL的實(shí)現(xiàn)提供了方便;
二、STL的六大組件
STL:主要包含 6 個(gè) parts:
容器(Container),是一種數(shù)據(jù)結(jié)構(gòu),如list,vector,和deques ,以模板類的方法提供。為了訪問(wèn)容器中的數(shù)據(jù),可以使用由容器類輸出的迭代器;
迭代器(Iterator),提供了訪問(wèn)容器中對(duì)象的方法。例如,可以使用一對(duì)迭代器指定list或vector中的一定范圍的對(duì)象。迭代器就如同一個(gè)指針。事實(shí)上,C++的指針也是一種迭代器。但是,迭代器也可以是那些定義了operator*()以及其他類似于指針的操作符地方法的類對(duì)象;
算法(Algorithm),是用來(lái)操作容器中的數(shù)據(jù)的模板函數(shù)。例如,STL用sort()來(lái)對(duì)一個(gè)vector中的數(shù)據(jù)進(jìn)行排序,用find()來(lái)搜索一個(gè)list中的對(duì)象,函數(shù)本身與他們操作的數(shù)據(jù)的結(jié)構(gòu)和類型無(wú)關(guān),因此他們可以在從簡(jiǎn)單數(shù)組到高度復(fù)雜容器的任何數(shù)據(jù)結(jié)構(gòu)上使用;
仿函數(shù)(Function object,仿函數(shù)(functor)又稱之為函數(shù)對(duì)象(function object),其實(shí)就是重載了()操作符的struct,沒(méi)有什么特別的地方
迭代適配器(Adaptor)
空間配制器(allocator)其中主要工作包括兩部分1.對(duì)象的創(chuàng)建與銷毀 2.內(nèi)存的獲取與釋放。
2.1 部件之間的關(guān)系

三、整個(gè)課程目錄:

第二課:體系結(jié)構(gòu)與內(nèi)核分析
每天一句:源碼之前,了無(wú)密碼。

閱讀源碼的好處:(轉(zhuǎn))
很多作家成名之前都閱讀過(guò)大量的優(yōu)秀文學(xué)作品,經(jīng)過(guò)長(zhǎng)期的閱讀和寫作積累,慢慢的才有可能寫出一些好的、甚至是優(yōu)秀的文學(xué)作品。 而程序員與此類似,很多程序員也需要閱讀大量的優(yōu)秀程序或產(chǎn)品,經(jīng)過(guò)不斷閱讀和實(shí)踐積累,然后可能寫出好的程序或產(chǎn)品。養(yǎng)成閱讀高品質(zhì)代碼的習(xí)慣 可以提高編寫代碼的能力。
第一個(gè)好處是可以學(xué)習(xí)到很多編程的方法,看好的源代碼,對(duì)于提高自己的編程水平,比自己寫源代碼的幫助更大。當(dāng)然不是說(shuō)不用自己寫,而是說(shuō),自己寫代碼的同時(shí),可以從別人寫的好的源代碼中間學(xué)習(xí)到更多的編程方法和技巧。
第二個(gè)好處是,可以提高自己把握大規(guī)模源代碼的能力。一個(gè)比較大型的程序,往往都是經(jīng)過(guò)了很多個(gè)版本很長(zhǎng)的時(shí)間,有很多人參與開(kāi)發(fā),修正錯(cuò)誤,添加功能而發(fā)展起來(lái)的。所以往往源代碼的規(guī)模都比較大,少則10-100多k, 多的有好幾十個(gè)MB. 在閱讀大量源代碼的時(shí)候,能夠提高自己對(duì)大的軟件的把握能力,快速了解脈絡(luò),熟悉細(xì)節(jié),不僅僅是編程技巧,還能在程序的架構(gòu),設(shè)計(jì)方面提高自己的能力。(這里說(shuō)一句題外話,<<設(shè)計(jì)模式>>這本書(shū)相信很多人都看過(guò),而且很多人對(duì)它推崇備至,奉為經(jīng)典?,F(xiàn)在也出了不少書(shū),都是冠以"設(shè)計(jì)模式"這一名稱。在書(shū)中就提到,設(shè)計(jì)模式并不是一本教材,不是教你如何去編程序,而是把平時(shí)編程中一些固定的模式記錄下來(lái),加以不斷的測(cè)試和改進(jìn),分發(fā)給廣大程序員的一些經(jīng)驗(yàn)之談。我在看這本書(shū)的時(shí)候,有一些地方一些設(shè)計(jì)方法往往讓我有似曾相識(shí)的感覺(jué),另外一些則是我以前就常常用到的。而這些經(jīng)驗(yàn)的獲得,一部分得益于自己的編碼過(guò)程,另外一個(gè)很重要的來(lái)源就是閱讀別人寫的源代碼。)
閱讀源代碼第三個(gè)好處,就是獲得一些好的思想。比如,有很多人在開(kāi)始一個(gè)軟件項(xiàng)目之前都喜歡到sourceforge.net上去找一下,是否有人以前做過(guò)相同或者相似的軟件,如果有,則拿下來(lái)讀一讀,可以使自己對(duì)這個(gè)軟件項(xiàng)目有更多更深的認(rèn)識(shí)。我以前曾經(jīng)想找一本關(guān)于如何閱讀源代碼的書(shū)來(lái)看看,卻沒(méi)有找到。相反,倒是找到了不少分析源代碼的書(shū),比如Linux kernel, Apache source, 等等。
第四個(gè)好處是,修復(fù)、檢查、改進(jìn)代碼、當(dāng)程序出現(xiàn)bug時(shí)或半截接手別人的項(xiàng)目時(shí),需要閱讀源代碼后更改bug或推進(jìn)項(xiàng)目。帶著目的閱讀代碼
第五個(gè)好處是,閱讀的源代碼多了,發(fā)現(xiàn)了解開(kāi)源軟件的運(yùn)行機(jī)理,提取可重用的材料加以利用。他山之石,可以攻玉,閱讀源代碼進(jìn)而從現(xiàn)有的優(yōu)秀代碼、算法、設(shè)計(jì)、架構(gòu)中汲取營(yíng)養(yǎng),提高自身的開(kāi)發(fā)與設(shè)計(jì)能力。

STL標(biāo)準(zhǔn)庫(kù)頭文件在VC目錄下的.../include文件夾中可以看到。
OOP和GP
OOP:試圖將數(shù)據(jù)和操作封裝在一起。

GP:試圖將數(shù)據(jù)和操作分開(kāi)。算法和容器通過(guò)迭代器聯(lián)系起來(lái)。

標(biāo)準(zhǔn)庫(kù)的::sort()算法不同用于list容器的排序。::sort()需要容器有連續(xù)的內(nèi)存。

最后編輯于
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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