轉(zhuǎn)自原文http://blog.csdn.net/sxhelijian/article/details/7552499
C++強(qiáng)大的功能來源于其豐富的類庫及庫函數(shù)資源。C++標(biāo)準(zhǔn)庫的內(nèi)容總共在50個標(biāo)準(zhǔn)頭文件中定義。在C++開發(fā)中,要盡可能地利用標(biāo)準(zhǔn)庫完成。這樣做的直接好處包括:(1)成本:已經(jīng)作為標(biāo)準(zhǔn)提供,何苦再花費時間、人力重新開發(fā)呢;(2)質(zhì)量:標(biāo)準(zhǔn)庫的都是經(jīng)過嚴(yán)格測試的,正確性有保證;(3)效率:關(guān)于人的效率已經(jīng)體現(xiàn)在成本中了,關(guān)于代碼的執(zhí)行效率要相信實現(xiàn)標(biāo)準(zhǔn)庫的大牛們的水平;(4)良好的編程風(fēng)格:采用行業(yè)中普遍的做法進(jìn)行開發(fā)。
在C++程序設(shè)計課程中,尤其是作為第一門程序設(shè)計課程,我們注重了語法、語言的機(jī)制等方面的內(nèi)容。程序設(shè)計能力的培養(yǎng)有個過程,跨過基本的原理性知識直接進(jìn)入到工程中的普遍做法,由于跨度決定了其難度。再者,在掌握了基本原理的基礎(chǔ)上,在認(rèn)識標(biāo)準(zhǔn)庫的問題上完全可以憑借實踐,逐步地掌握。標(biāo)準(zhǔn)庫的學(xué)習(xí)不需要認(rèn)認(rèn)真真地讀書,需要的是在了解概貌的情況下,在實踐中深入。
這個任務(wù)就是要知道C++程序設(shè)計課程中不講的,但對程序設(shè)計又很重要的這部分內(nèi)容。至少我們要能先回答出“有什么”的問題。
一、C++標(biāo)準(zhǔn)庫
C++標(biāo)準(zhǔn)庫的內(nèi)容分為10類,分別是(建議在閱讀中,將你已經(jīng)用過或聽說過的頭文件劃出來):
C1. 標(biāo)準(zhǔn)庫中與語言支持功能相關(guān)的頭文件
頭文件 | 描 述 |
<cstddef> | 定義宏NULL和offsetof,以及其他標(biāo)準(zhǔn)類型size_t和ptrdiff_t。與對應(yīng)的標(biāo)準(zhǔn)C頭文件的區(qū)別是,NULL是C++空指針常量的補充定義,宏offsetof接受結(jié)構(gòu)或者聯(lián)合類型參數(shù),只要他們沒有成員指針類型的非靜態(tài)成員即可。 |
<limits> | 提供與基本數(shù)據(jù)類型相關(guān)的定義。例如,對于每個數(shù)值數(shù)據(jù)類型,它定義了可以表示出來的最大值和最小值以及二進(jìn)制數(shù)字的位數(shù)。 |
<climits> | 提供與基本整數(shù)數(shù)據(jù)類型相關(guān)的C樣式定義。這些信息的C++樣式定義在<limits>中 |
<cfloat> | 提供與基本浮點型數(shù)據(jù)類型相關(guān)的C樣式定義。這些信息的C++樣式定義在<limits>中 |
<cstdlib> | 提供支持程序啟動和終止的宏和函數(shù)。這個頭文件還聲明了許多其他雜項函數(shù),例如搜索和排序函數(shù),從字符串轉(zhuǎn)換為數(shù)值等函數(shù)。它與對應(yīng)的標(biāo)準(zhǔn)C頭文件stdlib.h不同,定義了abort(void)。abort()函數(shù)還有額外的功能,它不為靜態(tài)或自動對象調(diào)用析構(gòu)函數(shù),也不調(diào)用傳給atexit()函數(shù)的函數(shù)。它還定義了exit()函數(shù)的額外功能,可以釋放靜態(tài)對象,以注冊的逆序調(diào)用用atexit()注冊的函數(shù)。清除并關(guān)閉所有打開的C流,把控制權(quán)返回給主機(jī)環(huán)境。 |
<new> | 支持動態(tài)內(nèi)存分配 |
<typeinfo> | 支持變量在運行期間的類型標(biāo)識 |
<exception> | 支持異常處理,這是處理程序中可能發(fā)生的錯誤的一種方式 |
<cstdarg> | 支持接受數(shù)量可變的參數(shù)的函數(shù)。即在調(diào)用函數(shù)時,可以給函數(shù)傳送數(shù)量不等的數(shù)據(jù)項。它定義了宏va_arg、va_end、va_start以及va_list類型 |
<csetjmp> | 為C樣式的非本地跳躍提供函數(shù)。這些函數(shù)在C++中不常用 |
<csignal> | 為中斷處理提供C樣式支持 |
C2. 支持流輸入/輸出的頭文件
頭文件 | 描 述 |
<iostream> | 支持標(biāo)準(zhǔn)流cin、cout、cerr和clog的輸入和輸出,它還支持多字節(jié)字符標(biāo)準(zhǔn)流wcin、wcout、wcerr和wclog。 |
<iomanip> | 提供操縱程序,允許改變流的狀態(tài),從而改變輸出的格式。 |
<ios> | 定義iostream的基類 |
<istream> | 為管理輸出流緩存區(qū)的輸入定義模板類 |
<ostream> | 為管理輸出流緩存區(qū)的輸出定義模板類 |
<sstream> | 支持字符串的流輸入輸出 |
<fstream> | 支持文件的流輸入輸出 |
<iosfwd> | 為輸入輸出對象提供向前的聲明 |
<streambuf> | 支持流輸入和輸出的緩存 |
<cstdio> | 為標(biāo)準(zhǔn)流提供C樣式的輸入和輸出 |
<cwchar> | 支持多字節(jié)字符的C樣式輸入輸出 |
C3. 與診斷功能相關(guān)的頭文件
頭文件 | 描 述 |
<stdexcept> | 定義標(biāo)準(zhǔn)異常。異常是處理錯誤的方式 |
<cassert> | 定義斷言宏,用于檢查運行期間的情形 |
<cerrno> | 支持C樣式的錯誤信息 |
C4. 定義工具函數(shù)的頭文件
頭文件 | 描 述 |
<utility> | 定義重載的關(guān)系運算符,簡化關(guān)系運算符的寫入,它還定義了pair類型,該類型是一種模板類型,可以存儲一對值。這些功能在庫的其他地方使用 |
<functional> | 定義了許多函數(shù)對象類型和支持函數(shù)對象的功能,函數(shù)對象是支持Operator()()函數(shù)調(diào)用運算符的任意對象 |
<memory> | 給容器、管理內(nèi)存的函數(shù)和auto_ptr模板類定義標(biāo)準(zhǔn)內(nèi)存分配器 |
<ctime> | 支持系統(tǒng)時鐘函數(shù) |
C5. 支持字符串處理的頭文件
頭文件 | 描 述 |
<string> | 為字符串類型提供支持和定義,包括單字節(jié)字符串(由char組成)的string和多字節(jié)字符串(由wchar_t組成) |
<cctype> | 單字節(jié)字符類別 |
<cwctype> | 多字節(jié)字符類別 |
<cstring> | 為處理非空字節(jié)序列和內(nèi)存塊提供函數(shù)。這不同于對應(yīng)的標(biāo)準(zhǔn)C庫頭文件,幾個C樣式字符串的一般C庫函數(shù)被返回值為const和非const的函數(shù)對替代了 |
<cwchar> | 為處理、執(zhí)行I/O和轉(zhuǎn)換多字節(jié)字符序列提供函數(shù),這不同于對應(yīng)的標(biāo)準(zhǔn)C庫頭文件,幾個多字節(jié)C樣式字符串操作的一般C庫函數(shù)被返回值為const和非const的函數(shù)對替代了。 |
<cstdlib> | 為把單字節(jié)字符串轉(zhuǎn)換為數(shù)值、在多字節(jié)字符和多字節(jié)字符串之間轉(zhuǎn)換提供函數(shù) |
C6. 定義容器類的模板的頭文件
頭文件 | 描 述 |
<vector> | 定義vector序列模板,這是一個大小可以重新設(shè)置的數(shù)組類型,比普通數(shù)組更安全、更靈活 |
<list> | 定義list序列模板,這是一個序列的鏈表,常常在任意位置插入和刪除元素 |
<deque> | 定義deque序列模板,支持在開始和結(jié)尾的高效插入和刪除操作 |
<queue> | 為隊列(先進(jìn)先出)數(shù)據(jù)結(jié)構(gòu)定義序列適配器queue和PRiority_queue |
<stack> | 為堆棧(后進(jìn)先出)數(shù)據(jù)結(jié)構(gòu)定義序列適配器stack |
<map> | map是一個關(guān)聯(lián)容器類型,允許根據(jù)鍵值是唯一的,且按照升序存儲。multimap類似于map,但鍵不是唯一的。 |
<set> | set是一個關(guān)聯(lián)容器類型,用于以升序方式存儲唯一值。multiset類似于set,但是值不必是唯一的。 |
<bitset> | 為固定長度的位序列定義bitset模板,它可以看作固定長度的緊湊型bool數(shù)組 |
C7. 支持迭代器的頭文件
頭文件 | 描 述 |
<iterator> | 給迭代器提供定義和支持 |
C8. 有關(guān)算法的頭文件
頭文件 | 描 述 |
<algorithm> | 提供一組基于算法的函數(shù),包括置換、排序、合并和搜索 |
<cstdlib> | 聲明C標(biāo)準(zhǔn)庫函數(shù)bsearch()和qsort(),進(jìn)行搜索和排序 |
<ciso646> | 允許在代碼中使用and代替&& |
C9. 有關(guān)數(shù)值操作的頭文件
頭文件 | 描 述 |
<complex> | 支持復(fù)雜數(shù)值的定義和操作 |
<valarray> | 支持?jǐn)?shù)值矢量的操作 |
<numeric> | 在數(shù)值序列上定義一組一般數(shù)學(xué)操作,例如accumulate和inner_product |
<cmath> | 這是C數(shù)學(xué)庫,其中還附加了重載函數(shù),以支持C++約定 |
<cstdlib> | 提供的函數(shù)可以提取整數(shù)的絕對值,對整數(shù)進(jìn)行取余數(shù)操作 |
C10. 有關(guān)本地化的頭文件
頭文件 | 描 述 |
<locale> | 提供的本地化包括字符類別、排序序列以及貨幣和日期表示。 |
<clocale> | 對本地化提供C樣式支持 |
C++標(biāo)準(zhǔn)庫的所有頭文件都沒有擴(kuò)展名。C++標(biāo)準(zhǔn)庫以<cname>形式的標(biāo)準(zhǔn)頭文件提供。在 <cname>形式標(biāo)準(zhǔn)的頭文件中,與宏相關(guān)的名稱在全局作用域中定義,其他名稱在std命名空間中聲明。在C++中還可以使用name.h形式的標(biāo)準(zhǔn)C庫頭文件名。
二、標(biāo)準(zhǔn)模板庫STL簡介[1]
STL(Standard Template Library,標(biāo)準(zhǔn)模板庫)是惠普實驗室開發(fā)的一系列軟件的統(tǒng)稱。現(xiàn)然主要出現(xiàn)在C++中,但在被引入C++之前該技術(shù)就已經(jīng)存在了很長的一段時間。
STL的代碼從廣義上講分為三類:algorithm(算法)、container(容器)和iterator(迭代器),幾乎所有的代碼都采用了模板類和模版函數(shù)的方式,這相比于傳統(tǒng)的由函數(shù)和類組成的庫來說提供了更好的代碼重用機(jī)會。在C++標(biāo)準(zhǔn)中,STL被組織為下面的13個頭文件:<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack>和<utility>。
1、算法
函數(shù)庫對數(shù)據(jù)類型的選擇對其可重用性起著至關(guān)重要的作用。舉例來說,一個求方根的函數(shù),在使用浮點數(shù)作為其參數(shù)類型的情況下的可重用性肯定比使用整型作為它的參數(shù)類性要高。而C++通過模板的機(jī)制允許推遲對某些類型的選擇,直到真正想使用模板或者說對模板進(jìn)行特化的時候,STL就利用了這一點提供了相當(dāng)多的有用算法。它是在一個有效的框架中完成這些算法的——可以將所有的類型劃分為少數(shù)的幾類,然后就可以在模版的參數(shù)中使用一種類型替換掉同一種類中的其他類型。
STL提供了大約100個實現(xiàn)算法的模版函數(shù),比如算法for_each將為指定序列中的每一個元素調(diào)用指定的函數(shù),stable_sort以你所指定的規(guī)則對序列進(jìn)行穩(wěn)定性排序等等。這樣一來,只要熟悉了STL之后,許多代碼可以被大大的化簡,只需要通過調(diào)用一兩個算法模板,就可以完成所需要的功能并大大地提升效率。
算法部分主要由頭文件<algorithm>,<numeric>和<functional>組成。<algorithm>是所有STL頭文件中最大的一個(盡管它很好理解),它是由一大堆模版函數(shù)組成的,可以認(rèn)為每個函數(shù)在很大程度上都是獨立的,其中常用到的功能范圍涉及到比較、交換、查找、遍歷操作、復(fù)制、修改、移除、反轉(zhuǎn)、排序、合并等等。<numeric>體積很小,只包括幾個在序列上面進(jìn)行簡單數(shù)學(xué)運算的模板函數(shù),包括加法和乘法在序列上的一些操作。<functional>中則定義了一些模板類,用以聲明函數(shù)對象。
2、容器
在實際的開發(fā)過程中,數(shù)據(jù)結(jié)構(gòu)本身的重要性不會遜于操作于數(shù)據(jù)結(jié)構(gòu)的算法的重要性,當(dāng)程序中存在著對時間要求很高的部分時,數(shù)據(jù)結(jié)構(gòu)的選擇就顯得更加重要。
經(jīng)典的數(shù)據(jù)結(jié)構(gòu)數(shù)量有限,但是我們常常重復(fù)著一些為了實現(xiàn)向量、鏈表等結(jié)構(gòu)而編寫的代碼,這些代碼都十分相似,只是為了適應(yīng)不同數(shù)據(jù)的變化而在細(xì)節(jié)上有所出入。STL容器就為我們提供了這樣的方便,它允許我們重復(fù)利用已有的實現(xiàn)構(gòu)造自己的特定類型下的數(shù)據(jù)結(jié)構(gòu),通過設(shè)置一些模版類,STL容器對最常用的數(shù)據(jù)結(jié)構(gòu)提供了支持,這些模板的參數(shù)允許我們指定容器中元素的數(shù)據(jù)類型,可以將我們許多重復(fù)而乏味的工作簡化。
容器部分主要由頭文件<vector>,<list>,<deque>,<set>,<map>,<stack>和<queue>組成。對于常用的一些容器和容器適配器(可以看作由其它容器實現(xiàn)的容器),可以通過下表總結(jié)一下它們和相應(yīng)頭文件的對應(yīng)關(guān)系。
數(shù)據(jù)結(jié)構(gòu) | 描述 | 實現(xiàn)頭文件 |
向量(vector) | 連續(xù)存儲的元素 | <vector> |
列表(list) | 由節(jié)點組成的雙向鏈表,每個結(jié)點包含著一個元素 | <list> |
雙隊列(deque) | 連續(xù)存儲的指向不同元素的指針?biāo)M成的數(shù)組 | <deque> |
集合(set) | 由節(jié)點組成的紅黑樹,每個節(jié)點都包含著一個元素,節(jié)點之間以某種作用于元素對的謂詞排列,沒有兩個不同的元素能夠擁有相同的次序 | <set> |
多重集合(multiset) | 允許存在兩個次序相等的元素的集合 | <set> |
棧(stack) | 后進(jìn)先出的值的排列 | <stack> |
隊列(queue) | 先進(jìn)先出的執(zhí)的排列 | <queue> |
優(yōu)先隊列(priority_queue) | 元素的次序是由作用于所存儲的值對上的某種謂詞決定的的一種隊列 | <queue> |
映射(map) | 由{鍵,值}對組成的集合,以某種作用于鍵對上的謂詞排列 | <map> |
多重映射(multimap) | 允許鍵對有相等的次序的映射 | <map> |
3、迭代器
迭代器從作用上來說是最基本的部分,可是理解起來比前兩者都要費力一些。軟件設(shè)計有一個基本原則,所有的問題都可以通過引進(jìn)一個間接層來簡化,這種簡化在STL中就是用迭代器來完成的。概括來說,迭代器在STL中用來將算法和容器聯(lián)系起來,起著一種黏和劑的作用。幾乎STL提供的所有算法都是通過迭代器存取元素序列進(jìn)行工作的,每一個容器都定義了其本身所專有的迭代器,用以存取容器中的元素。
迭代器部分主要由頭文件<utility>,<iterator>和<memory>組成。<utility>是一個很小的頭文件,它包括了貫穿使用在STL中的幾個模板的聲明,<iterator>中提供了迭代器使用的許多方法,而對于<memory>的描述則十分的困難,它以不同尋常的方式為容器中的元素分配存儲空間,同時也為某些算法執(zhí)行期間產(chǎn)生的臨時對象提供機(jī)制,<memory>中的主要部分是模板類allocator,它負(fù)責(zé)產(chǎn)生所有容器中的默認(rèn)分配器。
三、后記
對于STL的使用,也普遍存在著兩種觀點。第一種認(rèn)為STL的最大作用在于充當(dāng)經(jīng)典的數(shù)據(jù)結(jié)構(gòu)和算法教材,因為它的源代碼涉及了許多具體實現(xiàn)方面的問題。第二種則認(rèn)為STL的初衷乃是為了簡化設(shè)計,避免重復(fù)勞動,提高編程效率,因此應(yīng)該是“應(yīng)用至上”的,對于源代碼則不必深究。對于初學(xué)者而言,通過分析源代碼,提高對其應(yīng)用的理解其意義也不同凡響。
曾經(jīng)想著設(shè)計幾個上機(jī)題目,讓同學(xué)們體會一下利用STL編程。寫出一個適合初學(xué)者的,規(guī)模又不能太大,還要有足夠引導(dǎo)的題目,實在是一件非常費時費力的事,加上有其他事還得應(yīng)急,就將此帳欠下,日后再說。要給同學(xué)們提的建議是,不少C++的經(jīng)典教材對STL都有非常好的講解,可以選一本去讀。在讀書時,要開始學(xué)著挑著讀,跳著讀,不必從頭到尾,逐頁去讀。在這個階段,可以首先學(xué)習(xí)迭代器utility、在C++編程中建議替代數(shù)組的vector,以及實現(xiàn)雙向鏈表的list。vector和list與本周任務(wù)1和任務(wù)2似乎有些相關(guān)。再者,發(fā)揚我們一貫特別能實踐的精神,及時找些題目或者自編題目進(jìn)行實踐。
[1] 這段文字在http://www.chinaitpower.com/A/2001-12-05/6859.html基礎(chǔ)上改編。
|
新聞熱點
疑難解答
圖片精選