C++標準庫——STL
閱讀目錄
- 1. C++標準庫——STL
- 2. C++“準”標準庫——Boost
想要徹底搞懂C++是很難的,或許是不太現實的。但是不積矽步,無以至千裏,所以抽時間來堅持學習一點,總結一點,多多鍛煉幾次,相信總有一天我們會變得"了解"C++。
1. C++標準庫——STL
1.1 STL簡介
STL(Standard Template Library,標準模板庫)是惠普實驗室開發的一系列軟件的統稱。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普實驗室工作時所開發出來的。
STL的代碼從廣義上講分為三類:algorithm(算法)、container(容器)和iterator(叠代器),幾乎所有的代碼都采用了模板類和模版函數的方式,這相比於傳統的由函數和類組成的庫來說提供了更好的代碼重用機會。
在C++標準中,STL被組織為下面的13個頭文件:<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack>和<utility>。
2.1 算法
大家都能取得的一個共識是函數庫對數據類型的選擇對其可重用性起著至關重要的作用。舉例來說,一個求方根的函數,在使用浮點數作為其參數類型的情況下的可重用性肯定比使用整型作為它的參數類性要高。而C++通過模板的機制允許推遲對某些類型的選擇,直到真正想使用模板或者說對模板進行特化的時候,STL就利用了這一點提供了相當多的有用算法。它是在一個有效的框架中完成這些算法的——你可以將所有的類型劃分為少數的幾類,然後就可以在模版的參數中使用一種類型替換掉同一種類中的其他類型。
STL提供了大約100個實現算法的模版函數,比如算法for_each將為指定序列中的每一個元素調用指定的函數,stable_sort以你所指定的規則對序列進行穩定性排序等等。這樣一來,只要我們熟悉了STL之後,許多代碼可以被大大的化簡,只需要通過調用一兩個算法模板,就可以完成所需要的功能並大大地提升效率。
算法部分主要由頭文件<algorithm>,<numeric>和<functional>組成。
<algorithm>是所有STL頭文件中最大的一個(盡管它很好理解),它是由一大堆模版函數組成的,可以認為每個函數在很大程度上都是獨立的,其中常用到的功能範圍涉及到比較、交換、查找、遍歷操作、復制、修改、移除、反轉、排序、合並等等。
<numeric>體積很小,只包括幾個在序列上面進行簡單數學運算的模板函數,包括加法和乘法在序列上的一些操作。
<functional>中則定義了一些模板類,用以聲明函數對象。
2.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> |
2.3 叠代器
下面要說的叠代器從作用上來說是最基本的部分,可是理解起來比前兩者都要費力一些(至少筆者是這樣)。軟件設計有一個基本原則,所有的問題都可以通過引進一個間接層來
簡化,這種簡化在STL中就是用叠代器來完成的。
概括來說,叠代器在STL中用來將算法和容器聯系起來,起著一種黏和劑的作用。幾乎STL提供的所有算法都是通過叠代器存取元素序列進行工作的,每一個容器都定義了其本身所專有的叠代器,用以存取容器中的元素。
叠代器部分主要由頭文件<utility>,<iterator>和<memory>組成。
<utility>是一個很小的頭文件,它包括了貫穿使用在STL中的幾個模板的聲明,
<iterator>中提供了叠代器使用的許多方法,而對於<memory>的描述則十分的困難,它以不同尋常的方式為容器中的元素分配存儲空間,同時也為某些算法執行期間產生的臨時對象提供機制。
<memory>中的主要部分是模板類allocator,它負責產生所有容器中的默認分配器。
對於STL的使用,普遍存在著兩種觀點。第一種認為STL的最大作用在於充當經典的數據結構和算法教材,因為它的源代碼涉及了許多具體實現方面的問題。第二種則認為STL的初衷乃是為了簡化設計,避免重復勞動,提高編程效率,因此應該是“應用至上”的,對於源代碼則不必深究。筆者則認為分析源代碼和應用並不矛盾,通過分析源代碼也能提高我們對其應用的理解,當然根據具體的目的也可以有不同的側重。
2. C++“準”標準庫——Boost
Boost 庫通過加入一些在實踐中非常有用的函數對 C++ 標準進行了補充。 由於 Boost C++ 庫是基於 C++ 標準的,所以它們是使用最先進的 C++ 來實現的。 它們是平臺獨立的,並由於有一個大型的開發人員社區,它可以被包括 Windows 和 Linux 在內的許多操作系統所支持。 Boost庫由C++標準委員會庫工作組成員發起,其中有些內容有望成為下一代C++標準庫內容。在C++社區中影響甚大,是不折不扣的“準”標準庫。Boost由於其對跨平臺的強調,對標準C++的強調,與編寫平臺無關。大部分boost庫功能的使用只需包括相應頭文件即可,少數(如正則表達式庫,文件系統庫等)需要鏈接庫。可以說,Boost庫是為C++語言標準庫提供擴展的一些C++程序庫的總稱。
Boost C++ 庫可以提升一個 C++ 開發人員的生產力。 例如,你可以從智能指針中受益,幫助你寫出更可靠的代碼,或者使用某個庫來開發平臺獨立的網絡應用。但Boost中也有很多是實驗性質的東西,在實際的開發中實用需要謹慎。
由於博主也屬於boost方面的菜鳥,對boost了解也很有限,這裏就不多介紹了,希望可以和大家一起“快樂”的學習和交流C++的知識。boost的官方網站:http://www.boost.org/。
C++標準庫——STL