from:http://blog.csdn.net/sxhelijian/article/details/7552499
一、C++標准庫
C++標准庫的內容分為10類,C++標准庫的內容總共在50個標准頭文件中定義。
C1. 標准庫中與語言支持功能相關的頭文件
頭文件 |
描 述 |
<cstddef> |
定義宏NULL和offsetof,以及其他標准類型size_t和ptrdiff_t。與對應的標准C頭文件的區別是,NULL是C++空指針常量的補充定義, |
<limits> |
提供與基本數據類型相關的定義。例如,對於每個數值數據類型,它定義了可以表示出來的最大值和最小值以及二進制數字的位數。 |
<climits> |
提供與基本整數數據類型相關的C樣式定義。這些信息的C++樣式定義在<limits>中 |
<cfloat> |
提供與基本浮點型數據類型相關的C樣式定義。這些信息的C++樣式定義在<limits>中 |
<cstdlib> |
提供支持程序啟動和終止的宏和函數。這個頭文件還聲明了許多其他雜項函數,例如搜索和排序函數,從字符串轉換為數值等函數。它與對應的標准C頭文件stdlib.h不同, |
<new> |
支持動態內存分配 |
<typeinfo> |
支持變量在運行期間的類型標識 |
<exception> |
支持異常處理,這是處理程序中可能發生的錯誤的一種方式 |
<cstdarg> |
支持接受數量可變的參數的函數。即在調用函數時,可以給函數傳送數量不等的數據項。它定義了宏va_arg、va_end、va_start以及va_list類型 |
<csetjmp> |
為C樣式的非本地跳躍提供函數。這些函數在C++中不常用 |
<csignal> |
為中斷處理提供C樣式支持 |
C2. 支持流輸入/輸出的頭文件
頭文件 |
描 述 |
<iostream> |
支持標准流cin、cout、cerr和clog的輸入和輸出,它還支持多字節字符標准流wcin、wcout、wcerr和wclog。 |
<iomanip> |
提供操縱程序,允許改變流的狀態,從而改變輸出的格式。 |
<ios> |
定義iostream的基類 |
<istream> |
為管理輸出流緩存區的輸入定義模板類 |
<ostream> |
為管理輸出流緩存區的輸出定義模板類 |
<sstream> |
支持字符串的流輸入輸出 |
<fstream> |
支持文件的流輸入輸出 |
<iosfwd> |
為輸入輸出對象提供向前的聲明 |
<streambuf> |
支持流輸入和輸出的緩存 |
<cstdio> |
為標准流提供C樣式的輸入和輸出 |
<cwchar> |
支持多字節字符的C樣式輸入輸出 |
C3. 與診斷功能相關的頭文件
頭文件 |
描 述 |
<stdexcept> |
定義標准異常。異常是處理錯誤的方式 |
<cassert> |
定義斷言宏,用於檢查運行期間的情形 |
<cerrno> |
支持C樣式的錯誤信息 |
C4. 定義工具函數的頭文件
頭文件 |
描 述 |
<utility> |
定義重載的關系運算符,簡化關系運算符的寫入,它還定義了pair類型,該類型是一種模板類型,可以存儲一對值。這些功能在庫的其他地方使用 |
<functional> |
定義了許多函數對象類型和支持函數對象的功能,函數對象是支持operator()()函數調用運算符的任意對象 |
<memory> |
給容器、管理內存的函數和auto_ptr模板類定義標准內存分配器 |
<ctime> |
支持系統時鍾函數 |
C5. 支持字符串處理的頭文件
頭文件 |
描 述 |
<string> |
為字符串類型提供支持和定義,包括單字節字符串(由char組成)的string和多字節字符串(由wchar_t組成) |
<cctype> |
單字節字符類別 |
<cwctype> |
多字節字符類別 |
<cstring> |
為處理非空字節序列和內存塊提供函數。這不同於對應的標准C庫頭文件,幾個C樣式字符串的一般C庫函數被返回值為const和非const的函數對替代了 |
<cwchar> |
為處理、執行I/O和轉換多字節字符序列提供函數,這不同於對應的標准C庫頭文件,幾個多字節C樣式字符串操作的一般C庫函數被返回值為const和非const的函數對替代了。 |
<cstdlib> |
為把單字節字符串轉換為數值、在多字節字符和多字節字符串之間轉換提供函數 |
C6. 定義容器類的模板的頭文件
頭文件 |
描 述 |
<vector> |
定義vector序列模板,這是一個大小可以重新設置的數組類型,比普通數組更安全、更靈活 |
<list> |
定義list序列模板,這是一個序列的鏈表,常常在任意位置插入和刪除元素 |
<deque> |
定義deque序列模板,支持在開始和結尾的高效插入和刪除操作 |
<queue> |
為隊列(先進先出)數據結構定義序列適配器queue和priority_queue |
<stack> |
為堆棧(后進先出)數據結構定義序列適配器stack |
<map> |
map是一個關聯容器類型,允許根據鍵值是唯一的,且按照升序存儲。multimap類似於map,但鍵不是唯一的。 |
<set> |
set是一個關聯容器類型,用於以升序方式存儲唯一值。multiset類似於set,但是值不必是唯一的。 |
<bitset> |
為固定長度的位序列定義bitset模板,它可以看作固定長度的緊湊型bool數組 |
C7. 支持迭代器的頭文件
頭文件 |
描 述 |
<iterator> |
給迭代器提供定義和支持 |
C8. 有關算法的頭文件
頭文件 |
描 述 |
<algorithm> |
提供一組基於算法的函數,包括置換、排序、合並和搜索 |
<cstdlib> |
聲明C標准庫函數bsearch()和qsort(),進行搜索和排序 |
<ciso646> |
允許在代碼中使用and代替&& |
C9. 有關數值操作的頭文件
頭文件 |
描 述 |
<complex> |
支持復雜數值的定義和操作 |
<valarray> |
支持數值矢量的操作 |
<numeric> |
在數值序列上定義一組一般數學操作,例如accumulate和inner_product |
<cmath> |
這是C數學庫,其中還附加了重載函數,以支持C++約定 |
<cstdlib> |
提供的函數可以提取整數的絕對值,對整數進行取余數操作 |
C10. 有關本地化的頭文件
頭文件 |
描 述 |
<locale> |
提供的本地化包括字符類別、排序序列以及貨幣和日期表示。 |
<clocale> |
對本地化提供C樣式支持 |
C++標准庫的所有頭文件都沒有擴展名。C++標准庫以<cname>形式的標准頭文件提供。在 <cname>形式標准的頭文件中,與宏相關的名稱在全局作用域中定義,其他名稱在std命名空間中聲明。在C++中還可以使用name.h形式的標准C庫頭文件名。
STL(Standard Template Library,標准模板庫)是惠普實驗室開發的一系列軟件的統稱。現然主要出現在C++中,但在被引入C++之前該技術就已經存在了很長的一段時間。
STL的代碼從廣義上講分為三類:algorithm(算法)、container(容器)和iterator(迭代器),幾乎所有的代碼都采用了模板類和模版函數的方式,這相比於傳統的由函數和類組成的庫來說提供了更好的代碼重用機會。在C++標准中,STL被組織為下面的13個頭文件:<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack>和<utility>。
1、算法
函數庫對數據類型的選擇對其可重用性起着至關重要的作用。舉例來說,一個求方根的函數,在使用浮點數作為其參數類型的情況下的可重用性肯定比使用整型作為它的參數類性要高。而C++通過模板的機制允許推遲對某些類型的選擇,直到真正想使用模板或者說對模板進行特化的時候,STL就利用了這一點提供了相當多的有用算法。它是在一個有效的框架中完成這些算法的——可以將所有的類型划分為少數的幾類,然后就可以在模版的參數中使用一種類型替換掉同一種類中的其他類型。
STL提供了大約100個實現算法的模版函數,比如算法for_each將為指定序列中的每一個元素調用指定的函數,stable_sort以你所指定的規則對序列進行穩定性排序等等。這樣一來,只要熟悉了STL之后,許多代碼可以被大大的化簡,只需要通過調用一兩個算法模板,就可以完成所需要的功能並大大地提升效率。
算法部分主要由頭文件<algorithm>,<numeric>和<functional>組成。<algorithm>是所有STL頭文件中最大的一個(盡管它很好理解),它是由一大堆模版函數組成的,可以認為每個函數在很大程度上都是獨立的,其中常用到的功能范圍涉及到比較、交換、查找、遍歷操作、復制、修改、移除、反轉、排序、合並等等。<numeric>體積很小,只包括幾個在序列上面進行簡單數學運算的模板函數,包括加法和乘法在序列上的一些操作。<functional>中則定義了一些模板類,用以聲明函數對象。
2、容器
在實際的開發過程中,數據結構本身的重要性不會遜於操作於數據結構的算法的重要性,當程序中存在着對時間要求很高的部分時,數據結構的選擇就顯得更加重要。
經典的數據結構數量有限,但是我們常常重復着一些為了實現向量、鏈表等結構而編寫的代碼,這些代碼都十分相似,只是為了適應不同數據的變化而在細節上有所出入。STL容器就為我們提供了這樣的方便,它允許我們重復利用已有的實現構造自己的特定類型下的數據結構,通過設置一些模版類,STL容器對最常用的數據結構提供了支持,這些模板的參數允許我們指定容器中元素的數據類型,可以將我們許多重復而乏味的工作簡化。
容器部分主要由頭文件<vector>,<list>,<deque>,<set>,<map>,<stack>和<queue>組成。對於常用的一些容器和容器適配器(可以看作由其它容器實現的容器),可以通過下表總結一下它們和相應頭文件的對應關系。
數據結構 |
描述 |
實現頭文件 |
向量(vector) |
連續存儲的元素 |
<vector> |
列表(list) |
由節點組成的雙向鏈表,每個結點包含着一個元素 |
<list> |
雙隊列(deque) |
連續存儲的指向不同元素的指針所組成的數組 |
<deque> |
集合(set) |
由節點組成的紅黑樹,每個節點都包含着一個元素,節點之間以某種作用於元素對的謂詞排列,沒有兩個不同的元素能夠擁有相同的次序 |
<set> |
多重集合(multiset) |
允許存在兩個次序相等的元素的集合 |
<set> |
棧(stack) |
后進先出的值的排列 |
<stack> |
隊列(queue) |
先進先出的執的排列 |
<queue> |
優先隊列(priority_queue) |
元素的次序是由作用於所存儲的值對上的某種謂詞決定的的一種隊列 |
<queue> |
映射(map) |
由{鍵,值}對組成的集合,以某種作用於鍵對上的謂詞排列 |
<map> |
多重映射(multimap) |
允許鍵對有相等的次序的映射 |
<map> |
3、迭代器
迭代器從作用上來說是最基本的部分,可是理解起來比前兩者都要費力一些。軟件設計有一個基本原則,所有的問題都可以通過引進一個間接層來簡化,這種簡化在STL中就是用迭代器來完成的。概括來說,迭代器在STL中用來將算法和容器聯系起來,起着一種黏和劑的作用。幾乎STL提供的所有算法都是通過迭代器存取元素序列進行工作的,每一個容器都定義了其本身所專有的迭代器,用以存取容器中的元素。
迭代器部分主要由頭文件<utility>,<iterator>和<memory>組成。<utility>是一個很小的頭文件,它包括了貫穿使用在STL中的幾個模板的聲明,<iterator>中提供了迭代器使用的許多方法,而對於<memory>的描述則十分的困難,它以不同尋常的方式為容器中的元素分配存儲空間,同時也為某些算法執行期間產生的臨時對象提供機制,<memory>中的主要部分是模板類allocator,它負責產生所有容器中的默認分配器。
三、后記
對於STL的使用,也普遍存在着兩種觀點。第一種認為STL的最大作用在於充當經典的數據結構和算法教材,因為它的源代碼涉及了許多具體實現方面的問題。第二種則認為STL的初衷乃是為了簡化設計,避免重復勞動,提高編程效率,因此應該是“應用至上”的,對於源代碼則不必深究。對於初學者而言,通過分析源代碼,提高對其應用的理解其意義也不同凡響。
曾經想着設計幾個上機題目,讓同學們體會一下利用STL編程。寫出一個適合初學者的,規模又不能太大,還要有足夠引導的題目,實在是一件非常費時費力的事,加上有其他事還得應急,就將此帳欠下,日后再說。要給同學們提的建議是,不少C++的經典教材對STL都有非常好的講解,可以選一本去讀。在讀書時,要開始學着挑着讀,跳着讀,不必從頭到尾,逐頁去讀。在這個階段,可以首先學習迭代器utility、在C++編程中建議替代數組的vector,以及實現雙向鏈表的list。vector和list與本周任務1和任務2似乎有些相關。再者,發揚我們一貫特別能實踐的精神,及時找些題目或者自編題目進行實踐。
====================================================
C++標准庫函數 c++程序通常可以調用標准c++庫中的大量函數。這些函數完成一些基本的服務,如輸入和輸出等,同時也為一些經常使用的操作提供了高效的 實現代碼。這些函數中含有大量的函數和類定義,以幫助程序員更好地使用標准c++庫。 標准c++庫包含以下內容: <algorithm>,<bitset>,<complex>,<deque>,<exception>,<fstream>,<functionl>,<iomanip>,<ios>,<iosfwd>,<iostream>,<isteam>,<iterat or>,<limits>,<list>,<locale>,<map>,<memory>,<numeric>,<ostream>,<queue>,<set>,<sstream>,<stack>,<stdxcept>,<streambuf>,<strin ig>,<strstream>,<utility>,<valarray>,<vactor>,<cassert>,<cctype>,<cerron>,<cfloat>,<ciso646>,<climits>,<clocale>,<cmath>,<cse tjmp>,<csignal>,<cstdrag>,<cstddef>,<cstdio>,<cstdlibn>,<cstring>,<ctime>,<cwchar>,<iso646.h>和<cwchar.h> 標准c++庫的詳細消息均在其對應的頭文件進行了說明。主要標准c++庫頭文件如下所示。其中13項為標准模板庫(STL),在其說明文字的前面標有(STL)的為標准模板庫。
<algorithm>---(STL)用於定義實現常用、實用算法的大量模板
<bitset>----- 用於定義官位位集合的模板類
<cassert>-----用於在程序執行時執行斷言
<cctype>-----用於對字符進行分類
<cerrno>-----用於測試有庫函數提交的錯誤代碼
<cfloat>------用於測試浮點類型屬性
<cios646>----用於在ISO646變體字符集中編程
<climits>-----用於測試整數類型屬性
<clocale>-----用於使程序適應不同的文化風俗
<cmath>———用於計算常用的數學函數
<complex>-----用於定義支持復雜算法的模板類
<csetjmp>-----用於執行非局部的goto語句
<csignal>------用於控制各種異常情況
<cstdrag>-----用於訪問參數數量文化的函數
<cstdarg>-----用於訪問參數數量變化的函數
<cstddef>----用於定義實用的類型和宏
<cstdio>-----用於執行輸入和輸出
<cstdlib>----用於執行同一操作的不同版本
<string>-----用於處理幾種不同的字符串類型
<ctime>------用於在幾種不同的時間和日期格式間進行轉換
<cwchar>----用於處理寬流(wide stream)和字符串
<cwctype>---用於對寬字符(wide character是)分類
<deque>---(STL)用於定義實現雙向隊列容器的模板類
<exception>---用於定義控制異常處理的幾個函數
<fstream>-----用於定義處理外部文件的幾個iostream模板類
<functional>-----(STL)用於定義幾個模板,該模板將幫助在
<algorithm>和<numeric>中定義的 模板構造謂詞
<iomapip>---- 用於聲明一個帶有參數的iostreams控制器
<ios>-----用於定義用作大量iostreams類的基類的模板類
<iosfwd>-----用於定義iostreams模板類(在需要定義之前)
<iostream>---用於聲明處理標准流的iostreams對象
<istream>---用於定義執行析取操作的模板類
<iterator>----(STL)用於定義幫助定義和管理迭代器的模板
<limits>---用於測試數字類屬性
<list>---(STL)用於定義實現list容器的模板類
<locale>----用於定義在iostreams類中控制與特定位置相關的行為的類和模板
<map>------(STL)用於定義實現關聯容器的模板類
<memoery>-----(STL)用於定義對不同容器分配和釋放內存的模板
<numeric>-----(STL)用於定義實現實用數字函數的模板
<ostream>----用於定義管理字符串容器的iostreamas模板類
<queque>----(STL)用於實現隊列容器的模板類
<set>-----(STL)用於定義實現只有唯一元素的關聯容器的模板類
<sstream>----用於定義管理字符串容器的iostreams模板類
<stack>-----(STL)用於定義實現堆棧容器的模板類
<stdexcept>----用於定義提交異常的類
<streambuf>----用於定義為iostreams操作分配緩沖區的模板類
<string>------用於定義是實現字符串容器的模板類
<strstream>-----用於定義處理非內存(in-memory)字符系列的iostreams類
<utility>-----(STL)用於定義通用工具的模板
<valarray>----用於定義支持值(value-oriented)數組的類和模板類
<vector>----(STL)用於定義實現向量容器的模板類
標准c++庫還包括18個標准C庫中的頭文件,但其中有些變化。我們暫時不討論,這些頭文件為:====================
<assert.h>---用於在程序運行時執行斷言
<ctype.h>----用於對字符分類
<errno.h>----用於測試用庫函數提交的錯誤代碼
<float.h>----用於測試浮點類型屬性
<ios646.h>-----用於在IOS646變體字符集中編程
<limits.h>-----用於測試整數類型屬性
<locale.h>-----用於適應不同的文化習俗
<math.h>----用於計算常見的數學函數
<setjmp.h>----用於執行非局部的goto語句
<signal.h>----用於控制各種異常情況
<stdrag.h>-----用於訪問參數數量變化的函數
<stddef.h>-----用於定義類型和宏
<stdio.h>------用於執行輸入和輸出
<stdlib.h>------用於執行各種操作
<string.h>-----用於處理字符串
<time.h>-------用於在不同的時間和日期格式之間轉換
<wchar.h>-----用於處理寬流(wide stream)和字符類
<wctype.h>-----用於對寬字符(wide character)分類