[C/C++] C/C++延伸學習系列之STL及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/

相關文章
相關標籤/搜索