天天看點

boost庫學習筆記

Boost C++ 庫 是一組基于C++标準的現代庫。 其源碼按 Boost Software License 來釋出,允許任何人自由地使用、修改和分發。 這些庫是平台獨立的,且支援大多數知名和不那麼知名的編譯器。

Boost 社群負責開發和釋出 Boost C++ 庫。 社群由一個很大的C++開發人員群組組成,這些開發人員來自于全球,他們通過網站 以及幾個郵件清單互相協調。 社群的使命是開發和收集高品質的庫,作為C++标準的補充。 那些被證明有價值且對于C++應用開發非常重要的庫,将會有很大機會在某天被納入C++标準中。

Boost 社群在1998年左右出現,當時剛剛釋出了C++标準的第一個版本。 從那時起,社群就不斷地擴大,現在已成為C++标準化工作中的一個重要角色。 雖然 Boost 社群與标準化委員會之間沒有直接的關系,但有部分開發者同時活躍于兩方。 下一個版本的C++标準很大可能在2011年通過,其中将擴充一批庫,這些庫均起源于 Boost 社群。

要增強C++項目的生産力,除了C++标準以外,Boost C++ 庫是一個不錯的選擇。 由于目前版本的C++标準在2003年修訂之後,C++又有了新的發展,是以 Boost C++ 庫提供了許多新的特性。 由于有了 Boost C++ 庫,我們無需等待下一個版本的C++标準,就可以立即享用C++演化中取得的最新進展。

Boost C++ 庫具有良好的聲譽,這基于它們的使用已被證明是非常有價值的。 在面試中詢問關于 Boost C++ 庫的知識是常見的,因為知道這些庫的開發人員通常也清楚C++的最新創新,并且能夠編寫和了解現代的C++代碼。

關于Boost庫怎樣安裝,我這裡不多講,網上資料很多。我這裡重點介紹一下boost的幾個庫,以便在我們以後的開發中提高工作效率。Boost庫檔案采用的.hpp的字尾,而不是分成兩個檔案,也就是”.h+.cpp”,之是以這樣做是有理由的,首先就是與普通的C/C++頭檔案區分,另外一個原因就是使Boost庫不需要預先編譯,直接引用程式員的工程即可編譯連結,友善了庫的使用。最後一個(無奈的)原因就是C++編譯器的限制,許多編譯器尚不支援C++标準提出的模闆的分離編譯模式,而Boost使用了大量的模闆。Boost中90%的庫不需要編譯,但像data_time、regex、test、thread等庫必須編譯成靜态庫或者動态庫。好了,言歸正傳,下面我們來開始學習boost庫吧。

timer:包含三個主件,分别是:計時器類timer、progress_timer和進度條訓示類progress_display。源碼比較簡單,我們可以借鑒源碼處理時間和進度條。在linux作業系統中timer最大隻能計時0.596523h(我們可以改寫源碼,擴大計時時間),但是可以精确到微秒。我們在計時,進度顯示中可能會用到,下面我們給一個progress_display庫的使用示例。

上例中實作了将一個容器的内容拷貝到一個檔案中的進度條顯示的過程。

DateTime:提供了擴充來處理時區的問題,且支援曆法日期和時間的格式化輸入與輸出。Boost.DateTime 隻支援基于格裡曆的曆法日期,這通常不成問題,因為這是最廣泛使用的曆法。 如果你與其它國家的某人有個會議,時間在2010年1月5日,你可以期望無需與對方确認這個日期是否基于格裡曆。

格裡曆是教皇 Gregory XIII 在1582年頒發的。 嚴格來說,Boost.DateTime 支援由1400年至9999年的曆法日期,這意味着它支援1582年以前的日期。 是以,Boost.DateTime 可用于任一曆法日期,隻要該日期在轉換為格裡曆後是在1400年之後。 如果需要更早的年份,就必須使用其它庫來代替。

用于處理曆法日期的類和函數位于名字空間 boost::gregorian 中,定義于 boost/date_time/gregorian/gregorian.hpp。 要建立一個日期,請使用 boost::gregorian::date 類。

shared_ptr:是一個最像指針的“智能指針”,它實作了引用計數型的智能指針,可以自由的拷貝和指派,在任意的地方共享它,當沒有代碼使用它是才删除被包裝的動态配置設定的對象。shared_ptr也可以安全的放在标準容器中,可以像使用指針以用使用shared_ptr。性能和使用指針相差無幾,卻能有效的防止記憶體洩露。

lexical_cast:lexical_cast庫進行“字面量”轉換,類似C中的atoi函數,可以進行字元串、整數/浮點數之間的字面轉換。

format:用于替代C裡面的sprintf,優點是類型安全,不會因為類型和參數不比對而導緻程式崩潰,而且還可以重複使用參數。

string_algo:它是一個非常全面的字元串算法庫,提供了大量的字元串操作函數,如大小寫無關比較、修剪、特定模式的字串查找等,可以在不使用正規表達式的情況下處理大多數字元串相關問題。

tokenizer:tokenizer庫是一個專門用于分詞的字元串處理庫,可以用簡單易用的方法把一個字元串分解成若幹個單詞。它與string_algo庫的分割算法很類似,但是有更多的變化。

Xpressive:是一個先進的、靈活的、功能強大的正規表達式庫,提供了對正規表達式的全面支援,而且比原來的正規表達式庫boost.regex要好的是不需要編譯。

any:是一種通用的資料類型,可以将類型包裝後統一放在容器中,最重要的是它是類型安全的。使用方法: any::type() 傳回包裝的類型 any_cast可用于any到其他類型的轉化

boost::thread類代表一個執行線程(a thread of execution),就像std::fstream類代表一個檔案一樣。預設構造函數建立一個代表目前執行線程的一個執行個體。重載構造函數則有一個函數對象作為參數,該函數對象沒有實參(argument),也無傳回值。重載的構造函數建立一個新的線程,然後調用函數對象。

由于Boost.Threads采用了函數對象,而不是函數指針,是以函數對象攜帶線程要用到的資料是完全可以的。這種方法更加靈活,而且類型安全。如果再和相關的函數庫結合起來,比如Boost.Bind,這種方式可以讓你輕松地将任意多的資料傳遞給新建立的線程。

不能讓多個線程同時通路共享的資源是至關重要的。mutex在同一時間隻能允許一個線程通路共享資源。當一個線程需要通路共享資源時,它必須先“鎖住”mutex,如果任何其他線程已經鎖住了mutex,那麼本操作将會一直被阻塞,直到鎖住了mutex的線程解鎖,這就保證了共享資源,在同一時間,隻有一個線程可以通路。

Boost.Threads支援兩大類型的mutex:簡單mutex和遞歸mutex。

一個線程有3種可能方法來鎖定mutex:

1. 等待并試圖對mutex加鎖,直到沒有其他線程鎖定mutex;

2. 試圖對mutex加鎖,并立即傳回,如果其他線程鎖定了mutex;

3. 等待并試圖對mutex加鎖,直到沒有其他線程鎖定mutex或者直到規定的時間已過。

Boost.Threads允許你挑選最有效率的mutex。為此,Boost.Threads提供了6中類型的mutex,效率由高到低排列:boost::mutex,boost::try_mutex,boost::timed_mutex,boost::recursive_mutex,boost::recursive_try_mutex和boost::recursive_timed_mutex。

Boost.Threads提供Scoped Lock模式,防止死鎖。要建構一個這種類型的鎖,需要傳遞一個mutex引用,構造函數将鎖定mutex,析構函數将解鎖mutex

下面展示了Boost.Bind庫如何不寫函數對象

Boost 社群負責開發和釋出 Boost C++ 庫。 社群由一個很大的C++開發人員群組組成,這些開發人員來自于全球,他們通過網站 ​​www.boost.org​​ 以及幾個郵件清單互相協調。 社群的使命是開發和收集高品質的庫,作為C++标準的補充。 那些被證明有價值且對于C++應用開發非常重要的庫,将會有很大機會在某天被納入C++标準中。

繼續閱讀