c++基礎(STL入門)_第1頁
c++基礎(STL入門)_第2頁
c++基礎(STL入門)_第3頁
c++基礎(STL入門)_第4頁
c++基礎(STL入門)_第5頁
已閱讀5頁,還剩78頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、講師:尹成QQ:77025077博客:http:/ 傳智播客傳智播客http:/高薪就業(yè)高薪就業(yè)STL入門導入STL的概念與組成Iterator(迭代器) Container(容器)Algorithm(算法)Adaptors(配接器)導入抽象的重要性 計算機科學的重要進步,許多是由于發(fā)掘了新的抽象性質而促成的 面向過程基于對象面向對象泛型導入面向過程(Procedure-Oriented)的抽象 抽象出Procedure(Function)的概念,把程序分成若干個子過程。將事物的方法隱藏于各個函數(shù)內C語言。 適用于處理小型的程序。對大型程序, 子程序之間關系復雜,不易處理變化的需求引發(fā)軟件危機

2、的原因需要新的抽象。耦合度變化總是存在的導入面向過程示例調用子過程時不用考慮其實現(xiàn)細節(jié)。導入基于對象(Object-Based)的抽象 引入抽象數(shù)據類型(ADT,Abstract Data Type)。C+的類,將事物的屬性與方法緊密地結合在一起VB、帶類的C。 與面向過程相比,可以更好地處理變化,一定程度上化解了軟件危機。但各個類之間的關系不容易處理,而且程序代碼數(shù)量比面向過程時更大需要新的抽象。導入示例Person是一個抽象數(shù)據類型強內聚,低耦合。導入面向對象(Object-Oriented)的抽象 抽象出封裝、繼承、多態(tài)( polymorphic )的概念。 與基于對象相比,有更多的間接

3、性。運用多態(tài),我們可以調用某種方法,而不用指定此方法所屬的類型。因而達到更進一步的抽象性。 它為我們帶來了什么?MFC(用面向對象技術封裝WindowsAPI,抽象出一個類體系)導入示例對用戶封裝了具體的類型,用戶只需和抽象類打交道MFC類體系圖物體類窗口類視圖類邊框類Application Framework導入泛型(Generic)的概念 Generic是一種抽象 就如 OO是一種抽象。 還沒有語法與之相對應正在開發(fā)中。(Function、Class、D : public B) 它為我們帶來了什么?STL。STL的概念何為STL? STL(Standard Template Library

4、)是C標準庫的一部分(80%),是用C Template機制來表達泛型的庫。 STL(Standard Template Library)是用泛型技術來設計完成的實例 就如 MFC(Microsoft Foundational Classes)是用面向對象技術來設計完成的實例STL的概念STL抽象的是什么?有些算法并不依賴于數(shù)據結構的特定實現(xiàn),而只是依賴于該結構的幾個基本的語義屬性. STL抽象出這些基本屬性(Concept),成功的將算法與數(shù)據結構分離,在沒有效率損失的前提下,得到了及大的彈性。STL的概念示例用一個泛型算法可以處理多種數(shù)據結構。而且在獲得彈性彈性的同時運行效率效率上和以前相

5、比沒有損失。STL的組成六大組件 容器(Container) 算法(Algorithm) 迭代器(Iterator) 仿函數(shù)(Function object) 適配器(Adaptor) 空間配制器(allocator)STL的六大組件全都是抽象抽象出來的ConceptsSTL的組成STL在哪里? 后綴名? Namespacestd定義并初始化一個list容器對區(qū)間內每個元素調用傳入的操作pfiCopy是一個泛型算法,它將文件中的內容顯示到屏幕上相關資料STL之父訪談錄 詳細介紹了STL的歷史,點明了STL的設計宗旨以及它與OO的關系。復習C+ Template機制。習題: STL exampl

6、e1、STL example2新的語言特性Namespace(名字空間) Template的新特性 新的類型轉換運算符命名空間(Namespace)現(xiàn)在的軟件多以程序庫、模塊、組件拼湊而成,名稱沖突問題越來越嚴重。Namespace就是用來解決此問題的。Namespace將不同的標識符號集合在一個具體的名稱范圍內。命名空間(Namespace)Namespace的名字和標識符號間以 : :分隔 (類似于Class 與 members之間)命名空間(Namespace)與類不同的是,Namespace是開放的??梢栽诓煌K之間定義和擴展namespace。因此可以用namespace來定義模塊

7、、程序庫或組件。命名空間(Namespace)using declaration,我們可以避免一再寫出冗長的namespace名稱using directive這就是一個using declaration,它使I成為當前范圍內代表Renwind:I的同義詞。這就是一個using directive,它使Renwind內的所有名字曝光。命名空間(Namespace)using directive會再度引發(fā)名稱沖突調用哪一個 i 呢?這種寫法只適用于寫示例程序或相對小的程序Template的新特性類模板顯示特化(class template explicit specialization )Tem

8、plate的新特性類模板偏特化(class template partial specialization)Template的新特性默認模板參數(shù)根據前一個模板參數(shù)T,設定下一個模板參數(shù)Template的新特性成員模板(member template)模板類的成員函數(shù)可以是一個模板Template的新特性關鍵字typename 做為類型前的標識符號。指出SubType是T中定義的一個類型,因此ptr是一個指向T:SubType的指針。如果不加typename,表達式被認為是T中的靜態(tài)成員SubType和ptr的乘積。Template的新特性關鍵字 typename C的一般規(guī)則是,除了以type

9、name修飾以外,template內的任何標識符號都被視為一個值(value),而非一個類型(type)。 typename的第二個作用:在模板聲明中替換關鍵字class。新的類型轉換運算符static_cast 只有當類型轉換有所定義,整個轉換才會成功。由float轉換到int有所定義由char*轉換到string有所定義新的類型轉換運算符dynamic_cast 將多態(tài)類型向下轉型(downcast)為其實際類型多態(tài)類型運行期進行檢驗新的類型轉換運算符const_cast、reinterpret_castC語言中的轉型(用小圓括號)可替換替換dynamic_cast之外的其它三種類型。也因

10、此無法明確顯示使用它的確切理由。新的轉型操作符給了編譯器更多信息,讓編譯器清楚知道轉型的理由。Container(容器)容器的概念 用來管理一組元素。Container(容器)容器的分類 序列式容器(Sequence containers)每個元素都有固定位置取決于插入時機和地點,和元素值無關。vector、deque、list 關聯(lián)式容器(Associated containers)元素位置取決于特定的排序準則,和插入順序無關set、multiset、map、multimap序列式容器Vectors 將元素置于一個動態(tài)數(shù)組中加以管理。 可以隨機存取元素(用索引直接存?。?。 數(shù)組尾部添加或移除

11、元素非??焖?。但是在中部或頭部安插元素比較費時。序列式容器Vectors示例用vector前,必須包含頭文件序列式容器Deques deque,是“double-ended queue”的縮寫。 可以隨機存取元素(用索引直接存?。?數(shù)組頭部和尾部添加或移除元素都非??焖?。但是在中部或頭部安插元素比較費時。序列式容器Deques示例用deque前,必須包含頭文件序列式容器Lists 雙向鏈表。 不提供隨機存?。ò错樞蜃叩叫璐嫒〉脑?,O(n))。 在任何位置上執(zhí)行插入或刪除動作都非常迅速,內部只需調整一下指針。序列式容器Lists示例用list前,必須包含頭文件迭代器(Iterator)簡述指

12、針與數(shù)組指針與其它數(shù)據結構呢?比如說鏈表? 存儲空間是非連續(xù)的。不能通過對指向這種數(shù)據結構的指針做累加來遍歷。 能不能提供一個行為類似指針的類,來對非數(shù)組的數(shù)據結構進行遍歷呢?這樣我們就能夠以同樣的方式來遍歷所有的數(shù)據結構(所有容器)。用指針遍歷數(shù)組迭代器(Iterator)簡述迭代器與容器 通過迭代器,我們可以用相同的方式來訪問、遍歷容器。每種容器都必須提供自己的迭代器容器提供一些函數(shù)以獲得迭代器并以之遍歷所有元素。用迭代器遍歷容器泛型抽象迭代器(Iterator)簡述迭代器的概念 迭代器是一個“可遍歷STL容器內全部或部分元素”的對象。 一個迭代器指出容器中的一個特定位置。 具有遍歷復雜數(shù)

13、據結構的能力。迭代器(Iterator)簡述迭代器的基本操作用法和指針一樣,其實指針就是一種迭代器運算符重載迭代器(Iterator)簡述迭代器示例關聯(lián)式容器Sets/Multisets 內部的元素依據其值自動排序 Set內的相同數(shù)值的元素只能出現(xiàn)一次,Multisets內可包含多個數(shù)值相同的元素。 內部由二叉樹實現(xiàn),便于查找。關聯(lián)式容器Sets/Multisets用set/multiset前,必須包含頭文件不能用push_back因為是自動排序的。關聯(lián)式容器Maps/Multimaps Map的元素是成對成對的鍵值/實值,內部的元素依據其值自動排序。 Map內的相同數(shù)值的元素只能出現(xiàn)一次,M

14、ultimaps內可包含多個數(shù)值相同的元素。 內部由二叉樹實現(xiàn),便于查找。關聯(lián)式容器Maps/Multimaps用map/multimap前,必須包含頭文件便捷函數(shù),返回一個pair對象容器的共通能力所有容器提供的都是value語意,而非reference語意。容器執(zhí)行插入元素的操作時,內部實施拷貝動作。所以STL容器內存儲的元素必須能夠被拷貝(必須提供拷貝構造函數(shù))。每個容器都提供可返回迭代器的函數(shù),運用返回的迭代器就可以訪問元素。通常STL不會丟出異常。要求使用運行者對確保傳入正確的參數(shù)。容器的共通操作初始化每個容器都提供了一個默認構造函數(shù),一個拷貝構造函數(shù)以某個數(shù)組的元素為初值完成初始化

15、。以某個容器的元素為初值完成初始化。容器的共通操作與大小相關的操作函數(shù)返回迭代器的函數(shù)容器的共通操作比較操作Vector容器詳解大?。⊿ize)和容量(Capacity) capacity(),傳回vector能夠容納的元素個數(shù)。 size(),傳回vector內現(xiàn)有元素的個數(shù)。如果capacity不夠用,則重新分配內存 使和vector相關聯(lián)的pointer,reference,iterator全部失效。 很費時間。Vector容器詳解賦值操作元素存取Vector容器詳解插入和刪除操作各個容器的使用時機Iterator(迭代器)迭代器的作用 能夠讓迭代器與算法不干擾的相互發(fā)展,最后又能無間隙

16、的粘合起來。 重載了,!,運算符。用以操作復雜的數(shù)據結構。 容器提供迭代器,算法使用迭代器。Iterator(迭代器)一個簡單的例子容器提供提供迭代器算法使用使用迭代器Iterator(迭代器)迭代器的分類 不同容器提供自己的迭代器,所以不同迭代器具有不同的能力。 不同的算法需要不同的迭代器的能力;相同的算法需要根據迭代器的能力不同而做相應的優(yōu)化。Vector的內部是數(shù)組List的內部是雙向鏈表因此List提供了自己的sort成員函數(shù)Iterator(迭代器)迭代器的分類read only不能改變iterator所指對象write only單向迭代器,iter+雙向迭代器,iter+、iter

17、-所有指針的運算能力,p+n, p-n, pn, p1-p2, p1p2Iterator(迭代器)一個例子advance()Iterator(迭代器)迭代器的相關類型 有些算法內部需要用到迭代器所代表元素的類型,這個就是迭代器的相關類型。迭代器的traits編程技法用來擴充容器與算法。Iterator adaptor(迭代器配接器)概念 提供和iterator相同的接口,但是改變內部的實現(xiàn)方法。分類 Insert iterator Stream iterator Reverse iterator接口還是迭代器的接口,前綴描述了迭代器的內部實現(xiàn)Iterator adaptor(迭代器配接器)In

18、sert(安插型)iterator設計模式 盡管Alexander所指的是城市和建筑模式,但他的思想也同樣適用于面向對象設計模式。只是在面向對象的解決方案里,我們用對象和接口代替了墻壁和門窗。兩者的核心都在于提供了相關問題的解決方案。Gang of Four,設計模式Iterator與adaptor是設計模式中的兩種。設計模式管理模式Don S. Olson, Carol L. Stimmel, The Manager Pool分析模式Martin Fowler, Analysis Patterns設計模式實現(xiàn)模式Scott Meyers, Effective C+重構模式Martin Fowler, Refactoring設計模式我們需要這樣一種語言:它讓我們高效地交流、討論那些常見的、重復出現(xiàn)的設計概念,并在這些概念上建立起我們的系統(tǒng)。不要僅僅把模式當作解決方案,而要把它們當作設計的詞匯,這些詞匯可以根據一定的規(guī)則組合起來形成句子(也就是系統(tǒng)設計)。Brandon Goldfedder,模式之樂Iterator模式定義:提供一種方法,使用按順序訪問某個容器所含的各個元素,而無需曝露該容器的內部表述方法。Adaptor模式定義:將一個類的界面轉換為另一個類的界面,使原本因界面不相容而不能合作的classes,可以一起運作

溫馨提示

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

評論

0/150

提交評論