C+標準模板庫學習精要,你值得收藏!
C++標準模板庫(STL)學習精要,看此文再配合參考手冊輕鬆成高手!
總第006篇
這一篇主要對C++中使用最廣泛的STL進行學習梳理,參照此文再配合STL參考手冊,輕鬆掌握編程精要!
1
STL基本頭文件
STL主要包含容器、演算法和迭代器三個部分。容器實現了大多數數據結構;迭代器類似指針,通過它的有序移動將容器中的元素與演算法關聯起來,是實現STL的基礎。常用的STL包含頭文件如下:
STL包含文件均不含擴展名,其源文件位置一般是在編譯器VC安裝目錄的include內。
2
模板
模板分為函數模板和類模板。函數模板與預處理的用法類似,提供編譯過程中的文本替換功能,對類型有一定的保護;類模板可以編寫通用的、類型安全的類。
STL的思想就是內存的動態分配、銷毀、再分配,將內存管理部分進一步抽象,編成系統代碼,應用過程中用戶可不必明白內存的變化,不必自己編寫代碼來管理內存。
STL標準模板庫強調軟體的復用。Traits技術是採用的重要手段,它提取不同類的共性,以便能統一處理,它依賴將顯式模板特殊化將不同的部分用統一介面來包裝。STL中有大量的模板函數,故很多時候要重載與之對應的操作符。函數模板相當於應用框架,操作符重載相當於調用介面。
3
迭代器
迭代器是STL重要的核心技術,提供了統一訪問容器元素的方法。迭代器即指針,可以是所需的任何類型,它是最大好處是使容器與演算法分離。因為不同容器中完成相同功能代碼的思路大體相同,將其抽象出來就產生了迭代器,這是泛型編程的思想。
在自己動手編寫迭代器時,要在類中增加begin()、end()函數,用於獲取起止迭代指針,要增加相應迭代器類,重載相關運算符,從而可以調用。
特定容器有特定的迭代器,故將迭代器作為內部類更適合應用。每個容器均有對應的迭代器,容器通過迭代器共享某一具體演算法,而演算法不具體依賴某一具體容器。由此可見,STL的編程思想是:1.形成容器元素;2.取出所需的迭代指針;3.調用通用演算法。STL迭代器共分五大類型:
從以上可以看出,從前到後迭代器是一步步細化的,編程時根據實際情況選擇適宜的迭代器,從而達到最高的效率。
4
輸入輸出流
標準輸入流cin指鍵盤,標準輸出流cout指顯示器。運算符」」用作提取符,表明「賦值給」。cin輸入時,各數值間默認以空格為分界符的。
在交互過程中,一般要一次輸入一行字元,為彌補cin的缺陷,可以改用get系統函數。get和getline函數的區別在於,get遇停止符時,不從輸入流中提取界定符,而直接在末尾加」 」標誌,getline則從輸入流中提取界定符,但不會將其放入結果緩衝區。
處理流錯誤:
C++對每次輸入輸出操作的結果都記錄了其狀態信息,主要函數如下:
文件輸入輸出流:
C++中文件讀寫用到的很多常數都在基類ios被定義出來,ifstream類只用於讀取文件數據,ofstream類只用於寫入數據到文件,fstream類則可以用於讀取和寫入文件數據。
字元串輸入輸出流:
字元串輸入輸出流類是直接對內存而不是對文件或標準輸出進行的操作。它使用cin、cout相同的格式函數來操作內存中的數據。全部的字元串流類聲明都包含在標準頭文件中,標準庫定義了三種串流:
利用字元串輸入輸出流,可以方便地將多種基本數據類型組合成字元串,也可以反解字元串。
5
函數對象
將函數作為對象是程序設計的新的思維,STL通過重載類中operator函數實現函數對象的功能。標準C++庫根據operator()參數個數為0,1,2劃分,有如下幾種函數對象:
a.發生器:沒有參數且返回任意類型值的函數對象,如隨機函數發生器;
b.一元函數:只有一個任意類型的參數,返回一個可能不同類型的函數對象;
c.二元函數:兩個任意類型參數,且返回一個任意類型的函數對象;
d.一元判定函數:返回bool類型的一元函數;
e.二元判定函數:返回bool類型的二元函數;
6
通用容器
STL提供了專家級的各種容器,功能更好,復用性更強,在應用程序開發過程中儘可能應用STL。
容器可以分為以下三類:
a.序列性容器:按線性序列來存儲某類型值的集合,每個元素都有自己特定的位置,順序容器主要有vector、deque、list;
b.關聯式容器:它更注重快速高效的檢索數據的能力,根據鍵值key來檢索數據。容器中成員在初始化後都是按一定順序排好的,關聯式容器主要有set、multiset、map、multimap;
c.容器適配器:對已有容器進行某些特性的再封裝,它不是一個新容器,主要有stack、queue;
各容器的共性和區別:
各容器一般來說都有下列函數:默認構造函數、複製構造函數、析構函數、empty()、max_size()、size()、operator=、operator=、operator==、operator!=、swap()。
順序容器和關聯容器都共有下列函數:
a.vector容器是動態數組,在堆中分配內存,元素連續存放,有保留內存。若減少大小後內存也不會釋放,當元素個數大於當前容量時,會分配原來2倍容量,從而將元素複製到新空間,原空間釋放。可以快速隨機訪問元素,快速在末尾插入刪除元素,此過程中不用移動內存;對中間元素插入刪除時要移動內存。若元素是結構體類型或類,移動內存時還要進行構造和析構操作。vector可以使用[]操作符。
b.deque是雙端隊列,可以快速地隨機訪問元素,快速地在開始和末尾插入刪除元素。隨機插入比兩端插入要慢,重新分配內存比vector要快。重新分配空間後,原空間保持,只是新建立了一個內存塊,將新數據插入這個內存塊,沒有空間的複製刪除過程,故deque是由多個分段連續的內存空間組成。因此,deque在某一位置上的操作是線性的,各小片內存間用鏈表相連,還是可以使用[],只是沒有vector快。對deque排序,可以將其複製到vector中排完序後再複製回去。
c.list是一種雙線性列表,只能順序訪問,不支持隨機訪問。對每個元素分配空間,不存在空間不夠和重新分配的情況。
d.set是集合,支持快速查找,不允許有重複值,用平衡樹結構來存儲;multiset支持快速查找,允許有重複值。
e.map是映射,一對一映射,支持關鍵字快速查找,不允許有重複值;multimap是一對多映射,基於關鍵字查找,允許有重複值。
本篇到此結束!!!
原創文章,轉載請註明出處!
商務合作、贊助請聯繫作者!


TAG:最總結 |