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)中沒有出現(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 哈街,以模板類的方法提供。為了訪問容器中的數(shù)據(jù)如庭,可以使用由容器類輸出的迭代器叹卷;
迭代器(Iterator),提供了訪問容器中對(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烘绽,沒有什么特別的地方
迭代適配器(Adaptor)
空間配制器(allocator)其中主要工作包括兩部分1.對(duì)象的創(chuàng)建與銷毀 2.內(nèi)存的獲取與釋放。
2.1 部件之間的關(guān)系
三俐填、整個(gè)課程目錄:
第二課:體系結(jié)構(gòu)與內(nèi)核分析
每天一句:源碼之前安接,了無(wú)密碼。
閱讀源碼的好處:(轉(zhuǎn))
很多作家成名之前都閱讀過大量的優(yōu)秀文學(xué)作品英融,經(jīng)過長(zhǎng)期的閱讀和寫作積累盏檐,慢慢的才有可能寫出一些好的、甚至是優(yōu)秀的文學(xué)作品矢赁。 而程序員與此類似糯笙,很多程序員也需要閱讀大量的優(yōu)秀程序或產(chǎn)品,經(jīng)過不斷閱讀和實(shí)踐積累撩银,然后可能寫出好的程序或產(chǎn)品给涕。養(yǎng)成閱讀高品質(zhì)代碼的習(xí)慣 可以提高編寫代碼的能力。
第一個(gè)好處是可以學(xué)習(xí)到很多編程的方法额获,看好的源代碼够庙,對(duì)于提高自己的編程水平,比自己寫源代碼的幫助更大抄邀。當(dāng)然不是說不用自己寫耘眨,而是說,自己寫代碼的同時(shí)境肾,可以從別人寫的好的源代碼中間學(xué)習(xí)到更多的編程方法和技巧剔难。
第二個(gè)好處是,可以提高自己把握大規(guī)模源代碼的能力奥喻。一個(gè)比較大型的程序偶宫,往往都是經(jīng)過了很多個(gè)版本很長(zhǎng)的時(shí)間,有很多人參與開發(fā)环鲤,修正錯(cuò)誤纯趋,添加功能而發(fā)展起來(lái)的。所以往往源代碼的規(guī)模都比較大,少則10-100多k, 多的有好幾十個(gè)MB. 在閱讀大量源代碼的時(shí)候吵冒,能夠提高自己對(duì)大的軟件的把握能力纯命,快速了解脈絡(luò),熟悉細(xì)節(jié)痹栖,不僅僅是編程技巧亿汞,還能在程序的架構(gòu),設(shè)計(jì)方面提高自己的能力结耀。(這里說一句題外話留夜,<<設(shè)計(jì)模式>>這本書相信很多人都看過,而且很多人對(duì)它推崇備至图甜,奉為經(jīng)典。現(xiàn)在也出了不少書鳖眼,都是冠以"設(shè)計(jì)模式"這一名稱黑毅。在書中就提到,設(shè)計(jì)模式并不是一本教材钦讳,不是教你如何去編程序矿瘦,而是把平時(shí)編程中一些固定的模式記錄下來(lái),加以不斷的測(cè)試和改進(jìn)愿卒,分發(fā)給廣大程序員的一些經(jīng)驗(yàn)之談缚去。我在看這本書的時(shí)候,有一些地方一些設(shè)計(jì)方法往往讓我有似曾相識(shí)的感覺琼开,另外一些則是我以前就常常用到的易结。而這些經(jīng)驗(yàn)的獲得,一部分得益于自己的編碼過程柜候,另外一個(gè)很重要的來(lái)源就是閱讀別人寫的源代碼搞动。)
閱讀源代碼第三個(gè)好處,就是獲得一些好的思想渣刷。比如鹦肿,有很多人在開始一個(gè)軟件項(xiàng)目之前都喜歡到sourceforge.net上去找一下,是否有人以前做過相同或者相似的軟件辅柴,如果有箩溃,則拿下來(lái)讀一讀,可以使自己對(duì)這個(gè)軟件項(xiàng)目有更多更深的認(rèn)識(shí)碌嘀。我以前曾經(jīng)想找一本關(guān)于如何閱讀源代碼的書來(lái)看看涣旨,卻沒有找到。相反筏餐,倒是找到了不少分析源代碼的書开泽,比如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)了解開源軟件的運(yùn)行機(jī)理,提取可重用的材料加以利用崇摄。他山之石,可以攻玉,閱讀源代碼進(jìn)而從現(xiàn)有的優(yōu)秀代碼矫付、算法、設(shè)計(jì)第焰、架構(gòu)中汲取營(yíng)養(yǎng)买优,提高自身的開發(fā)與設(shè)計(jì)能力。
STL標(biāo)準(zhǔn)庫(kù)頭文件在VC目錄下的.../include文件夾中可以看到挺举。
OOP和GP
OOP:試圖將數(shù)據(jù)和操作封裝在一起杀赢。
GP:試圖將數(shù)據(jù)和操作分開。算法和容器通過迭代器聯(lián)系起來(lái)湘纵。
標(biāo)準(zhǔn)庫(kù)的::sort()算法不同用于list容器的排序脂崔。::sort()需要容器有連續(xù)的內(nèi)存。