Boost常用組件概覽

前言

    大致翻閱了羅劍鋒老師所著的《Boost程序庫完全開發指南》(第三版),對書中介紹的一些常用的Boost庫組件進行一個總結性的概覽,這些總結基本來自書中的介紹,其中一些也添加了自己的描述。寫這篇博文的主要意圖是:(1)進行讀書筆記,便於日後瀏覽;(2)與大家共享,也相當於做了一個知識提煉,把一些常用組件的用途進行總結說明,旨在讓大家能快速瞭解這些常用組件的用途,日後若有需要用到的地方,可以深入學習並應用。

    總之,這篇博文並不是網上那些專業的Boost庫源碼分析,也不是對整個Boost庫的專業剖析,只是作爲一個Boost庫在C++應用方面的讀書筆記與大家分享,旨在幫助大家瞭解一些常用的組件,避免重複的造輪子。書中有一句話說的很好:在程序開發中,千萬要“避免重複造輪子”(這樣下來只會浪費時間,也就是吃力不討好),所以,如果在開發中遇到了什麼問題,首先查閱STL、Boost庫,如果不能解決,再上網查,實在沒有可以參考的已有方案再自己動手。


Boost常用庫概覽

    1、時間與日期
        C++一直以來缺乏對時間和日期的處理能力,而時間和日期又是現實生活中經常遇到的,所以C++程序員不得不求助於C,使用笨拙的結構和函數。無法忍受這一情形的程序員則手工構造了自己的首先以滿足開發所需,這就導致了很多程序員在“重複的造輪子”Boost提供了timer、data_time、chrono三個庫解決了上述問題,避免程序員重複造輪子。

            (1)timer庫提供簡易的度量時間和進度顯示功能,可以用於性能測試等需要計時的任務,對於大多數的情況他足夠用。
            (2)data_time庫提供全面且靈活的日期時間庫,目的就是簡化複雜的日期和時間處理工作。
            (3)chrono庫提供“計算機世界”的時間處理服務,實現計算機系統的精確計時。


    2、內存管理
        C++標準沒有像Java、C#等語言的垃圾回收機制,這就需要C++程序員自己去避免內存泄漏、懸掛指針、越界訪問等內存問題。Boost提供了諸多庫來保證C++高效、正確的內存管理工作,這些庫包括:smart_ptr、scoped_ptr、scoped_array、shared_ptr、shared_ptr、shared_array、weak_ptr、intrusive_ptr、pool、object_pool、singleton_ptr、pool_alloc


    3、實用工具庫
        這不是一個整體庫,只是把Boost中的一些比較小的、簡單的庫歸爲一個“工具庫”,這些小工具庫不全是類,也有宏,列舉爲:
            (1)noncopyable組件:實現一個禁止拷貝的類;
            (2)ignore_unused組件:保證程序中暫時不用但又必須保留的變量通過編譯(不發出警告,注意,千萬不要忽略程序編譯過程中編譯器拋出的警告,要做到零警告零錯誤);

            (3)optional組件:包裝“可能產生無效值”的對象,保證這些對象返回一個有效值或者default值;

            (4)assign組件:提供簡單、方便的標準庫容器賦值或初始化服務,避免爲了賦值或初始化一個容器而重複調用insert、push_back方法;
            (5)swap組件:優化後的swap函數;
            (6)singleton組件:單例模式,實現這種模式的類在程序生命週期內只能有且僅有一個實例;
            (7)tribool組件:三態bool類型,包括true、false、indeterminate(未知,不確定)三種狀態;
            (8)operators組件:運行用戶在自己的類裏面僅定義少量的操作符,就可以方便地自動生成其他操作符重載,而且保證正確的語義實現,如一個類只需要定義==和<操作符,就可以自動生成!=、>、<=、>=這四種操作符;
            (9)exception組件:Boost定義的異常類,是對C++標準中的std::exception異常類的改進與強化;

            (10)uuid組件:表示和生成UUID(通用唯一識別碼)

            (11)config組件:Boost開發者(而不是庫使用者,即我們)工具,所以不用管;

            (12)utility庫:這不是一個有統一主題的Boost庫,包含若干很小但很有用的組件工具;



    4、字符串與文本處理
        包括lexical_cast、format、string_ref、string_algo、tokenizer和xpressive6個庫,其中:

            (1)lexical_cast和format主要關注於字符串的表示,可以將數值轉化爲字符串,對輸出做精確的格式化。
            (2)string_ref提供了一個只讀視圖,可以避免字符串的拷貝代價,是更好的const std::string&的替代品。
            (3)string_algo、tokenizer和xpressive三個庫主要關注於字符串的處理,提供了大量的字符串處理函數。

    5、正確性與測試

        這一類庫主要是爲了增強C++程序的bug檢測,主要包括assert、static_assert、lightweight_test和test4個庫。
            (1)assert庫:提供運行時的斷言,對C++標準中的assert進了強化;
            (2)static_assert庫:提供編譯期診斷;
            (3)lightweight_test和test庫:提供單元測試功能

    6、容器與數據結構
        Boost容器庫是對C++標準容器庫的擴展,主要包括10個容器(數據結構):array、dynamic_bitset、unordered、bimap、circular_buffer、tuple、any、variant、multi_array、property_tree。
            (1)array庫:對C++內建數組的封裝,是C++11標準的一部分
            (2)dynamic_bitset庫:結合了vector<bool>和bitset二者的有點,既能動態增長,又方便進行位運算;
            (3)unordered庫:散列容器類(讀者可以自行百度)
            (4)bimap庫:類似與C++標準庫的關聯容器,但是標準關聯容器只是單向關聯(映射),而bimap提供雙向映射的能力;
            (5)circular_buffer庫:大小固定的循環緩衝區;
            (6)tuple庫:元祖,對比與C++標準庫的pair類型,tuple可以容納不同數目元素,而且每個元素的類型都可以不一樣;
            (7)any庫:只能容納一個元素的容器,即該容器size固定爲1,但是這個元素的類型可以任意;
            (8)variant庫:對C++中union數據結構的擴展和增強,union只能容納內置類型的數據,而variant沒有這個限制;
            (9)multi_array庫:多維數組(容器),類似vector<vector<int> >;
            (10)property_tree庫:保存了多個屬性值的樹形數據結構;

    7、算法
        C++標準庫(STL)中提供了大量的算法,可以對容器執行統計、查找、賦值、排序等操作,同時Boost也跟進標準庫,提供了一些其他算法的實現,這裏主要介紹三個算法組件:foreach、minmax、algorithm。
            (1)foreach組件:對循環程序結構(如for循環)的編譯器級別實現,不依賴與高級別編譯器,即再低級別編譯器上也能編譯運行;
            (2)minmax組件:最大值、最小值應用;
            (3)algorithm組件:是一個算法集合,包含了很多有用的、小的算法。

    8、數學與數字
        C++標準庫現有的用於科學計算的組件還是無法滿足現代科學的計算要求,Boost庫就對這一方面的庫進行補充,主要包括:math.constants、integer、rational、ratio、crc和random6個庫。
            (1)math.constants庫:主要包含一些數學常數,如根號2、π等;
            (2)integer庫:提供喲管整數處理的頭文件和類,具有良好的可移植性;
            (3)rational庫:實現了有理數
            (4)ratio庫:表述生活中的一些常用的單位表示;
            (5)crc庫:就是計算機網絡中的循環冗餘校驗碼,是一種錯誤檢測機制;
             (6)random庫:真正的隨機數生成器。

    9、操作系統相關
        Boost提供了一定的跨平臺移植功能,這些庫屏蔽了操作系統的底層細節,主要包括:system、chrono、cpu_timer、filesystem、program_options庫;
            (1)system庫:使用輕量級的對象封裝了操作系統底層的錯誤代碼和錯誤信息,使調用操作系統功能的程序可以被很容易地移植到其他系統。
            (2)cpu_timer庫:支持對CPU時間片進行高進度的計時;
            (3)filesystem庫:是一個可移植的文件系統操作庫;

            (4)program_options庫:提供類似於gcc那樣功能強大的命令行參數處理功能;

    10、函數與回調
        主要涉及函數與函數對象,總共4個庫:ref、bind、function、signals2
            (1)ref庫:提供引用語義;
            (2)bind庫:提供參數綁定功能
            (3)function庫:函數對象”容器“
            (4)signals2庫:基於Boost庫中的另一個庫signals實現了線程安全的觀察者模式;

    11、併發編程
        Boost提供多個用於併發編程的庫或組件來彌補C++標準庫在一塊的短板,主要包括3個庫:atomic、thread、asio。
            (1)atomic庫:實現了C++11標準庫定義的院子操作庫,對不同計算機硬件的底層操作原語進行封裝,提供跨平臺的原子操作功能;
            (2)thread庫:已經成爲C++11的標準,爲C++增加了線程處理的能力,它提供簡明清晰的互斥量、線程、條件變量等概念,可以很容易地創建多線程應用程序,實現併發編程。
            (3)asio庫:主要用於網絡編程,封裝了大量的Socket API,提供了一個現代C++風格的網絡編程接口

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章