STL 標準模板庫的組成
STL 提供六大組件,彼此可以組合套用:
-
容器(containers):各種數據結構,如vector,list,deque,set,map,用來存放數據,從實現的角度來看,STL容器是一種class template,就體積而言,這一部分很像冰山在海角下的比率。
-
算法(algorithms):各種常用算法如:sort,search,copy,erase…。從實現的角度來看,STL算法是一種function template。
-
迭代器(iterators):扮演容器與算法之間的膠合劑,是所謂的“泛型指針“。共有五種類型,以及其他衍生變化。從實現的角度來看,迭代器是一種將operator*,operator->,operator++,operator–等指針相關操作予以重載的class template。所以STL容器都附帶有自己專屬的迭代器——是的,只有容器設計者才知道如何遍歷自己的元素,原生指針(native pointer)也是一種迭代器。
-
仿函數(functors):行爲類似函數,可作爲算法的某種策略(policy),從實現的角度來看,仿函數是一種重載了operateor[]的class或class template。一般函數指針可視爲狹義的仿函數。
-
配接器(adapters):一種用來修飾容器(containers)或仿函數(functors)或迭代器(iterators)接口的東西。例如,STL提供的queue和stack,雖然看似容器,其實只能算是一種容器配接器。因爲它們的底部完全藉助deque,所有操作都由底層的deque供應,改變functor接口者,稱爲function adapter;改變container接口者,稱爲container adapter;改變iterator 接口者,稱爲iterator adapter。
-
配置器(allocators):負責空間配置與管理。從實現的角度來看,配置器是一個實現了動態空間配置、空間管理、空間釋放的class template。
這六大組件的交互關係:container(容器) 通過 allocator(配置器) 取得數據儲存空間,algorithm(算法)通過 iterator(迭代器)存取 container(容器) 內容,functor(仿函數) 可以協助 algorithm(算法) 完成不同的策略變化,adapter(配接器) 可以修飾或套接 functor(仿函數)。
C++ 標準庫的組成
C++標準庫的內容總共在50個 標準頭文件中定義,其中18個 提供了C庫的功能,所有頭文件都沒有擴展名. 分爲10 類:C1.語言支持 C2.輸入/輸出 C3.診斷 C4.一般工具 C5.字符串 C6.容器 C7.迭代器支持 C8.算法 C9.數值操作 C10.本地化
- 語言支持
庫文件 |
描述 |
<cstddef> |
定義宏NULL和offsetof以及其它標準類型size_t和ptrdiff_t. 與對應的標準C頭文件的區別是,NULL是C++空指針常量的補充定義(C++11中已有關鍵字nullptr),宏offsetof接受結構或者聯合類型參數,只要沒有成員指針類型的非靜態成員即可. |
<limits> |
提供與基本數據類型相關的定義. 例如,對於每個數值數據類型,它定義了可以表示出來的最大值和最小值以及二進制數字的位數. |
<climits> |
提供與基本整數數據類型相關的C樣式定義,C++樣式定義在<limits>中. |
<cfloat> |
提供與基本浮點型數據類型相關的C樣式定義,C++樣式定義在<limits>中. |
<cstdlib> |
提供支持程序啓動和終止的宏和函數,還聲明瞭許多其他雜項函數,例如搜索和排序函數,從字符串轉換爲數值等函數. <cstdlib>與對應的標準C頭文件stdlib.h不同,定義了abort(void). abort()函數還有額外的功能,它不爲靜態或自動對象調用析構函數,也不調用傳給atexit()函數的函數. 它還定義了exit()函數的額外功能,可以釋放靜態對象,以註冊的逆序調用用atexit()註冊的函數. 清除並關閉所有打開的C流,把控制權返回給主機環境. |
<new> |
支持動態內存分配. |
<typeinfo> |
支持變量在運行期間的類型標識. |
<exception> |
支持異常處理,是處理程序中可能發生的錯誤的一種方式. |
<cstdarg> |
支持接受數量可變的參數的函數. 即在調用函數時,可以給函數傳送數量不等的數據項. 定義了宏va_arg、va_end、va_start以及va_list類型. |
<csetjmp> |
爲C樣式的非本地跳躍提供函數,在C++中不常用. |
<csignal> |
爲中斷處理提供C樣式支持. |
- 流輸入/輸出
庫文件 |
描述 |
<iostream> |
支持標準流cin、cout、cerr和clog的輸入和輸出,還支持多字節字符標準流wcin、wcout、wcerr和wclog. |
<iomanip> |
提供操縱程序,允許改變流的狀態,從而改變輸出的格式. |
<ios> |
定義iostream的基類. |
<istream> |
爲管理輸出流緩存區的輸入定義模板類. |
<ostream> |
爲管理輸出流緩存區的輸出定義模板類. |
<sstream> |
支持字符串的流輸入輸出. |
<fstream> |
支持文件的流輸入輸出. |
<iosfwd> |
爲輸入輸出對象提供向前的聲明. |
<streambuf> |
支持流輸入和輸出的緩存. |
<cstdio> |
爲標準流提供C樣式的輸入和輸出. |
<cwchar> |
支持多字節字符的C樣式輸入輸出. |
- 診斷功能
庫文件 |
描述 |
<stdexcept> |
定義標準異常 |
<cassert> |
定義斷言宏,用於運行時檢查 |
<cerrno> |
支持C樣式的錯誤信息 |
- 工具函數
庫文件 |
描述 |
<utility> |
定義重載的關係運算符,簡化關係運算符的寫入,還定義了pair類型,pair類型是一種模板類型,可以存儲一對值 |
<functional> |
定義了許多函數對象類型和支持函數對象的功能,函數對象是支持operator()()函數調用運算符的任意對象 |
<memory> |
給容器、管理內存的函數和auto_ptr模板類定義標準內存分配器 |
<ctime> |
支持系統時鐘函數 |
- 字符串處理
庫文件 |
描述 |
<string> |
爲字符串類型提供支持和定義,包括單字節字符串(由char組成)的string和多字節字符串(由wchar_t組成) |
<cctype> |
單字節字符類別 |
<cwctype> |
多字節字符類別 |
<cstring> |
爲處理非空字節序列和內存塊提供函數。不同於對應的標準C庫頭文件,C樣式字符串的一般C庫函數被返回值爲const和非const的函數對替代 |
<cwchar> |
爲處理、執行I/O和轉換多字節字符序列提供函數,不同於對應的標準C庫頭文件,幾個多字節C樣式字符串操作的一般C庫函數被返回值爲const和非const的函數對替代 |
<cstdlib> |
爲把單字節字符串轉換爲數值、在多字節字符和多字節字符串之間轉換提供函數 |
- 容器類模板
庫文件 |
描述 |
<vector> |
定義vector序列模板,是一個大小可以重新設置的數組類型,比普通數組更安全、更靈活 |
<list> |
定義list序列模板,是一個序列的鏈表,常常在任意位置插入和刪除元素 |
<deque> |
定義deque序列模板,支持在開始和結尾的高效插入和刪除操作 |
<queue> |
爲隊列(先進先出)數據結構定義序列適配器queue和priority_queue |
<stack> |
爲堆棧(後進先出)數據結構定義序列適配器stack |
<map> |
map是一個關聯容器類型,允許根據鍵值是唯一的,且按照升序存儲。multimap類似於map,但鍵不是唯一的 |
<set> |
set是一個關聯容器類型,用於以升序方式存儲唯一值。multiset類似於set,但是值不必是唯一的 |
<bitset> |
爲固定長度的位序列定義bitset模板,它可以看作固定長度的緊湊型bool數組 |
<array> |
(TR1)固定大小數組,支持複製 |
<forward_list> |
(c++11)單向列表,支持快速隨機訪問 |
<unordered_set> |
(TR1)無序容器set,其元素隨機存放。multiset類似於set,但是值不必是唯一的 |
<unordered_map> |
(TR1)無序容器map,其鍵值隨機存放。multimap類似於map,但鍵不是唯一的 |
- 迭代器
庫文件 |
描述 |
<iterator> |
給迭代器提供定義和支持 |
- 算法
庫文件 |
描述 |
<algorithm> |
提供一組基於算法的函數,包括置換、排序、合併和搜索 |
<cstdlib> |
聲明C標準庫函數bsearch()和qsort(),進行搜索和排序 |
<ciso646> |
允許在代碼中使用and代替&& |
- 數值操作
庫文件 |
描述 |
<complex> |
支持複雜數值的定義和操作 |
<valarray> |
支持數值矢量的操作 |
<numeric> |
在數值序列上定義一組一般數學操作,例如accumulate和inner_product |
<cmath> |
這是C數學庫,其中還附加了重載函數,以支持C++約定 |
<cstdlib> |
提供的函數可以提取整數的絕對值,對整數進行取餘數操作 |
- 本地化
庫文件 |
描述 |
<locale> |
提供的本地化包括字符類別、排序序列以及貨幣和日期表示 |
<clocale> |
對本地化提供C樣式支持 |