簡介:boost是一套開源的、高度可移植的C++模板庫。它由C++標準委員發起,且里面很多組件有望成為下一代的C++標準庫,其地位將會與STL一樣。boost庫的英文站點是http://www.boost.org。如果上個頁面不能訪問,可以看http://boost.c-view.org,它是Boost鏡像。boost按功能分為:字符串、容器、算法、迭代器、數據結構、內存管理、多線程、IO等。其中字符串組中的正規表達式可以與POSIX API和Perl語言處理正則表達式的功能相媲美;多線程組件不比java的多線程難用;內存管理組件如果能合理使用可以杜絕內存泄露,而其效率更是與垃圾收集機制不可同日而語。boost的接口(或concept)完全與STL兼容,它在實現上使用了很多STL功能,它本身的組件也可以作為STL容器及算法的元素,所以有使用上,感覺不出是兩個類庫,我們可以當成是一個類庫來使用就行了。只是boost庫是在boost::名字空間里。而我個人最喜歡的一點是,boost的源碼可讀性非常高,非不得已它很少用宏,且不會象某些STL的實現一樣,到處都是下劃線開頭的變量。下載與安裝:當boost成為標準庫后,以下步驟就可以省略了,現在要用boost,還得親自動手。下載:打開boost主頁,點擊Getting StartedàDownloadàdownload?releases from SourceForge,目前最新版本是boost_1_31_0.tar.bz2。然后再在同一個頁面中下載boost-1.31.0-regex-patch-20040503.zip,這是一個補丁。下載之后,X/boost_1_31_0/?index.htm是一個本地的文檔目錄。安裝:大多數boost組件只要直接包含相應頭文件就可以使用[1]。但如果你用到date_time、filesystem、graph、python、regex、signals、test、thread?等組件,則要要編譯成相應的靜態或動態庫。新版本的boost在所有平臺下統一使用jam完成編譯與部署,并且boost還特別特化了一個jam版本bjam。這里以1.31.0版本為例,編譯所有的boost庫:執行boost源碼發布包中的X/boost_1_31_0/tools/build/jam_src下的build.bat,build.bat將自動在系統中選擇一個編譯器,并在bin.xxxx目錄下生成jam,bjam等工具。生成bjam后,配置好命令行編譯環境。并用bjam解釋(boostsrc)/下的jam文件即可編譯并部署。其參數繁多,這里不一一列出,見X/boost_1_31_0/boost_1_31_0/more/getting_started.html#Build_Install。String and text processing:提供了字符串的操作功能,大概分為五個組件。但要注意的是,某些組件效率上可能會有問題,比如字符串與基本類型的相互轉換、格式化等,它們的實現是先把輸入參數轉化為STL的字符流,然后通過字符流轉換為用戶想要的類型輸出(從這一點也可以看出,可以相互轉換的類型只限于字符流可接受的那幾類,字符流使用與可接受類型與io流基本一樣)。
pool:pool是什么?pool是一套非常高效的內存分配方案。為什么要使用pool?使用pool分配內存得到的指針是真正的指針,這意味著,使用者可以對內存有更多的控制(相對于智能指針)。使用pool接口,你可以選擇只運行對象的析構函數或只簡單地對指向對象的指針回收。pool會保證沒有內存泄漏。什么時候使用pool?當有大量小對象分配與回收,而又不想去親自去管理內存時。總之,當你想要高效率的方式去操縱內存時用它會帶來很多好處。pool 提供了四個比較通常的組件:pool、object_pool、singleton_pool、pool_alloc。下面給出前兩個組件的簡單使用樣例:#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,我們可以不用管內存釋放。當然,如果你想自己釋放內存,可以使用void destroy(element_type * p)成員函數。這里element_type是傳進來的模板參數類型。object_pool是使用內存池管理內存,如果頻繁分配和刪除相同類型的對象,object_pool要比直接調用new,delete高出幾個數量級。smart_ptr:STL的std::auto被很多人認為是標準庫的一個缺陷,其實并不是這樣,只是因為std::auto提供的功能不夠豐富擺了,它缺少對引用數和數組的支持,并且,std::auto_ptr在被復制的時候會傳輸所有權。因為缺少引用,所以對象沒有共享所有權,結果就不可以跟其它STL組件(比如容器)很好的配合使用。boost提供的智能指針正好補充了以上功能,比較通用的組件有:scoped_ptr,用于處理單個對象的唯一所有權。scoped_array,與scoped_ptr類似,但是用來處理數組的。shared_ptr,允許共享對象所有權。shared_array,允許共享數組所有權。其它:date_time:一套處理日期與時間的組件,在它之前,我沒有發現有類似的C++庫,每次處理時間日期時,都覺繁瑣且容易出錯,現在用它,就再也不用記浮點數0是哪年哪月哪日了。使用date_time要編譯boost代碼成相應的庫。它的使用比較簡單,下面給出例子:#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]?這里是大多數而不是全部,是因為boost不象STL那樣已經標準化,主流的編譯器要么提供本地版本要么完全支持開源版本。而目前boost的開源版本可能不是每一個編譯器都能完全支持;另一個與STL不同的是,boost某些庫需要編譯成相應的靜態庫與動態庫才可以用。[2]?Boost?Graph Library(boost 圖形庫,一套用于圖形的容器與算法組件)[3]?其實普通數組的指針也是可以看作為一種簡單的iterator???????????