C++強大的功能來源於其豐富的類庫及庫函數資源。C++標準庫的內容總共在50個標準頭文件中定義。在C++開發中,要儘量地利用標準庫完 成。這樣作的直接好處包括:(1)成本:已經做爲標準提供,何苦再花費時間、人力從新開發呢;(2)質量:標準庫的都是通過嚴格測試的,正確性有保證; (3)效率:關於人的效率已經體如今成本中了,關於代碼的執行效率要相信實現標準庫的大牛們的水平;(4)良好的編程風格:採用行業中廣泛的作法進行開 發。ios
在C++程序設計課程中,尤爲是做爲第一門程序設計課程,咱們注重了語法、語言的機制等方面的內容。程序設計能力的培養有個過程,跨過基本的原 理性知識直接進入到工程中的廣泛作法,因爲跨度決定了其難度。再者,在掌握了基本原理的基礎上,在認識標準庫的問題上徹底能夠憑藉實踐,逐步地掌握。標準 庫的學習不須要認認真真地讀書,須要的是在瞭解概貌的狀況下,在實踐中深刻。算法
這個任務就是要知道C++程序設計課程中不講的,但對程序設計又很重要的這部份內容。至少咱們要能先回答出「有什麼」的問題。編程
1、C++標準庫數組
C++標準庫的內容分爲10類,分別是(建議在閱讀中,將你已經用過或據說過的頭文件劃出來):緩存
C1. 標準庫中與語言支持功能相關的頭文件安全
頭文件數據結構 |
描 述框架 |
<cstddef>數據結構和算法 |
定義宏NULL和offsetof,以及其餘標準類型size_t和ptrdiff_t。與對應的標準C頭文件的區別是,NULL是C++空指針常量的補充定義,宏offsetof接受結構或者聯合類型參數,只要他們沒有成員指針類型的非靜態成員便可。函數 |
<limits> |
提供與基本數據類型相關的定義。例如,對於每一個數值數據類型,它定義了能夠表示出來的最大值和最小值以及二進制數字的位數。 |
<climits> |
提供與基本整數數據類型相關的C樣式定義。這些信息的C++樣式定義在<limits>中 |
<cfloat> |
提供與基本浮點型數據類型相關的C樣式定義。這些信息的C++樣式定義在<limits>中 |
<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樣式支持 |
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庫頭文件名。
2、標準模板庫STL簡介[1]
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>。
一、算法
函數庫對數據類型的選擇對其可重用性起着相當重要的做用。舉例來講,一個求方根的函數,在使用浮點數做爲其參數類型的狀況下的可重用性確定比使 用整型做爲它的參數類性要高。而C++經過模板的機制容許推遲對某些類型的選擇,直到真正想使用模板或者說對模板進行特化的時候,STL就利用了這一點提 供了至關多的有用算法。它是在一個有效的框架中完成這些算法的——能夠將全部的類型劃分爲少數的幾類,而後就能夠在模版的參數中使用一種類型替換掉同一種 類中的其餘類型。
STL提供了大約100個實現算法的模版函數,好比算法for_each將爲指定序列中的每個元素調用指定的函數,stable_sort以 你所指定的規則對序列進行穩定性排序等等。這樣一來,只要熟悉了STL以後,許多代碼能夠被大大的化簡,只須要經過調用一兩個算法模板,就能夠完成所須要 的功能並大大地提高效率。
算法部分主要由頭文件<algorithm>,<numeric>和<functional>組 成。<algorithm>是全部STL頭文件中最大的一個(儘管它很好理解),它是由一大堆模版函數組成的,能夠認爲每一個函數在很大程度上 都是獨立的,其中經常使用到的功能範圍涉及到比較、交換、查找、遍歷操做、複製、修改、移除、反轉、排序、合併等等。<numeric>體積很 小,只包括幾個在序列上面進行簡單數學運算的模板函數,包括加法和乘法在序列上的一些操做。<functional>中則定義了一些模板類, 用以聲明函數對象。
二、容器
在實際的開發過程當中,數據結構自己的重要性不會遜於操做於數據結構的算法的重要性,當程序中存在着對時間要求很高的部分時,數據結構的選擇就顯得更加劇要。
經典的數據結構數量有限,可是咱們經常重複着一些爲了實現向量、鏈表等結構而編寫的代碼,這些代碼都十分類似,只是爲了適應不一樣數據的變化而在 細節上有所出入。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> |
三、迭代器
迭代器從做用上來講是最基本的部分,但是理解起來比前二者都要費力一些。軟件設計有一個基本原則,全部的問題均可以經過引進一個間接層來簡化, 這種簡化在STL中就是用迭代器來完成的。歸納來講,迭代器在STL中用來將算法和容器聯繫起來,起着一種黏和劑的做用。幾乎STL提供的全部算法都是通 過迭代器存取元素序列進行工做的,每個容器都定義了其自己所專有的迭代器,用以存取容器中的元素。
迭代器部分主要由頭文件<utility>,<iterator>和<memory>組 成。<utility>是一個很小的頭文件,它包括了貫穿使用在STL中的幾個模板的聲明,<iterator>中提供了迭代器 使用的許多方法,而對於<memory>的描述則十分的困難,它以不一樣尋常的方式爲容器中的元素分配存儲空間,同時也爲某些算法執行期間產生 的臨時對象提供機制,<memory>中的主要部分是模板類allocator,它負責產生全部容器中的默認分配器。
3、後記
對於STL的使用,也廣泛存在着兩種觀點。第一種認爲STL的最大做用在於充當經典的數據結構和算法教材,由於它的源代碼涉及了許多具體實現方 面的問題。第二種則認爲STL的初衷乃是爲了簡化設計,避免重複勞動,提升編程效率,所以應該是「應用至上」的,對於源代碼則沒必要深究。對於初學者而言, 經過分析源代碼,提升對其應用的理解其意義也不一樣凡響。
曾經想着設計幾個上機題目,讓同窗們體會一下利用STL編程。寫出一個適合初學者的,規模又不能太大,還要有足夠引導的題目,實在是一件很是費時費力 的事,加上有其餘事還得應急,就將此賬欠下,往後再說。要給同窗們提的建議是,很多C++的經典教材對STL都有很是好的講解,能夠選一本去讀。在讀書 時,要開始學着挑着讀,跳着讀,沒必要從頭至尾,逐頁去讀。在這個階段,能夠首先學習迭代器utility、在C++編程中建議替代數組的vector,以 及實現雙向鏈表的list。vector和list與本週任務1和任務2彷佛有些相關。再者,發揚咱們一向特別能實踐的精神,及時找些題目或者自編題目進 行實踐。