當前位置:編程學習大全網 - 編程語言 - C++標準庫,標準程序庫,標準模板庫之間是什麽關系

C++標準庫,標準程序庫,標準模板庫之間是什麽關系

C++強大的功能來源於其豐富的類庫及庫函數資源。C++標準庫的內容總***在50個標準頭文件中定義。在C++開發中,要盡可能地利用標準庫完成。這樣做的直接好處有:

(1)成本:已經作為標準提供,何苦再花費時間、人力重新開發呢;

(2)質量:標準庫的都是經過嚴格測試的,正確性有保證;

(3)效率:關於人的效率已經體現在成本中了,關於代碼的執行效率要相信實現標準庫的大牛們的水平;

(4)良好的編程風格:采用行業中普遍的做法進行開發。

在C++程序設計課程中,尤其是作為第壹門程序設計課程,我們註重了語法、語言的機制等方面的內容。程序設計能力的培養有個過程,跨過基本的原理性知識直接進入到工程中的普遍做法,由於跨度決定了其難度。再者,在掌握了基本原理的基礎上,在認識標準庫的問題上完全可以憑借實踐,逐步地掌握。標準庫的學習不需要認認真真地讀書,需要的是在了解概貌的情況下,在實踐中深入。

這個任務就是要知道C++程序設計課程中不講的,但對程序設計又很重要的這部分內容。至少我們要能先回答出“有什麽”的問題。

壹、C++標準庫

C++標準庫的內容分為10類,分別是(建議在閱讀中,將妳已經用過或聽說過的頭文件劃出來):

C1. 標準庫中與語言支持功能相關的頭文件

C2. 支持流輸入/輸出的頭文件

C3. 與診斷功能相關的頭文件

C4. 定義工具函數的頭文件

C5. 支持字符串處理的頭文件

C6. 定義容器類的模板的頭文件

C7. 支持叠代器的頭文件

C8. 有關算法的頭文件

C9. 有關數值操作的頭文件

C10. 有關本地化的頭文件

C++標準庫的所有頭文件都沒有擴展名。C++標準庫以<cname>形式的標準頭文件提供。在 <cname>形式標準的頭文件中,與宏相關的名稱在全局作用域中定義,其他名稱在std命名空間中聲明。在C++中還可以使用name.h形式的標準C庫頭文件名。

二、標準模板庫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>。

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>組成。對於常用的壹些容器和容器適配器(可以看作由其它容器實現的容器),可以通過下表總結壹下它們和相應頭文件的對應關系。

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似乎有些相關。再者,發揚我們壹貫特別能實踐的精神,及時找些題目或者自編題目進行實踐。

  • 上一篇:學什麽技術,有發展前景
  • 下一篇:怎麽定義NULL
  • copyright 2024編程學習大全網