關于寬字元:
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的通訊連接配接方式
本文轉自 a_liujin 51CTO部落格,原文連結:http://blog.51cto.com/a1liujin/1795059,如需轉載請自行聯系原作者