c++基礎(chǔ)(STL入門)課件_第1頁
c++基礎(chǔ)(STL入門)課件_第2頁
c++基礎(chǔ)(STL入門)課件_第3頁
c++基礎(chǔ)(STL入門)課件_第4頁
c++基礎(chǔ)(STL入門)課件_第5頁
已閱讀5頁,還剩79頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

傳智播客cpp語言入門教程(12)QQ:77025077博客::Mail:yinc13@.cn網(wǎng)址:C語言C++語言傳智播客c++基礎(chǔ)(STL入門)STL入門導(dǎo)入STL的概念與組成Iterator(迭代器)Container(容器)Algorithm(算法)Adaptors(配接器)c++基礎(chǔ)(STL入門)導(dǎo)入抽象的重要性計(jì)算機(jī)科學(xué)的重要進(jìn)步,許多是由于發(fā)掘了新的抽象性質(zhì)而促成的面向過程->基于對(duì)象->面向?qū)ο螅痉盒?/p>

c++基礎(chǔ)(STL入門)導(dǎo)入面向過程(Procedure-Oriented)的抽象抽象出Procedure(Function)的概念,把程序分成若干個(gè)子過程。將事物的方法隱藏于各個(gè)函數(shù)內(nèi)--C語言。適用于處理小型的程序。對(duì)大型程序,子程序之間關(guān)系復(fù)雜,不易處理變化的需求--引發(fā)軟件危機(jī)的原因--需要新的抽象。耦合度變化總是存在的c++基礎(chǔ)(STL入門)導(dǎo)入面向過程示例調(diào)用子過程時(shí)不用考慮其實(shí)現(xiàn)細(xì)節(jié)。c++基礎(chǔ)(STL入門)導(dǎo)入基于對(duì)象(Object-Based)的抽象引入抽象數(shù)據(jù)類型(ADT,AbstractDataType)。C++的類,將事物的屬性與方法緊密地結(jié)合在一起--VB、帶類的C。與面向過程相比,可以更好地處理變化,一定程度上化解了軟件危機(jī)。但各個(gè)類之間的關(guān)系不容易處理,而且程序代碼數(shù)量比面向過程時(shí)更大--需要新的抽象。c++基礎(chǔ)(STL入門)導(dǎo)入示例Person是一個(gè)抽象數(shù)據(jù)類型強(qiáng)內(nèi)聚,低耦合。c++基礎(chǔ)(STL入門)導(dǎo)入面向?qū)ο?Object-Oriented)的抽象抽象出封裝、繼承、多態(tài)(polymorphic)的概念。與基于對(duì)象相比,有更多的間接性。運(yùn)用多態(tài),我們可以調(diào)用某種方法,而不用指定此方法所屬的類型。因而達(dá)到更進(jìn)一步的抽象性。它為我們帶來了什么?--MFC(用面向?qū)ο蠹夹g(shù)封裝WindowsAPI,抽象出一個(gè)類體系)c++基礎(chǔ)(STL入門)導(dǎo)入示例對(duì)用戶封裝了具體的類型,用戶只需和抽象類打交道c++基礎(chǔ)(STL入門)MFC類體系圖物體類窗口類視圖類邊框類ApplicationFrameworkc++基礎(chǔ)(STL入門)導(dǎo)入泛型(Generic)的概念Generic是一種抽象就如OO是一種抽象。還沒有語法與之相對(duì)應(yīng)--正在開發(fā)中。(Function、Class、D:publicB)它為我們帶來了什么?--STL。c++基礎(chǔ)(STL入門)STL的概念何為STL?STL(StandardTemplateLibrary)是C++標(biāo)準(zhǔn)庫的一部分(80%),是用C++Template機(jī)制來表達(dá)泛型的庫。STL(StandardTemplateLibrary)是用泛型技術(shù)來設(shè)計(jì)完成的實(shí)例就如MFC(MicrosoftFoundationalClasses)是用面向?qū)ο蠹夹g(shù)來設(shè)計(jì)完成的實(shí)例c++基礎(chǔ)(STL入門)STL的概念STL抽象的是什么?有些算法并不依賴于數(shù)據(jù)結(jié)構(gòu)的特定實(shí)現(xiàn),而只是依賴于該結(jié)構(gòu)的幾個(gè)基本的語義屬性.STL抽象出這些基本屬性(Concept),成功的將算法與數(shù)據(jù)結(jié)構(gòu)分離,在沒有效率損失的前提下,得到了及大的彈性。c++基礎(chǔ)(STL入門)STL的概念示例用一個(gè)泛型算法可以處理多種數(shù)據(jù)結(jié)構(gòu)。而且在獲得彈性的同時(shí)運(yùn)行效率上和以前相比沒有損失。c++基礎(chǔ)(STL入門)STL的組成六大組件容器(Container)算法(Algorithm)迭代器(Iterator)仿函數(shù)(Functionobject)適配器(Adaptor)空間配制器(allocator)STL的六大組件全都是抽象出來的Conceptsc++基礎(chǔ)(STL入門)STL的組成STL在哪里?后綴名?Namespacestdc++基礎(chǔ)(STL入門)定義并初始化一個(gè)list容器對(duì)區(qū)間內(nèi)每個(gè)元素調(diào)用傳入的操作pfic++基礎(chǔ)(STL入門)Copy是一個(gè)泛型算法,它將文件中的內(nèi)容顯示到屏幕上c++基礎(chǔ)(STL入門)相關(guān)資料STL之父訪談錄--詳細(xì)介紹了STL的歷史,點(diǎn)明了STL的設(shè)計(jì)宗旨以及它與OO的關(guān)系。復(fù)習(xí)C++Template機(jī)制。習(xí)題:STLexample1、STLexample2c++基礎(chǔ)(STL入門)新的語言特性Namespace(名字空間)Template的新特性新的類型轉(zhuǎn)換運(yùn)算符c++基礎(chǔ)(STL入門)命名空間(Namespace)現(xiàn)在的軟件多以程序庫、模塊、組件拼湊而成,名稱沖突問題越來越嚴(yán)重。Namespace就是用來解決此問題的。Namespace將不同的標(biāo)識(shí)符號(hào)集合在一個(gè)具體的名稱范圍內(nèi)。c++基礎(chǔ)(STL入門)命名空間(Namespace)Namespace的名字和標(biāo)識(shí)符號(hào)間以::分隔(類似于Class與members之間)c++基礎(chǔ)(STL入門)命名空間(Namespace)與類不同的是,Namespace是開放的??梢栽诓煌K之間定義和擴(kuò)展namespace。因此可以用namespace來定義模塊、程序庫或組件。c++基礎(chǔ)(STL入門)命名空間(Namespace)usingdeclaration,我們可以避免一再寫出冗長的namespace名稱usingdirective這就是一個(gè)usingdeclaration,它使I成為當(dāng)前范圍內(nèi)代表Renwind::I的同義詞。這就是一個(gè)usingdirective,它使Renwind內(nèi)的所有名字曝光。c++基礎(chǔ)(STL入門)命名空間(Namespace)usingdirective會(huì)再度引發(fā)名稱沖突調(diào)用哪一個(gè)i呢?這種寫法只適用于寫示例程序或相對(duì)小的程序c++基礎(chǔ)(STL入門)Template的新特性類模板顯示特化(classtemplateexplicit specialization)c++基礎(chǔ)(STL入門)Template的新特性類模板偏特化(classtemplatepartial specialization)c++基礎(chǔ)(STL入門)Template的新特性默認(rèn)模板參數(shù)根據(jù)前一個(gè)模板參數(shù)T,設(shè)定下一個(gè)模板參數(shù)c++基礎(chǔ)(STL入門)Template的新特性成員模板(membertemplate)模板類的成員函數(shù)可以是一個(gè)模板c++基礎(chǔ)(STL入門)Template的新特性關(guān)鍵字typename做為類型前的標(biāo)識(shí)符號(hào)。指出SubType是T中定義的一個(gè)類型,因此ptr是一個(gè)指向T:SubType的指針。如果不加typename,表達(dá)式被認(rèn)為是T中的靜態(tài)成員SubType和ptr的乘積。c++基礎(chǔ)(STL入門)Template的新特性關(guān)鍵字 typenameC++的一般規(guī)則是,除了以typename修飾以外,template內(nèi)的任何標(biāo)識(shí)符號(hào)都被視為一個(gè)值(value),而非一個(gè)類型(type)。typename的第二個(gè)作用:在模板聲明中替換關(guān)鍵字class。c++基礎(chǔ)(STL入門)新的類型轉(zhuǎn)換運(yùn)算符static_cast只有當(dāng)類型轉(zhuǎn)換有所定義,整個(gè)轉(zhuǎn)換才會(huì)成功。由float轉(zhuǎn)換到int有所定義由char*轉(zhuǎn)換到string有所定義c++基礎(chǔ)(STL入門)新的類型轉(zhuǎn)換運(yùn)算符dynamic_cast將多態(tài)類型向下轉(zhuǎn)型(downcast)為其實(shí)際類型多態(tài)類型運(yùn)行期進(jìn)行檢驗(yàn)c++基礎(chǔ)(STL入門)新的類型轉(zhuǎn)換運(yùn)算符const_cast、reinterpret_castC語言中的轉(zhuǎn)型(用小圓括號(hào))可替換dynamic_cast之外的其它三種類型。也因此無法明確顯示使用它的確切理由。新的轉(zhuǎn)型操作符給了編譯器更多信息,讓編譯器清楚知道轉(zhuǎn)型的理由。c++基礎(chǔ)(STL入門)Container(容器)容器的概念用來管理一組元素。c++基礎(chǔ)(STL入門)Container(容器)容器的分類序列式容器(Sequencecontainers)每個(gè)元素都有固定位置--取決于插入時(shí)機(jī)和地點(diǎn),和元素值無關(guān)。vector、deque、list關(guān)聯(lián)式容器(Associatedcontainers)元素位置取決于特定的排序準(zhǔn)則,和插入順序無關(guān)set、multiset、map、multimapc++基礎(chǔ)(STL入門)序列式容器Vectors將元素置于一個(gè)動(dòng)態(tài)數(shù)組中加以管理。可以隨機(jī)存取元素(用索引直接存?。?shù)組尾部添加或移除元素非??焖佟5窃谥胁炕蝾^部安插元素比較費(fèi)時(shí)。c++基礎(chǔ)(STL入門)序列式容器Vectors示例用vector前,必須包含頭文件<vector>

c++基礎(chǔ)(STL入門)序列式容器Dequesdeque,是“double-endedqueue”的縮寫??梢噪S機(jī)存取元素(用索引直接存取)。數(shù)組頭部和尾部添加或移除元素都非常快速。但是在中部或頭部安插元素比較費(fèi)時(shí)。c++基礎(chǔ)(STL入門)序列式容器Deques示例用deque前,必須包含頭文件<deque>

c++基礎(chǔ)(STL入門)序列式容器Lists雙向鏈表。不提供隨機(jī)存取(按順序走到需存取的元素,O(n))。在任何位置上執(zhí)行插入或刪除動(dòng)作都非常迅速,內(nèi)部只需調(diào)整一下指針。c++基礎(chǔ)(STL入門)序列式容器Lists示例用list前,必須包含頭文件<list>

c++基礎(chǔ)(STL入門)迭代器(Iterator)簡述指針與數(shù)組指針與其它數(shù)據(jù)結(jié)構(gòu)呢?比如說鏈表?存儲(chǔ)空間是非連續(xù)的。不能通過對(duì)指向這種數(shù)據(jù)結(jié)構(gòu)的指針做累加來遍歷。能不能提供一個(gè)行為類似指針的類,來對(duì)非數(shù)組的數(shù)據(jù)結(jié)構(gòu)進(jìn)行遍歷呢?這樣我們就能夠以同樣的方式來遍歷所有的數(shù)據(jù)結(jié)構(gòu)(所有容器)。用指針遍歷數(shù)組c++基礎(chǔ)(STL入門)迭代器(Iterator)簡述迭代器與容器通過迭代器,我們可以用相同的方式來訪問、遍歷容器。每種容器都必須提供自己的迭代器容器提供一些函數(shù)以獲得迭代器并以之遍歷所有元素。用迭代器遍歷容器泛型抽象c++基礎(chǔ)(STL入門)迭代器(Iterator)簡述迭代器的概念迭代器是一個(gè)“可遍歷STL容器內(nèi)全部或部分元素”的對(duì)象。一個(gè)迭代器指出容器中的一個(gè)特定位置。具有遍歷復(fù)雜數(shù)據(jù)結(jié)構(gòu)的能力。c++基礎(chǔ)(STL入門)迭代器(Iterator)簡述迭代器的基本操作用法和指針一樣,其實(shí)指針就是一種迭代器運(yùn)算符重載c++基礎(chǔ)(STL入門)迭代器(Iterator)簡述迭代器示例c++基礎(chǔ)(STL入門)關(guān)聯(lián)式容器Sets/Multisets內(nèi)部的元素依據(jù)其值自動(dòng)排序Set內(nèi)的相同數(shù)值的元素只能出現(xiàn)一次,Multisets內(nèi)可包含多個(gè)數(shù)值相同的元素。內(nèi)部由二叉樹實(shí)現(xiàn),便于查找。c++基礎(chǔ)(STL入門)關(guān)聯(lián)式容器Sets/Multisets用set/multiset前,必須包含頭文件<set>

不能用push_back…因?yàn)槭亲詣?dòng)排序的。c++基礎(chǔ)(STL入門)關(guān)聯(lián)式容器Maps/MultimapsMap的元素是成對(duì)的鍵值/實(shí)值,內(nèi)部的元素依據(jù)其值自動(dòng)排序。Map內(nèi)的相同數(shù)值的元素只能出現(xiàn)一次,Multimaps內(nèi)可包含多個(gè)數(shù)值相同的元素。內(nèi)部由二叉樹實(shí)現(xiàn),便于查找。c++基礎(chǔ)(STL入門)關(guān)聯(lián)式容器Maps/Multimaps用map/multimap前,必須包含頭文件<map>

便捷函數(shù),返回一個(gè)pair對(duì)象c++基礎(chǔ)(STL入門)容器的共通能力所有容器提供的都是value語意,而非reference語意。容器執(zhí)行插入元素的操作時(shí),內(nèi)部實(shí)施拷貝動(dòng)作。所以STL容器內(nèi)存儲(chǔ)的元素必須能夠被拷貝(必須提供拷貝構(gòu)造函數(shù))。每個(gè)容器都提供可返回迭代器的函數(shù),運(yùn)用返回的迭代器就可以訪問元素。通常STL不會(huì)丟出異常。要求使用運(yùn)行者對(duì)確保傳入正確的參數(shù)。c++基礎(chǔ)(STL入門)容器的共通操作初始化--每個(gè)容器都提供了一個(gè)默認(rèn)構(gòu)造函數(shù),一個(gè)拷貝構(gòu)造函數(shù)以某個(gè)數(shù)組的元素為初值完成初始化。以某個(gè)容器的元素為初值完成初始化。c++基礎(chǔ)(STL入門)容器的共通操作與大小相關(guān)的操作函數(shù)返回迭代器的函數(shù)c++基礎(chǔ)(STL入門)容器的共通操作比較操作c++基礎(chǔ)(STL入門)Vector容器詳解大?。⊿ize)和容量(Capacity)capacity(),傳回vector能夠容納的元素個(gè)數(shù)。size(),傳回vector內(nèi)現(xiàn)有元素的個(gè)數(shù)。如果capacity不夠用,則重新分配內(nèi)存使和vector相關(guān)聯(lián)的pointer,reference,iterator全部失效。很費(fèi)時(shí)間。c++基礎(chǔ)(STL入門)Vector容器詳解賦值操作元素存取c++基礎(chǔ)(STL入門)Vector容器詳解插入和刪除操作c++基礎(chǔ)(STL入門)各個(gè)容器的使用時(shí)機(jī)c++基礎(chǔ)(STL入門)Iterator(迭代器)迭代器的作用能夠讓迭代器與算法不干擾的相互發(fā)展,最后又能無間隙的粘合起來。重載了*,++,==,?。剑竭\(yùn)算符。用以操作復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。容器提供迭代器,算法使用迭代器。c++基礎(chǔ)(STL入門)Iterator(迭代器)一個(gè)簡單的例子容器提供迭代器算法使用迭代器c++基礎(chǔ)(STL入門)Iterator(迭代器)迭代器的分類不同容器提供自己的迭代器,所以不同迭代器具有不同的能力。不同的算法需要不同的迭代器的能力;相同的算法需要根據(jù)迭代器的能力不同而做相應(yīng)的優(yōu)化。Vector的內(nèi)部是數(shù)組List的內(nèi)部是雙向鏈表因此List提供了自己的sort成員函數(shù)c++基礎(chǔ)(STL入門)Iterator(迭代器)迭代器的分類readonly不能改變iterator所指對(duì)象writeonly單向迭代器,iter++雙向迭代器,iter++、iter--所有指針的運(yùn)算能力,p+n,p-n,p[n],p1-p2,p1<p2c++基礎(chǔ)(STL入門)Iterator(迭代器)一個(gè)例子--advance()c++基礎(chǔ)(STL入門)Iterator(迭代器)迭代器的相關(guān)類型有些算法內(nèi)部需要用到迭代器所代表元素的類型,這個(gè)就是迭代器的相關(guān)類型。迭代器的traits編程技法用來擴(kuò)充容器與算法。c++基礎(chǔ)(STL入門)Iteratoradaptor(迭代器配接器)概念提供和iterator相同的接口,但是改變內(nèi)部的實(shí)現(xiàn)方法。分類InsertiteratorStreamiteratorReverseiterator接口還是迭代器的接口,前綴描述了迭代器的內(nèi)部實(shí)現(xiàn)c++基礎(chǔ)(STL入門)Iteratoradaptor(迭代器配接器)Insert(安插型)iteratorc++基礎(chǔ)(STL入門)設(shè)計(jì)模式盡管Alexander所指的是城市和建筑模式,但他的思想也同樣適用于面向?qū)ο笤O(shè)計(jì)模式。只是在面向?qū)ο蟮慕鉀Q方案里,我們用對(duì)象和接口代替了墻壁和門窗。兩者的核心都在于提供了相關(guān)問題的解決方案?!狦angofFour,《設(shè)計(jì)模式》Iterator與adaptor是設(shè)計(jì)模式中的兩種。c++基礎(chǔ)(STL入門)設(shè)計(jì)模式管理模式——DonS.Olson,CarolL. Stimmel,TheManagerPool分析模式——MartinFowler,Analysis Patterns設(shè)計(jì)模式實(shí)現(xiàn)模式——ScottMeyers,EffectiveC++重構(gòu)模式——MartinFowler,Refactoringc++基礎(chǔ)(STL入門)設(shè)計(jì)模式 我們需要這樣一種語言:它讓我們高效地交流、討論那些常見的、重復(fù)出現(xiàn)的設(shè)計(jì)概念,并在這些概念上建立起我們的系統(tǒng)。 不要僅僅把模式當(dāng)作解決方案,而要把它們當(dāng)作設(shè)計(jì)的詞匯,這些詞匯可以根據(jù)一定的規(guī)則組合起來形成句子(也就是系統(tǒng)設(shè)計(jì))。——BrandonGoldfedder,《模式之樂》c++基礎(chǔ)(STL入門)Iterator模式定義:提供一種方法,使用按順序訪問某個(gè)容器所含的各個(gè)元素,而無需曝露該容器的內(nèi)部表述方法。c++基礎(chǔ)(STL入門)Adaptor模式定義:將一個(gè)類的界面轉(zhuǎn)換為另一個(gè)類的界面,使原本因界面不相容而不能合作的classes,可以一起運(yùn)作。c++基礎(chǔ)(STL入門)Adaptor模式在STL中,改變iterator界面的叫做iteratoradaptor改變container界面的叫做containerad

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論