1. 程式人生 > >C++ Boost庫簡介

C++ Boost庫簡介

boost是一個準標準庫,相當於STL的延續和擴充,它的設計理念和STL比較接近,都是利用泛型讓複用達到最大化。不過對比STL,boost更加實用。STL集中在演算法部分,而boost包含了不少工具類,可以完成比較具體的工作。 boost主要包含一下幾個大類:字串及文字處理、容器、迭代子(Iterator)、演算法、函式物件和高階程式設計、泛型程式設計、模板超程式設計、預處理超程式設計、併發程式設計、數學相關、糾錯和測試、資料結構、輸入/輸出、跨語言支援、記憶體相關、語法分析、雜項。 有一些庫是跨類別包含的,就是既屬於這個類別又屬於那個類別。 在文字處理部分,conversion/lexcial_cast類用於“用C++”的方法實現數字型別和字串之間的轉換。 主要是替代C標準庫中的 atoi、 itoa之類的函式。當然其中一個最大的好處就是支援泛型了。 format庫提供了對流的“printf-like”功能。printf裡使用%d、%s等等的引數做替換的方法在很多情況下還是非常方便的,STL的iostream則缺乏這樣的功能。format為stream增加了這個功能,並且功能比原始的printf更強。 regex,這個不多說了,正則表示式庫。如果需要做字串分析的人就會理解正則表示式有多麼有用了。 spirit,這個是做LL分析的框架,可以根據EBNF規則對檔案進行分析。(不要告訴我不知道什麼是EBNF)。做編譯器的可能會用到。一般人不太用的到。 tokenizer庫。我以前經常在CSDN上看到有人問怎麼把一個字串按逗號分割成字串陣列。也許有些人很羨慕VB的split函式。現在,boost的tokenizer也有相同的功能了,如果我沒記錯的話,這個tokenizer還支援正則表示式,是不是很爽? array: 提供了常量大小的陣列的一個包裝,喜歡用陣列但是苦惱陣列定位、確定陣列大小等功能的人這下開心了。 dynamic_bitset,動態分配大小的bitset,我們知道STL裡有個bitset,為位運算提供了不少方便。可惜它的大小需要在編譯期指定。現在好了,執行期動態分配大小的bitset來了。 graph。提供了圖的容器和相關演算法。我還沒有在程式中用到過圖,需要用的人可以看看。 multi_array提供了對多維陣列的封裝,應該還是比較有用的。 併發程式設計裡只有一個庫,thread,提供了一個可移植的執行緒庫,不過在Windows平臺上我感覺用處不大。因為它是基於Posix執行緒的,在Windows裡對Posix的支援不是很好。 接下來的 數學和數值 類裡,包含了很多數值處理方面的類庫,數學類我也不太熟,不過這裡有幾個類還是很有用的,比如rational分數類,random隨機數類,等等。 static_assert,提供了編譯器的assert功能。 test庫,一個單元測試框架,非常不錯。 concept_check提供了泛型程式設計時,對泛型量的一點檢查,不是很完善,不過比沒有好。 資料型別類any,一個安全的可以包含不同物件的類。把它作為容器的元素型別,那麼這個容器就可以包含不同型別的元素。比用void *要安全。 compressed_pair,跟STL裡的pair差不多。不過對空元素做了優化。 tuple,呵呵,也許是某些人夢寐以求的東西。可以讓函式返回多個值。 跨語言支援:python,呵呵,好東東啊,可以將C++的類和函式對映給python使用。以下為幾個CSDN上的關於boost.python的中文資料:http://dev.csdn.net/article/19/19828.shtm,http://dev.csdn.net/article/19/19829.shtm,http://dev.csdn.net/article/19/19830.shtm,http://dev.csdn.net/article/19/19831.shtm pool:記憶體池,呵呵,不用害怕頻繁分配釋放記憶體導致記憶體碎片,也不用自己辛辛苦苦自己實現了。 smart_ptr:智慧指標,這下不用擔心記憶體洩漏的問題了吧。不過,C++裡的智慧指標都還不是十全十美的,用的時候小心點了,不要做太技巧性的操作了。 date_time,這個是平臺、類庫無關的實現,如果程式需要跨平臺,可以考慮用這個。 timer,提供了一個計時器,雖然不是Windows裡那種基於訊息的計時器,不過據說可以用來測量語句執行時間。 uitlity裡提供了一個noncopyable類,可以實現“無法複製”的類。很多情況下,我們需要避免一個類被複制,比如代表檔案控制代碼的類,檔案控制代碼如果被兩個例項共享,操作上會有很多問題,而且語義上也說不過去。一般的避免例項複製的方法是把拷貝構造和operator=私有化,現在只要繼承一下這個類就可以了,清晰了很多。 value_initialized:數值初始化,可以保證宣告的物件都被明確的初始化,不過這個真的實用嗎?似乎寫這個比直接寫初始化還累。呵呵,仁者見仁了。 這裡面除了regex、python和test需要編譯出庫才能用,其他的大部分都可以直接原始碼應用,比較方便。其實這些庫使用都不難。最主要的原因是有些庫的使用需要有相關的背景知識,比如超程式設計、STL、泛型程式設計等等。