簡(jiǎn)介:boost是一套開(kāi)源的、高度可移植的C++模板庫(kù)。它由C++標(biāo)準(zhǔn)委員發(fā)起,且里面很多組件有望成為下一代的C++標(biāo)準(zhǔn)庫(kù),其地位將會(huì)與STL一樣。boost庫(kù)的英文站點(diǎn)是http://www.boost.org。如果上個(gè)頁(yè)面不能訪問(wèn),可以看http://boost.c-view.org,它是Boost鏡像。boost按功能分為:字符串、容器、算法、迭代器、數(shù)據(jù)結(jié)構(gòu)、內(nèi)存管理、多線程、IO等。其中字符串組中的正規(guī)表達(dá)式可以與POSIX API和Perl語(yǔ)言處理正則表達(dá)式的功能相媲美;多線程組件不比java的多線程難用;內(nèi)存管理組件如果能合理使用可以杜絕內(nèi)存泄露,而其效率更是與垃圾收集機(jī)制不可同日而語(yǔ)。boost的接口(或concept)完全與STL兼容,它在實(shí)現(xiàn)上使用了很多STL功能,它本身的組件也可以作為STL容器及算法的元素,所以有使用上,感覺(jué)不出是兩個(gè)類(lèi)庫(kù),我們可以當(dāng)成是一個(gè)類(lèi)庫(kù)來(lái)使用就行了。只是boost庫(kù)是在boost::名字空間里。而我個(gè)人最喜歡的一點(diǎn)是,boost的源碼可讀性非常高,非不得已它很少用宏,且不會(huì)象某些STL的實(shí)現(xiàn)一樣,到處都是下劃線開(kāi)頭的變量。下載與安裝:當(dāng)boost成為標(biāo)準(zhǔn)庫(kù)后,以下步驟就可以省略了,現(xiàn)在要用boost,還得親自動(dòng)手。下載:打開(kāi)boost主頁(yè),點(diǎn)擊Getting StartedàDownloadàdownload?releases from SourceForge,目前最新版本是boost_1_31_0.tar.bz2。然后再在同一個(gè)頁(yè)面中下載boost-1.31.0-regex-patch-20040503.zip,這是一個(gè)補(bǔ)丁。下載之后,X/boost_1_31_0/?index.htm是一個(gè)本地的文檔目錄。安裝:大多數(shù)boost組件只要直接包含相應(yīng)頭文件就可以使用[1]。但如果你用到date_time、filesystem、graph、python、regex、signals、test、thread?等組件,則要要編譯成相應(yīng)的靜態(tài)或動(dòng)態(tài)庫(kù)。新版本的boost在所有平臺(tái)下統(tǒng)一使用jam完成編譯與部署,并且boost還特別特化了一個(gè)jam版本bjam。這里以1.31.0版本為例,編譯所有的boost庫(kù):執(zhí)行boost源碼發(fā)布包中的X/boost_1_31_0/tools/build/jam_src下的build.bat,build.bat將自動(dòng)在系統(tǒng)中選擇一個(gè)編譯器,并在bin.xxxx目錄下生成jam,bjam等工具。生成bjam后,配置好命令行編譯環(huán)境。并用bjam解釋(boostsrc)/下的jam文件即可編譯并部署。其參數(shù)繁多,這里不一一列出,見(jiàn)X/boost_1_31_0/boost_1_31_0/more/getting_started.html#Build_Install。String and text processing:提供了字符串的操作功能,大概分為五個(gè)組件。但要注意的是,某些組件效率上可能會(huì)有問(wèn)題,比如字符串與基本類(lèi)型的相互轉(zhuǎn)換、格式化等,它們的實(shí)現(xiàn)是先把輸入?yún)?shù)轉(zhuǎn)化為STL的字符流,然后通過(guò)字符流轉(zhuǎn)換為用戶想要的類(lèi)型輸出(從這一點(diǎn)也可以看出,可以相互轉(zhuǎn)換的類(lèi)型只限于字符流可接受的那幾類(lèi),字符流使用與可接受類(lèi)型與io流基本一樣)。
pool:pool是什么?pool是一套非常高效的內(nèi)存分配方案。為什么要使用pool?使用pool分配內(nèi)存得到的指針是真正的指針,這意味著,使用者可以對(duì)內(nèi)存有更多的控制(相對(duì)于智能指針)。使用pool接口,你可以選擇只運(yùn)行對(duì)象的析構(gòu)函數(shù)或只簡(jiǎn)單地對(duì)指向?qū)ο蟮闹羔樆厥铡ool會(huì)保證沒(méi)有內(nèi)存泄漏。什么時(shí)候使用pool?當(dāng)有大量小對(duì)象分配與回收,而又不想去親自去管理內(nèi)存時(shí)。總之,當(dāng)你想要高效率的方式去操縱內(nèi)存時(shí)用它會(huì)帶來(lái)很多好處。pool 提供了四個(gè)比較通常的組件:pool、object_pool、singleton_pool、pool_alloc。下面給出前兩個(gè)組件的簡(jiǎn)單使用樣例:#include?<boost/pool/pool.hpp>void?test_pool_BaseType(){boost::pool<>?p(sizeof(int));for?(int?i?=?0;?i?<?5; ++i){int*?const?t?= (int*)p.malloc();*t?=?i;std::cout?<< *t?<<?'/t';}std::cout?<<?std::endl;}// on function exit, p is destroyed, and all malloc()'ed ints are implicitly freed#include?<boost/pool/object_pool.hpp>class?X {};void?test_pool_object(){boost::object_pool<X>?p;for?(int?i?=?0;?i?<?10000;?++i){X*?const?t?=?p.construct();// to do}}使用pool,我們可以不用管內(nèi)存釋放。當(dāng)然,如果你想自己釋放內(nèi)存,可以使用void destroy(element_type * p)成員函數(shù)。這里element_type是傳進(jìn)來(lái)的模板參數(shù)類(lèi)型。object_pool是使用內(nèi)存池管理內(nèi)存,如果頻繁分配和刪除相同類(lèi)型的對(duì)象,object_pool要比直接調(diào)用new,delete高出幾個(gè)數(shù)量級(jí)。smart_ptr:STL的std::auto被很多人認(rèn)為是標(biāo)準(zhǔn)庫(kù)的一個(gè)缺陷,其實(shí)并不是這樣,只是因?yàn)閟td::auto提供的功能不夠豐富擺了,它缺少對(duì)引用數(shù)和數(shù)組的支持,并且,std::auto_ptr在被復(fù)制的時(shí)候會(huì)傳輸所有權(quán)。因?yàn)槿鄙僖?#xff0c;所以對(duì)象沒(méi)有共享所有權(quán),結(jié)果就不可以跟其它STL組件(比如容器)很好的配合使用。boost提供的智能指針正好補(bǔ)充了以上功能,比較通用的組件有:scoped_ptr,用于處理單個(gè)對(duì)象的唯一所有權(quán)。scoped_array,與scoped_ptr類(lèi)似,但是用來(lái)處理數(shù)組的。shared_ptr,允許共享對(duì)象所有權(quán)。shared_array,允許共享數(shù)組所有權(quán)。其它:date_time:一套處理日期與時(shí)間的組件,在它之前,我沒(méi)有發(fā)現(xiàn)有類(lèi)似的C++庫(kù),每次處理時(shí)間日期時(shí),都覺(jué)繁瑣且容易出錯(cuò),現(xiàn)在用它,就再也不用記浮點(diǎn)數(shù)0是哪年哪月哪日了。使用date_time要編譯boost代碼成相應(yīng)的庫(kù)。它的使用比較簡(jiǎn)單,下面給出例子:#include?<boost/date_time/gregorian/gregorian.hpp>#include?<boost/date_time/posix_time/posix_time.hpp>void?test_data_time(){using?namespace?boost::gregorian;date?today?=?day_clock::local_day();std::string?strToday?=?to_simple_string(today);std::cout?<<?"today is: "?<<?strToday?<<?std::endl;using?namespace?boost::posix_time;date?d(2004,?May,?1);ptime?t1(d,?hours(5)+minutes(4)+seconds(2)+millisec(1));ptime?t2?=?t1?-?hours(5) -?minutes(4)?-?seconds(2) -?millisec(1);time_duration?td?=?t2?-?t1;std::cout?<<?to_simple_string(t2) <<?" - "<<?to_simple_string(t1) <<?" = "<<?to_simple_string(td) <<?std::endl;} [1]?這里是大多數(shù)而不是全部,是因?yàn)閎oost不象STL那樣已經(jīng)標(biāo)準(zhǔn)化,主流的編譯器要么提供本地版本要么完全支持開(kāi)源版本。而目前boost的開(kāi)源版本可能不是每一個(gè)編譯器都能完全支持;另一個(gè)與STL不同的是,boost某些庫(kù)需要編譯成相應(yīng)的靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)才可以用。[2]?Boost?Graph Library(boost 圖形庫(kù),一套用于圖形的容器與算法組件)[3]?其實(shí)普通數(shù)組的指針也是可以看作為一種簡(jiǎn)單的iterator???????????