boost筆記

關於寬字符:

wstring 爲寬字符,寬字符串需要用L修飾wstring str=L"LMKD"; wcout<<str;//wcout輸出寬字符串

1.boost

下載網址:www.boost.org下載boost_1_42_0.7z

需要編譯的庫有:date_time、regex、program_option、test、thread、python。

STLport:同C98,C11一樣,是第三方重新實現的可移植的C++標準庫。在DEBUG模式下單獨使用stlport需要定義宏"__STL_DEBUG";與boost混合使用需要定義"_STLP_DEBUG";與MFC配合使用需要定義"_STLP_USE_MFC"

STLport下載網址:www.stlport.org

2.時間和日期處理

timer 計算流逝時間

process_timer 析構時自動打印處理時間

process_display 進度條顯示

-date days weeks date_period date_iterator time_duration hours minutes seconds millisec ptime(戳) 日期時間處理


3.內存管理

<boost/smart_ptr.hpp>

<boost/pool/pool.h>  依賴boost_system庫

智能指針和內存池是二種不同的內存管理機制,都可以有效的主動釋放內存。

RAII機制-資源獲取即初始化

scoped_ptr 類似與auto_ptr(同一時刻只可能有一個auto_ptr管理對象),不能轉移對象管理權,超出作用域時自動析構

scoped_array

shared_ptr shared_array make_shared()使用了引用計數,share_ptr可以讓不能拷貝的對象實現拷貝或共享。應用於工廠模型作爲返回值,可以有效的管理內存。

enable_share_from_this<T> 使用該類可以實現使用share_ptr<>管理this指針,這樣的類最好構建在堆上,否則返回的share_ptr可能無法釋放內存。

weak_ptr 用於協助shared_ptr工作,從shared_ptr獲得值不會使shared_ptr引用計數增加。


boost的內存池管理包含4個類:(通過內存池,可以構造大量同類型的對象,內存池對象在作用域之外將自動析構,無需smart_ptr管理返回的內存池指針)

a.pool 只能作爲int/double等基本對象內存池(因爲它不能調用類的析構函數),類似與malloc。

b.object_pool 對象內存池,將內存分配和對象構造分開

c.singleton_pool 

d.pool_allocator  內存池分配器,提供內存分配算法,可用於替換標準容器的內存分配算法。

內存池返回的內存塊指針在超出作用域時能自動被釋放到池中。

share_ptr、內置類型、標準容器庫的線程安全:

shared_ptr 本身不是100% 線程安全的。它的引用計數本身是安全且無鎖的(原子操作),但對象的讀寫則不是,因爲shared_ptr類中有兩個數據成員,讀寫操作不能原子化。

根據官方文檔,shared_ptr的線程安全級別和內建類型、標準庫容器、string一樣,即:

a.一個shared_ptr 對象實體可被多個線程同時讀取;

b.兩個shared_ptr 對象實體可以被兩個線程同時寫入,“析構”算寫操作;

c.如果要從多個線程讀寫同一個shared_ptr 對象,那麼需要加鎖。

請注意,以上是shared_ptr 對象本身的線程安全級別,不是它管理的對象的線程安全級別。



4.實用工具

<boost/noncopyable.hpp>

<boost/utility.hpp>

<boost/typeof/typeof.hpp>

<boost/typeof.hpp>

<boost/optional.hpp>

<boost/assign.hpp>  boost::assign

<boost/logic/tribool.hpp>

<boost/exception/all.hpp>

<boost/uuid/uuid.hpp>

<boost/uuid/uuid_generators.hpp>

<boost/uuid/uuid_io.hpp>  boost::uuids

noncopyable  繼承該類,實現一個不可複製的類。原理:該類實現了複製和賦值函數的私有化,從而其子類也是不可複製和賦值的。

BOOST_TYPEOF <=>typeof 通常在模版定義中可以避免冗長的類型定義。編譯時返回數據的類型 BOOST_TYPEOF(2) i=2 <=>int i=2, typeid()

BOOST_AUTO   自動類型:同BOOST_TYPEOF,根據賦值的右操作數,自動推到類型。BOOST_AUTO(Y,make_pair(1,"string"));推導類型爲pair<int,const char*>. BOOST_AUTO(&a,new double[20])推導爲double*的引用。

BOOST_TYPEOF_REGISTER_TYPE() 宏,向boost庫註冊自定義的類。然後該類才能使用自動推導。

optional<int> 三態實現,可以取none值

boost重載了  ’+=‘  ’,‘  ‘()’ 三種操作符。函數list_of(),push_back(),push_front(),insert() 以及.repeat()和range()

assign.hpp 中的 += 賦值  map<int,string> m; m+=make_pare(1,"one"),make_pare(2,"two"),make_pare(3,"three")

assign.hpp 中的關聯容器賦值insert(m)(make_pare(1,"one"))(make_pare(2,"two"))(make_pare(3,"three"))

assign.hpp 中的順序容器賦值list<int>ls; push_front(ls)(1)(2)(3);

assign.hpp 中range迭代器賦值deque<int>d; push_front(d).range(v.begin(),v.begin()+5);

assign.hpp 中的初始化時賦值 list_of,map_list_of/pair_list_of,tuple_list_of.    map<int,string> m=list_of(make_pare(1,"one")),make_pare(2,"two"),make_pare(3,"three")  ;map<int,string> n=map_list_of(1,"1")(2,"2")(3,"3")

assign.hpp 中repeat減少賦值重複輸入 vecttor<int>v=list_of(1).repeat(10,2)(3)(4)(5)  重複10個2

assign.hpp 中repeat_fun通過回調函數來決定重複的值vecttor<int>v=list_of(1).repeat_fun(10,&rand)(3)(4)(5); deque<int> d;push_front(d).rang(v.begin(),v.begin()+5);

assign.hpp 中對容器適配器賦值時需要 to_adapter()轉換 stack<int>stk=(list(1),2,3).to_adapter();

swap,fill_n交換與填充:int a1[10];int a2[10];std::fill_n(a1,10,5);std::fill_n(a2,10,5); boost::swap(a1,a2);  std::copy()

tribool正宗的三態 true false indeterminate   與optional<bool>的效果差不多

singleton_default<T>單體模版

UUID<->GUID 用於唯一標識一個物品,它保存一個16字節的數組。uuid生成器算法有:nil_generator(),sgen(),name_generator(),string_generator(),random_generator()

BOOST_BINARY(01011010)表示一個二進制常量,bitset<5>(BOOST_BINARY(01101))

__FUNCTION__表示當前函數的函數名字符串;BOOST_CURRENT_FUNCTION當前函數的完全定義申明字符串


5.字符串與文本處理

<boost/lexical_cast.hpp>

<boost/format.hpp>

<boost/algorithm/string.hpp>

lexical<Tto>(From)基本數據類型轉化,錯誤的轉化會拋出bad_lexical_cast異常.

num_valid<t>()判斷數據是否能轉換成有效的T類型數據。

format格式化數據類型轉化(支持位置和類型2種):format(%10s  %5d)%"lk"%10;format("%1% + %2% *%2% = %3%")%10 %5 %35;

boost/algorithm/string.hpp字符串算法庫:該算法庫可以處理任何符合boost.range要求的容器。

_copy後綴:表示先產生一份複製,再在複製上進行操作。

_if後綴:表示該表達式可以有一個判斷式入參(函數對象)。

i前綴:表示不區分大小寫。

大小寫轉換:to_upper_copy(),to_lower_copy()形成一份字符串拷貝並將該拷貝轉化成大小或小寫

判斷:ends_with(),starts_with(),contains(),equals(),all(),lexicographical_compare()字符串比較

字符算法的判斷式(即函數對象):is_equal(),is_less(),is_not_greater(),is_space(),is_alnum(),is_cntrl(),is_digit(),is_lower(),...

替代和刪除:replace/erase_first(),replace/erase_last(),replace/erase_nth(),replace/erase_head(),replace/erase_tail().都可以有_copy後綴

修剪:trim_left,trim_right(),trim(),每個都有_copy後綴和_if後綴(_if表示可以有一個判斷式的函數對象) trim_left_copy_if(str,is_digit());

查找:find_first(),find_last(),find_nth(),find_head(),find_tail(),find_all()

拆分與合併:split(),joint()  (_if)

查找和拆分迭代器:find_iterator,split_iterator

分詞(只能以單個字符進行分詞):tokenizer分詞類 默認以所有標號分詞(本身包含一個迭代器,分詞很方便)。char_separator<>分隔符類;escapsed_list_separator有轉義字符時使用的分隔符類;offset_separator偏移分隔符處理以多個指定任意長度循環分詞。


正則:cregex,regex_match()判斷是否完全匹配,regex_search()搜索部分匹配結果;regex_replace()匹配後替換;sregex_iterator匹配迭代器;cregex_token_iterator正則分詞匹配器(提供迭代模式的分詞);

6.正確性測試

<boost/assert.hpp>

assert斷言(在release模式下無效)

BOOST_VERIFY校驗(在release模式下無效)

...

7.容器與數據結構

<boost/array.hpp>

BOOST的10個常見容器:

array,ref_array(代理一個緩存)

dynamic_bitset與c98的bitset相比,其size可以動態增長。BOOST_BINARY()宏

unordered_map/hash_map  unordered_set/hash_set散列容器

bimap 雙向映射map

circular_buffer 循環緩衝區

tuple 最大隻能保存10種類型的數據,make_tuple()

any  相當於java的object基類,可以容納任意類型的一個元素  any a(10); m=any_cast<int>(a);

variant 可變類型變量(與any很像),是對union概念的增強和擴展。variant<int,double,string> vat; vat的類型可以是int,double,string中的任意一種。可以通過get<T>(vat)來取值

multi_array 多爲數組容器,可以改變每一維上的長度,但是維數不能變

property_tree 屬性樹很有用,用來解析xml,json,info,ini等配置文件


8.泛型算法

BOOST_AUTO  typeof

BOOST_FOREACH 一般支持用迭代器來訪問的容器

minmax() 求最大和最小值,返回一個tuple。

minmax_element()求容器的最大最小值

first_min/max_element(), last__min/max_element(),first_min_last_max_element()


9.數學與數字

integer,integer_traits 整數特徵類,定義了類型 uint8_t,int_fast16_t,int_least32_t,uintmax_t等整數類型

rational 有理數,支持分數運算,numerator分子denominator分母;rational(20)->1/20;rational(13,20)->13/20

crc 循環冗餘校驗碼 crc_32_type,crc_16_type

random 隨機數


10.操作系統相關

system系統相關

filessystem 文件系統相關  path路徑和文件處理統一

文件屬性:initial_path(),current_path(),file_size(),last_write_time()

文件處理:create_directory(),rename(),remove(),copy_file(),...

迭代目錄和文件:directory_iterator類,is_directory()

program_options命令行選項


11.函數與回調

result_of  可以自動推導函數的返回值類型   typedef double (*Func)(int d); Func func=sqrt;result_of<Func(double)>::type x=func(5.0);

ref() cref(常引用)  返回對象的引用,但不具有函數調用的功能,如果需要調用函數必須先解引用unwrap_ref。可以包裝對象的引用或者將不可拷貝的對象變爲可以拷貝的。用於函數入參,無需拷貝。 int a=10; BOOST_AUTO(m,ref(a)); m是a的引用

reference_wrapper 引用包裝 int x=10; reference_wrapper<int> rw(x);定義一個x的引用。ref和cref是reference_wrapper的typedef

unwrap_ref() 對任何對象的解包裝將返回該對象的引用。常用於模版編程中,不管是不是包裝對象,都可以對其解包裝。

bind可以適配任意的可調用對象,包括函數指針、函數引用、成員函數指針和函數對象。如func(a1,a1)<=>bind(func,a1,a2)()  bind最多接收9個參數

bind適配成員函數: class demo{init m;int f(int a,int b){;}}  demo a; cout<<bind(&demo::f,a,10,20)()<<endl; cout<<bind(&demo::m,a)();  綁定成員函數和成員變量

一般情況下bind返回的是一個函數對象。

函數類定義struct f {int operator()(int a,int b){return a+b;}} 定義了一個函數類。 f()(2,3)構造並調用該函數對象。

bind使用拷貝的方式存儲綁定對象和參數,這意味着bind表達式的每一個變量都會有一份拷貝,代價較高。可以使用ref和cref解決拷貝代價。

int x=10;cout<<bind(f(),ref(x),cref(x))<<endl;  //cref是常引用

bind自動推導被綁定對象的參數類型,但也有不能自動推到的時候,如printf這種變參的函數,這時需要指定參數的類型。bind<int,int,string>(printf,"%d+%d=%s",_1,_2,_3)(2,5,"7")

存儲bind表達式:BOOST_AUTO(x,bind(sqrt,_1));

function函數對象(用於取代函數指針)。定義function<int(int,int)>fun或者function2<int,int,int)>fun;//定義一個容納返回值爲int,2個入參爲int的函數對象。function可以接收bind的返回值,常用於回調應用。也可以自動適配ref

result_of可以自動推導function的返回值。

function代理普通函數:function<double(double)>func=sqrt; cout<<func(12.5);

function代理成員函數: struct demo_class{int add(int a,int b){return a+b;}  int operator()(int x)const {return x*x;}};

function<int(demo_class&,int,int)>func1; func1=bind(&demo_class::add,_1,_2,_3); dema_class sc;  cout<<func1(sc,10,20);

或 function<int(int,int)>func2; dema_class sc; func2=bind(&demo_class::add,sc,_2,_3);  cout<<func2(10,20);//bind把一個成員函數適配成了一個普通函數。

function代理函數對象:function<int(int)>func3; func3=bind(dema_class(),_1);cout<< func3(12.5);或者 func3=sc或者func3=ref(sc);

signals2信號與槽機制:

連接普通函數:

signal<void()>sig;//創建一個無參無返回值的信號對象;

void slot1(){;}

void slot2(){;}//定義2個槽函數;

sig.connect(組號,&slot1,at_back);//connect的入參是一個函數對象。 默認爲無組。

sig.connect(組合,&slot2,at_back);//連接槽1和槽2

sig();執行槽函數。按組號從小到大被調用,無組的at_front最先被調用,無組的at_back最後被調用

連接函數對象:struct slots{void operation()(){;}} ; sig.connect(slots());

連接function對象:function<double(double)>f=sqrt; signal<double(double)> sig; sig.connect(&f); cout<<sig(12.5);

信號的返回值:信號執行完之後可以默認的返回值是最好一個被調用槽的返回值的optional對象。如果需要其他的返回值方式,則需要一個合併器。

信號和連接使用了鎖機制,可以很好的工作於多線程模式。當信號和槽被調用時,其內部的mutex會自動鎖定。

通過share_ptr實現槽的自動連接管理(當槽失效時,自動斷開連接):

int main(){

 typedef signal<int(int)> signal_t;

 typedef signal_t::slot_type slot_t;

 signal_t sig;

 shared_ptr<slots>p1(new slots());

 shared_ptr<slots>p2(new slots());

 function<int (int)> func=ref(*p1);

 

 sig.connect(slot_t(func).track(p1));

 sig.connect(slot_t(bind(&slots::operator(),p2.get(),_1)).track(p2)); //2種方式等價

 

 p1.reset();

 p2.reset();

 assert(sig.num_slots()==0);

 sig(1);//無函數被執行

}


12.併發編程

7種統一的互斥量:

mutext、try_mutex、timed_mutex、recursive_mutex、recursive_try_mutex、recursive_timed_mutex、share_mutex(讀寫鎖)

使用範圍鎖scoped_loock: mutex mu; mutex::scoped_lock lock(mu); 可以方便的鎖住和釋放鎖

basic_atom<T>提供了對數據類型的原子操作的模版

thread線程類.thread(函數名,形參1,形參2,..); thread類包含了較多的線程管理函數,如:.join(),timed_join(),.detach(),.interrupt(),interrupt_requested,yild(),.sleep()...

boost線程可以啓用和禁止中斷。

thread_group線程組。thread_group tg;tg.creat_thread(...);tg.creat_thread(...)...;tg.join_all();

condition_variable_any 條件變量(與mutex配合使用)

future與packaged_task和promise(用於在線程形參處返回值)類實現主動對象模型。用於耗時算法,或者需要有返回值的線程。

 int fab(int n)

 {if(n==0 || n==1)

  {return 1;}

  reurn fab(n-1)+fab(n-2);

 }

main(){

 packaged_task<int>pt(bind(fab,10));

 unique_future<int>uf=pt.get_future();

 thread(boost::move(pt));

 uf.wait();

 assert(uf.is_ready()&&uf.has_value());

 cout<<uf.get();

}

barrier柵欄類

thread_specific_ptr<> 線程本地存儲類

at_thread_exit()掛載一個函數在線程結束時執行的函數

boost的asio同步和異步io操作

io_service 完成io調度

deadline_timer 可以掛載定時執行的函數

address、socket、acceptor、...等提供了socket的通訊連接方式


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