

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第1章 Boost程序庫總論1. 使用Boost,將大大增強(qiáng)C+的功能和表現(xiàn)力 第2章 時(shí)間與日期1. timer提供毫秒級(jí)的計(jì)時(shí)精度,內(nèi)部是通過std:clock取時(shí)間的2. progress_timer自動(dòng)打印某生命周期的執(zhí)行時(shí)間3. 原則上程序庫的代碼是不應(yīng)該被用戶修改的4. progress_display可以在控制臺(tái)上顯示程序的執(zhí)行進(jìn)度5. date_time庫能很好的表示日期時(shí)間概念,并能和C的時(shí)間結(jié)構(gòu)tm進(jìn)行友好互轉(zhuǎn)6. date類提供年月日和星期幾的概念。data可通過from_string或from_undelimited_string從字符串解析而來,可通過to_
2、simple_string、to_iso_string、to_extended_iso_string轉(zhuǎn)換為字符串。(精度到天的DateTime)7. day_clock是精度到天的時(shí)鐘8. date_duration表示的是天精度的時(shí)間間隔概念,別名為days,另外還有years、months、weeks9. date_period表示兩個(gè)date之間的日期區(qū)間(精度到天的TimeSpan)10. date_iterator、week_iterator、month_iterator和year_iterator是時(shí)間的迭代器11. boost:greorian:gregorian_calenda
3、r中有實(shí)用靜態(tài)方法:is_leap_year、end_of_month_day12. time_duration表示微妙或納秒級(jí)的時(shí)間概念,幾個(gè)實(shí)用子類:hours、minutes、seconds、millisec/milliseconds、microsec/microseconds、nanosec/nannoseconds13. duration_from_string可以從字符串解析time_duration14. ptime用來表示時(shí)間點(diǎn),相當(dāng)于date和time_duration的組合。可以用time_from_string或from_iso_string解析。(TimeSpan)pt
4、ime now1 = second_clock:local_time(); / 得到本地當(dāng)前秒精度時(shí)間ptime now2 = microsec_clock:universal_time(); / 得到本地當(dāng)前微秒精度時(shí)間15. time_period表示兩個(gè)ptime之間的時(shí)間區(qū)間。(DateTime)16. 時(shí)間迭代器沒有日期迭代器那么多,只有time_iterator一個(gè)17. (boost時(shí)間日期庫亂、破碎、過度設(shè)計(jì)) 第3章 內(nèi)存管理1. scoped_ptr類似auto_ptr,但其一旦獲得對(duì)象的管理權(quán),你就無法再從它那里取回來。該智能指針只希望在本作用域里使
5、用,不希望被轉(zhuǎn)讓。auto_ptr有意設(shè)計(jì)成所有權(quán)的自動(dòng)轉(zhuǎn)讓,scoped_ptr有意設(shè)計(jì)成所有權(quán)的無法轉(zhuǎn)讓。scoped_ptr和auto_ptr均不能作為容器元素。2. scoped_array包裝的是new產(chǎn)生的指針,并調(diào)用的是delete。往往是用來和C代碼保持兼容,一般不推薦使用3. 無論是編譯器還是程序員都很難區(qū)分出new和new分配的空間,錯(cuò)誤的運(yùn)用delete將導(dǎo)致資源異常4. 在C+歷史上曾經(jīng)出現(xiàn)過無數(shù)的引用計(jì)數(shù)型智能指針實(shí)現(xiàn),但沒有一個(gè)比得上boost:shared_ptr,在過去、現(xiàn)在和將來,它都是最好的5. shared_ptr支持的轉(zhuǎn)型有:static_pointer
6、_cast<T>、const_pointer_cast<T>、dynamic_pointer_cast<T>,返回的結(jié)果是shared_ptr,并能保證這些指針的引用計(jì)數(shù)正確6. 用shared_ptr可以消除代碼中顯示的delete,用make_shared、allocate_shared可以消除代碼中顯示的new7. 橋接模式(bridge)是一種結(jié)構(gòu)型設(shè)計(jì)模式,它把類的具體實(shí)現(xiàn)細(xì)節(jié)對(duì)用戶隱藏起來,以達(dá)到類之間的最小耦合關(guān)系。在具體編程實(shí)踐中橋接模式也被稱為pimpl或者h(yuǎn)andle/body慣用法,它可以將頭文件的依賴關(guān)系降到最小,減少編譯時(shí)間,而且可
7、以不使用虛函數(shù)實(shí)現(xiàn)多態(tài)8. get_deleter(shared_ptr<T> const& p)可以獲得刪除器。shared_ptr的刪除器在處理某些特殊資源時(shí)非常有用,它使得用戶可以定制、擴(kuò)展shared_ptr的行為,使其不僅僅能夠管理內(nèi)存資源,而是稱為一個(gè)“萬能”的資源管理工具9. 對(duì)應(yīng)shared_ptr,也有一個(gè)shared_array,scoped_array和shared_array均不對(duì)operator做下標(biāo)檢測10. weak_ptr是為配合shared_ptr而引入的,更像是shared_ptr的一個(gè)助手而不是智能指針,其沒有重載operator*和-
8、>,不具有普通指針的行為。它最大的作用在于協(xié)助shared_ptr工作,像旁觀者那樣觀測資源的使用情況11. weak_ptr被設(shè)計(jì)為與shared_ptr共同工作,可以從一個(gè)shared_ptr或者另一個(gè)weak_ptr對(duì)象構(gòu)造,獲得資源的觀測權(quán)。但weak_ptr沒有共享資源,它的構(gòu)造不會(huì)引起指針引用計(jì)數(shù)的增加。同樣,在weak_ptr析構(gòu)時(shí)也不會(huì)導(dǎo)致引用計(jì)數(shù)的減少,它只是一個(gè)靜靜的觀察者12. 獲得this指針的shared_ptr,使對(duì)象自己能夠產(chǎn)生shared_ptr管理自己:class T : public enable_shared_from_this<T>,
9、then shared_ptr shared_from_this().13. intrusive_ptr是一個(gè)侵入式的引用計(jì)數(shù)型指針。當(dāng)對(duì)內(nèi)存占用的要求非常嚴(yán)格,或現(xiàn)存代碼已經(jīng)有了引用計(jì)數(shù)機(jī)制時(shí)可以考慮。一般情況不推薦使用。14. pool為固定塊大小的類似malloc的原生內(nèi)存分配器,支持?jǐn)?shù)組式分配,一般情況下不必對(duì)分配的內(nèi)存調(diào)用free()。只分配原生內(nèi)存,不調(diào)用構(gòu)造函數(shù),回收不調(diào)用析構(gòu)函數(shù),最好不要用于對(duì)象。15. singleton_pool和pool接口完全一致,但為單件線程安全,同樣要求編譯期指定要分配的原生內(nèi)存塊大小16. object_pool為特定類型的對(duì)象池,不支持?jǐn)?shù)組式分
10、配,支持對(duì)象分配和對(duì)象原生內(nèi)存分配17. pool_alloc和fast_pool_allocator是boost提供的兩個(gè)STL分配器。除非有特別需求,我們應(yīng)該總使用STL實(shí)現(xiàn)自帶的內(nèi)存分配器。使用定制的分配器需要經(jīng)過仔細(xì)的測試,以保證它與容器可以共同工作。18. 內(nèi)存管理是C+程序開發(fā)中永恒的話題,因?yàn)闆]有GC,小心謹(jǐn)慎的管理內(nèi)存等系統(tǒng)資源是每一個(gè)C+程序員都必須面對(duì)的問題 第4章 實(shí)用工具1. private繼承自noncopyable可以編譯時(shí)禁止對(duì)象拷貝語法2. C+靜態(tài)強(qiáng)類型的優(yōu)點(diǎn)有時(shí)候反而是阻礙程序員生產(chǎn)力的“缺陷”3. typeof庫使用宏模擬了C+0X中的typed
11、ef和auto關(guān)鍵字,可以減輕書寫繁瑣的變量類型聲明工作,簡化代碼。對(duì)于用戶自定義類型需要手工用宏注冊。(語法并沒那么好看,不準(zhǔn)備使用)4. optional<T>使用“容器”語義,包裝了“可能產(chǎn)生無效值”的對(duì)象,實(shí)現(xiàn)了“未初始化”的概念(Nullable<T>)5. optional<T> make_optional(bool condition, T const& v)用來簡單構(gòu)建optional對(duì)象,但不能處理optional<T&>的情況。(此乃雞肋) 6. optional<string> str(
12、in_place("string就地創(chuàng)建"),而不需拷貝臨時(shí)對(duì)象,避免大對(duì)象的拷貝開銷7. 用于初始化的assign庫(僅限于STL標(biāo)準(zhǔn)容器,通過重載“+=”和“,”運(yùn)算符實(shí)現(xiàn)):#include <boost/assign.hpp>using namespace boost;vector<int> v; v += 1,2,3,4,5,6*6;set<string> s; s += "cpp", "java"map<int, string> m; m += make_pair(1, &q
13、uot;one"), make_pair(2, "2");8. assign還支持insert()、push_front()、push_back()(通過重載“()”實(shí)現(xiàn)):vector<int> v; push_back(v)(1)(2)(3)(4)(5);list<string> l; push_front(l)("cpp")("java");set<double> s; insert(s)(3.14)(0.618)(1.732);map<int, string> m; i
14、nsert(m)(1, "one")(2, "two");9. assign也可以將“()”和“,”混用:vector<int> v;push_back(v), 1, 2, 3, 4, 5;push_back(v)(6), 7, 64 / 8, (9), 10;deque<string> d;push_front(d)() = "cpp", "java"10. assign list_of()函數(shù):vector<int> v = list_of(1)(2)(3);deque<
15、;string> d = (list_of("cpp")("java");set<int> s = (list_of(10), 20, 30, 40);map<int, string> m = list_of(make_pair(1, "one") (make_pair(2, "two")如果需要將括號(hào)與逗號(hào)混合使用,則要求最外側(cè)加一個(gè)括號(hào),否則編譯器無法推導(dǎo)11. assign map_list_of/pair_list_of函數(shù):map<int, int> m1 = m
16、ap_list_of(1, 2)(3, 4)(5, 6)map<int, string> m2 = map_list_of(1, "one")(2, "two")12. assign tuple_list_of用戶初始化元素類型為tuple的容器13. assign repeat()可以重復(fù)生成值,repeat_fun()可以重復(fù)無參函數(shù)或仿函數(shù),range()則可以從序列中取出部分或全部:vector<int> v = list_of(1).repeat(3, 2)(3)(4)(5); / v = 1,2,2,2,3,4,5mu
17、ltiset<int> ms; insert(ms).repeat_fun(5, &ran).repeat(2, 1), 10; / ms = x,x,x,x,x,1,1,10deque<int> d; push_front(d).range(v.begin(), v.begin() + 5); / d=3,2,2,2,114. assign支持8個(gè)STL標(biāo)準(zhǔn)容器(vector、string、deque、list、set、multiset、map、multimap),對(duì)容器適配器(stack、queue、priority_queue)則需要通過to_adapte
18、r():stack<int> stk = (list_of(1), 2, 3).to_adapter();queue<string> q = (list_of("cpp")("java").repeat(2, "C#").to_adapter();priority_queue<double> pq = (list_of(1.414), 1.732).to_adapter();15. assign也支持部分不在STL中的非標(biāo)準(zhǔn)容器slist、hash_map、hash_set,因?yàn)槠浞蠘?biāo)準(zhǔn)容器定義,
19、同時(shí)也支持大部分boost容器:array、circular_buffer、unordered等16. assign list_of()嵌套:vector<vector<int>> v = list_of(list_of(1)(2) list_of(list_of(3)(4);v += list_of(5)(6), list_of(7)(8);17. assign ref_list_of()、cref_list_of()、ptr_push_back()、ptr_list_of()還支持以引用或指針來構(gòu)造初始化:int a = 1, b = 2, c = 3;vector
20、<int> v = ref_list_of<3>(a)(b)(c);18. boost:swap是對(duì)std:swap的增強(qiáng),并且擴(kuò)充了對(duì)數(shù)組的支持:int a110; std:fill_n(a1, 10, 5);int a210; std:file_n(a2, 10, 20);boost:swap(a1, a2);19. 單件boost:details:pool:singleton_default<T>在main之前進(jìn)行構(gòu)造,支持繼承或非繼承形式(最恨main之前的事情了)20. 單件boost:serialization:singleton<T>
21、;在main之前進(jìn)行構(gòu)造,支持繼承或非繼承形式。繼承方式更徹底一些,非繼承方式不影響原有代碼21. boost:tribool三態(tài)bool,indeterminate(tribool)可判斷一個(gè)三態(tài)bool是否處于不確定狀態(tài)22. 選擇optional<bool>還是tribool:如果返回值可能是無效的,那么就是optional<bool>,如果返回值總是確定的,但可能無法確定其意義,那么就用tribool(最多自己隨手定義個(gè)enum狀態(tài),為了這點(diǎn)需求需要記住這一堆名稱和細(xì)節(jié)!)23. using namespace std:rel_ops; 則一旦為類定義了oper
22、ator=和<,則自動(dòng)具有!=、>、<=和>=的功能。boost operators庫提供了對(duì)該功能的增強(qiáng),使用時(shí)只需繼承自這些類并提供指定的operator重載即可獲得附送的重載:1. equality_comparable<T>:要求提供=,可自動(dòng)實(shí)現(xiàn)!=,相等語義2. less_than_comparable<T>:要求提供<,可自動(dòng)實(shí)現(xiàn)>、<=、>=3. addable<T>:要求提供+=,可自動(dòng)實(shí)現(xiàn)+4. subtractable<T>:要求提供-=,可自動(dòng)實(shí)現(xiàn)-5. incrementa
23、ble<T>:要求提供前置+,可自動(dòng)實(shí)現(xiàn)后置+6. decrementable<T>:要求提供前置-,可自動(dòng)實(shí)現(xiàn)后置-7. equivalent<T>:要求提供<,可自動(dòng)實(shí)現(xiàn)=,等價(jià)語義8. totally_ordered:全序概念,組合了equality_comparable和less_than_comparable9. additive:可加減概念,組合了addable和subtractable10. multiplicative:可乘除概念,組合了multipliable和diviable11. arithmetic:算術(shù)運(yùn)算概念,組合了addi
24、tive和multiplicative12. unit_stoppable:可步進(jìn)概念,組合了incrementable和decrementable13. public dereferenceable<T, P, (B)>:解引用操作符,要求提供operator*,可自動(dòng)實(shí)現(xiàn)operator->。P為operator->返回類型,一般為T*14. public indexable<T, I, R, (B)>:下標(biāo)操作符,I為下標(biāo)類型,要求能夠與類型T做加法操作,通常為int;R是operator的返回值類型,通常是一個(gè)類型的引用。要求提供operator+(
25、T, I),將自動(dòng)實(shí)現(xiàn)operator1. 如果只關(guān)心類的等價(jià)語義,那么就用equivalent,如果想要精確的比較兩個(gè)對(duì)象的值,就是用equality_comprable。相等equivalent基于"="實(shí)現(xiàn),而equality_comprable基于"<"的"!(x<y)&&!(x>y)"實(shí)現(xiàn)。2. 應(yīng)該總對(duì)異常類是用虛繼承3. struct my_exception : virtual std:exception, / 兼容C+標(biāo)準(zhǔn)異常 virtual bo
26、ost:exception;typedef boost:error_info<struct tag_err_no, int> err_no;typedef boost:error_info<struct tag_err_str, string> err_str;#include <boost/exception/all.hpp>try throw my_exception() << err_no(10); catch(my_exception& e) cout << *get_error_i
27、nfo<err_no>(e) << endl; cout << e.what() << endl; e << err_str("向異常追加信息,還可再次拋出"); cout << *get_error_info<err_str>(e) << endl;4. 從exception派生的異常定義非常簡單,沒有實(shí)現(xiàn)代碼,可以很容易建立起一個(gè)適合自己程序的、驚喜完整的異常類體系。只
28、要都是用虛繼承,類體系可以任意復(fù)雜。5. boost庫預(yù)定義的異常類型:typedef error_info<struct errinfo_api_function_, char const*> errinfo_api_function;typedef error_info<struct errinfo_at_line_, int> errinfo_at_line;typedef error_info<struct errinfo_file_handle_, weak_ptr<FILE>> errinfo_file_handle;typedef
29、error_info<struct errinfo_file_name_, std:string> errinfo_file_name;typedef error_info<struct errinfo_file_open_mode_, std:string> errinfo_file_open_mode;typedef error_info<struct errinfo_type_info_name_, std:string> error_info_type_info_name;typedef error_info<struct throw_func
30、tion_, char const*> throw_function;typedef error_info<struct throw_file_, char const*> throw_file;typedef error_info<struct throw_line_, ine> throw_line;6. enable_error_info<T>(T& e),可以將已將存在的任意類型包裝為boost異常類型7. throw_exception(任意異常類型),可以自動(dòng)將任意異常類型包裝為boost異常,還能保證線程安全8. diagnost
31、ic_information(e)可以得到任意boost異常的字符串內(nèi)容描述;在catch塊中調(diào)用current_exception_diagnostic_information(),則不用傳參數(shù)e。(何必呢,為少寫一兩個(gè)字母反而要記住一個(gè)更長的名字)9. catch塊內(nèi)的異常轉(zhuǎn)型用current_exception_cast<T>()10. catch塊內(nèi)調(diào)current_exception()得到當(dāng)前異常指針的exception_ptr是線程安全的,rethrow_exception可以重新拋出異常11. UUID, Universally Unique Identifier,
32、 128bit(16 Byte),不需要中央認(rèn)證機(jī)構(gòu)就可以創(chuàng)建全球唯一的標(biāo)識(shí)符。別名GUID12. 不是所有的警告都可以忽略的,有的警告預(yù)示著可能潛在的錯(cuò)誤13. BOOST_BINARY(111 00 1),可以實(shí)現(xiàn)編譯器的二進(jìn)制定義,但不能超過8bit 第5章 字符串與文本處理1. lexical_cast<T>(X),可以實(shí)現(xiàn)字符串和數(shù)值類型之間的轉(zhuǎn)換,但不支持高級(jí)格式控制。轉(zhuǎn)換失敗將拋出bad_lexical_cast異常。lexical_cast底層用C+流實(shí)現(xiàn),要求目標(biāo)類型支持operator<<、operator>>、無參構(gòu)造函數(shù)和拷
33、貝構(gòu)造函數(shù)2. cout << format("%s:%d+%d=%dn") %"sum" %1 %2 %(1+2); / sum:1+2=3format fmt("(%1% + %2%) * %2% = %3%n");fmt %2 %5;fmt %(2+5)*5);cout << fmt.str(); / (2 + 5) * 5 = 353. format在提供的參數(shù)過多或過少的情況下operator<<或str()都會(huì)拋出異常4. format完
34、全支持printf的格式化選項(xiàng)方式,同時(shí)還增加了新的方式:1. %|spec|%:與printf格式選項(xiàng)功能相同,但兩邊增加了豎線分隔,可以更好的區(qū)分格式化選項(xiàng)有普通字符2. %N%:標(biāo)記第N個(gè)參數(shù),相當(dāng)于占位符,不帶任何其他的格式化選項(xiàng)1. format因?yàn)樽隽撕芏喟踩珯z查工作,會(huì)比printf慢至少2-5倍2. format相關(guān)的高級(jí)功能:1. basic_format& bind_arg(int argN, const T& val) 把格式化字符串第argN位置的輸入?yún)?shù)固定為val,即使調(diào)用clear()也保持不變,除非調(diào)用clear_bind()或clea
35、r_binds()2. basic_format& clear_bind(int argN) 取消格式化字符串第argN位置的參數(shù)綁定3. basic_format& clear_binds()4. basic_format& modify_item(int itemN, T manipulator) 設(shè)置格式化字符串第itemN位置的格式化選項(xiàng),manipulator是一個(gè)boost:io:group()返回的對(duì)象5. boost:io:group(T1 a1, ., Var const& var) 是一個(gè)最多支持10個(gè)參數(shù)的模板函數(shù),可以
36、設(shè)置IO流操縱器以指定格式或輸入?yún)?shù)值1. string_algo庫包括:1. to_upper, to_lower, starts_with, ends_with, contains, equals, lexicographical_compare2. all(檢測字符串中的所有元素是否滿足給定的判斷式)3. 仿函數(shù)is_equal, is_less, is_not_greater4. is_space, is_alnum, is_alpha, is_cntrl, is_digit(十進(jìn)制數(shù)字), is_graph, is_lower, is_print, is_punct(是否是標(biāo)點(diǎn)符號(hào))
37、, is_upper, is_xdigit(字符是否為十六進(jìn)制數(shù)字), is_any_of(字符是否是參數(shù)字符序列中的任意數(shù)字), if_from_range(字符是否位于指定的區(qū)間c1,c2內(nèi))5. trim_left、trim_right、trim6. find_first、find_last、find_nth、find_head、find_tail7. replace/erase_first、replace/erase_last、replace/erase_nth、replace/erase_all、replace/erase_head、replace/erase_tail8. find
38、_all、split、find_iterator、split_iterator、join1. tokenizer類似string_algo:split,為更專業(yè)的token劃分工具。tokenizer庫提供預(yù)定義好的四個(gè)分詞對(duì)象:1. char_delimiter_separator:使用標(biāo)點(diǎn)符號(hào)分詞,是默認(rèn)的分詞函數(shù)對(duì)象。已被聲明廢棄2. char_separator:支持一個(gè)字符集合作為分隔符,默認(rèn)行為與char_delimiter_separator類似3. escaped_list_separator:用于CSV格式的分詞4. offset_separator:使用偏移量來分詞2. x
39、pressive,類似boost.regex的正則表達(dá)式解析器,同時(shí)還是一個(gè)類似于boost.spirit的語法分析器,并且將這兩種完全不相交的文本處理方式完美的融合在了一起3. xpressive使用regex_token_iterator<>提供了強(qiáng)大的分詞迭代器第6章 正確性測試1. 測試對(duì)于軟件開發(fā)是非常重要的,程序員尤其是C+程序員更應(yīng)該認(rèn)識(shí)到這一點(diǎn)2. BOOST_ASSERT宏類似于assert宏,提供運(yùn)行時(shí)斷言,但功能有所增強(qiáng)。可以通過BOOST_DISABLE_ASSERTS來關(guān)閉。當(dāng)定義BOOST_ENABLE_ASSERT_HANDLER后,斷言觸發(fā)時(shí)將會(huì)調(diào)用
40、boost:assertion_failed回調(diào)3. BOOST_VERIFY類似BOOST_ASSERT,但斷言表達(dá)式一定會(huì)被求值,Release下仍然會(huì)失效(放棄BOOST_VERIFY)4. BOOST_STATIC_ASSERT,編譯時(shí)斷言。可以出現(xiàn)在程序的任何位置,而不一定只在函數(shù)域內(nèi)5. 測試用例是一個(gè)包含多個(gè)測試斷言的函數(shù),它是可以被獨(dú)立執(zhí)行測試的最小單元,各個(gè)測試用例之間是無關(guān)的,發(fā)生的錯(cuò)誤不會(huì)影響到其他測試用例 第7章 容器與數(shù)據(jù)結(jié)構(gòu)1. array是的C原生數(shù)組的STL接口包裝2. std:vector<bool>是vector對(duì)bool的特化,內(nèi)部保
41、存的實(shí)際為bit,支持動(dòng)態(tài)長度。std:bitset大小固定,但支持更多的位運(yùn)算3. boost.dynamic_bitset類似std:vector<bool>可以動(dòng)態(tài)長度,同時(shí)提供了豐富的位運(yùn)算。dynamic_bitset還支持集合相關(guān)操作4. 哈希容器:boost:unordered_map、boost:unordered_set、boost:unordered_multimap、boost:unordered_multiset5. boost:bimap,雙向映射容器,提供left、right兩個(gè)試圖。支持的集合類型有:set_of、multiset_of、unorder
42、ed_set_of、unordered_multiset_of、list_of、vector_of、unconstrained_set_of6. bimap的左右視圖還可以通過標(biāo)簽訪問:bimap<tagged<int, struct id>, tagged<string, struct name>> bm;bm.by<id>().insert(make_pair(1, "C+"); / 相當(dāng)于使用左視圖bm.by<name>().insert(make_pair("java", 2); / 相
43、當(dāng)于使用右視圖7. circular_buffer<T>為大小固定的循環(huán)緩沖區(qū),circular_buffer_space_optimized<T>類似circular_buffer<T>但只在確實(shí)需要時(shí)才分配內(nèi)存,并且當(dāng)容器內(nèi)元素減少時(shí)自動(dòng)釋放內(nèi)存8. tuple是固定數(shù)目非同質(zhì)元素容器。tuple是std:pair的泛化,可以從函數(shù)返回任意數(shù)量的值,也可以代替struct組合數(shù)據(jù)9. 和std:make_pair對(duì)應(yīng),也有個(gè)make_tuple用來簡化tuple的創(chuàng)建10. tie()可以生成一個(gè)元素類型全是引用的tuple,相當(dāng)于make_tuple(
44、ref(a), ref(b), .),可以用于左值,通常用來接收返回tuple或pair函數(shù)的返回值,可以看成是對(duì)tuple的解包11. element<N, T>:type可以給出T中第N個(gè)元素的類型,length<T>:value可以給出T的元素?cái)?shù)量12. any能夠容納任意類型,可以用any_cast<T>(a)類型安全的取出any中的值(讓人聯(lián)想到Ogre:Any)13. any可以持有原始指針,但這樣的用法很不安全,會(huì)導(dǎo)致內(nèi)存泄露。應(yīng)該使用智能指針包裝原始指針,這樣在any析構(gòu)時(shí)智能指針會(huì)自動(dòng)的調(diào)用delete,從而安全的釋放資源14. 如果希望一
45、種數(shù)據(jù)結(jié)構(gòu)具有tuple那樣的容納任意類型的能力,又可以在運(yùn)行時(shí)動(dòng)態(tài)變化大小,那么就可以用any作為元素類型搭配容器15. variant是對(duì)C/C+中union概念的增強(qiáng)和擴(kuò)展。varinat是有界類型,元素類型范圍由用戶指定,any是無界類型,可以容納任意類型16. multi_array<int, 3>,相當(dāng)于int maXYZ的多維數(shù)組。multi_array沒有異常機(jī)制來處理錯(cuò)誤,保證數(shù)組范圍不越界是庫用戶自己的責(zé)任17. property_tree是一個(gè)保存了多個(gè)屬性值的樹形數(shù)據(jù)結(jié)構(gòu),可以用類似路徑的簡單方式訪問任意節(jié)點(diǎn)的樹形,而且每個(gè)節(jié)點(diǎn)都可以用類似STL的風(fēng)格遍歷子
46、節(jié)點(diǎn)。property_tree特別適合于應(yīng)用程序的配置數(shù)據(jù)處理,可以解析xml、ini、json和info四種格式的文本數(shù)據(jù),使用它能減輕自己開發(fā)配置管理的工作。 第8章 算法1. boost foreach庫提供BOOST_FOREACH和BOOST_REVERSE_FOREACH來實(shí)現(xiàn)對(duì)容器的正向和反向遍歷2. minmax(a, b)可在一次處理中同時(shí)獲得最大最小值,執(zhí)行效率上有很大提高(有提前優(yōu)化的感覺了)3. minmax_element算法族可以得到迭代器區(qū)間內(nèi)的最大最小值 第9章 數(shù)學(xué)與數(shù)字1. 從純數(shù)學(xué)的角度看,程序也不過是一個(gè)非常大的整數(shù)而已2. int
47、eger_traits : public std:numeric_limits,提供各種整數(shù)類型的編譯期最大最小值3. <boost/cstdint.hpp>基于C99標(biāo)準(zhǔn)中的<stdint.h>,定義了各種標(biāo)準(zhǔn)的整數(shù)4. <boost/integer.hpp>與<boost/cstdint.hpp>功能類似,用模板類而不是typedef提供各種整數(shù)類型定義5. boost.rational表示有理數(shù)(分?jǐn)?shù)),rational_cast<R>可以將有理數(shù)轉(zhuǎn)換為普通數(shù)字6. 最大公約數(shù)gcd();最小公倍數(shù)lcm()7. crc_opt
48、imal以字節(jié)為單位的快速CRC計(jì)算,實(shí)際常用的是crc_32_type的預(yù)定義算法8. boost random庫提供了26個(gè)偽隨機(jī)數(shù)發(fā)生器9. random庫提供的隨機(jī)數(shù)分布器:1. uniform_smallint:在小整數(shù)域內(nèi)的均勻分布2. uniform_int:在整數(shù)域上的均勻分布3. uniform_01:在區(qū)間0,1上的實(shí)數(shù)連續(xù)均勻分布4. uniform_real:在區(qū)間min,max上的實(shí)數(shù)連續(xù)均勻分布5. bernoulli_distribution:伯努利分布6. binomial_distribution:二項(xiàng)分布7. cauchy_distribution:柯西(洛
49、倫茲)分布8. gamma_distribution:伽馬分布9. poisson_distribution:泊松分布10. geometric_distribution:幾何分布11. triangle_distribution:三角分布12. exponential_distribution:指數(shù)分布13. normal_distribution:正態(tài)分布14. lognormal_distribution:對(duì)數(shù)正態(tài)分布15. uniform_on_sphere:球面均勻分布1. variate_generator<Engine, Distribution>變量發(fā)生器,用于組合
50、隨機(jī)數(shù)發(fā)生器和分布器2. 真隨機(jī)數(shù)無法用純軟件產(chǎn)生,因?yàn)橛?jì)算機(jī)本身是個(gè)確定的有限狀態(tài)自動(dòng)機(jī) 第10章 操作系統(tǒng)相關(guān)1. io_state_savers庫可以簡化恢復(fù)流狀態(tài)的工作,它能夠保存流的當(dāng)前狀態(tài),自動(dòng)恢復(fù)流的狀態(tài)或者由程序員控制恢復(fù)的時(shí)機(jī)1. 基本的標(biāo)準(zhǔn)屬性保存器:ios_flags_saver、ios_width_saver2. 增強(qiáng)的標(biāo)準(zhǔn)屬性保存器:ios_iostate_saver、ios_rdbuf_saver3. 自定義的屬性保存器:ios_iword_saver、ios_pword_saver4. 組合的屬性保存器:ios_all_saver1. system庫使用
51、輕量級(jí)的對(duì)象封裝了操作系統(tǒng)底層的錯(cuò)誤代碼和錯(cuò)誤信息,使調(diào)用操作系統(tǒng)功能的程序可以被很容易的移植到其他操作系統(tǒng)filesystem庫中的path和wpath提供了文件路徑相關(guān)的很多實(shí)用操作(類似Path)2. portable_posix_name()和windows_name()分別檢測文教案名字符串是否符合POSIX和Windows規(guī)范。Windows的文件名可以字符范圍比POSIX的大。3. native()判斷文件名是否符合本地文件系統(tǒng)命名規(guī)則4. 為了程序的健壯性,應(yīng)總使用try-catch來保護(hù)文件訪問代碼5. directory_iterator和wdirectory_iterat
52、or提供了迭代一個(gè)目錄下所有文件的功能6. recursive_directory_iterator和wrecursive_directory_iterator提供遞歸遍歷目錄功能7. program_options庫提供了強(qiáng)大的命令行參數(shù)處理功能,它不僅能夠分析命令行,也能夠從配置文件甚至環(huán)境變量中獲取參數(shù),實(shí)現(xiàn)了非常完善的程序配置選項(xiàng)處理功能8. #include <boost/program_options.hpp>using namespace boost:program_options;int main(int argc, char* argv) option
53、s_description opts("demo options"); opts.add_options() ("help", "just a help info") ("filename", value<string>(), "to find a file"); variables_map vm; store(parse_command_line(argc, arg
54、v, opts), vm); / 解析完成,實(shí)現(xiàn)選項(xiàng)處理邏輯 if(vm.count("help") cout << opts << endl; return 0; if(vm.count("filename") cout << "find" << vm"filename".as<string>()
55、 << endl; if(vm.size() = 0) cout << "no options" << endl; 9. program_options庫的解析程序選項(xiàng)功能由三個(gè)基本組件構(gòu)成,分別是選項(xiàng)描述器、分析器和存儲(chǔ)器。選項(xiàng)描述其定義選項(xiàng)及選項(xiàng)的值,分析器依據(jù)選項(xiàng)描述器的定義解析命令行或數(shù)據(jù)文件,存儲(chǔ)器則把分析器的結(jié)果保存起來以供使用 第11章 函數(shù)與回調(diào)1. result_of<Func(T1, T2)>:type確定一個(gè)調(diào)用表達(dá)式的返回類型,是實(shí)現(xiàn)泛型庫的底層
56、基本構(gòu)件2. ref()和cref()可以包裝對(duì)象的引用,在傳遞參數(shù)時(shí)消除對(duì)象拷貝的代價(jià),或者將不可拷貝的對(duì)象變?yōu)榭梢钥截?. bind是對(duì)標(biāo)準(zhǔn)庫bind1st、bind2nd的泛化和增強(qiáng),可以適配任意的可調(diào)用對(duì)象。4. bind第一個(gè)參數(shù)必須是一個(gè)可調(diào)用對(duì)象,包括函數(shù)、函數(shù)指針、函數(shù)對(duì)象和成員函數(shù)指針5. bind也可以綁定到public成員變量,用法與綁定成員函數(shù)類似,只需要把成員變量名像一個(gè)成員函數(shù)一樣去使用6. bind綁定到仿函數(shù)時(shí),要求仿函數(shù)typedef xxx result_type;否則就只能用bind<xxx>(functor()的形式7. bind重載了比較操
57、作符和邏輯非操作符,可以把多個(gè)bind綁定式組合起來,形成一個(gè)復(fù)雜的邏輯表達(dá)式,配合標(biāo)準(zhǔn)庫算法可以實(shí)現(xiàn)語法簡單但語義復(fù)雜的操作:using namespace boost:assign;typedef rational<int> ri; / 有理數(shù)類vector<ri> v = list_of(ri(1, 2) (ri(3, 4) (ri(5, 6); / 初始化/ 刪除所有分子為1的有理數(shù)remove_if(v.begin(), b.end(), bind(&ri:numerator, _1) = 1);assert(v0.numerator() =
58、 3); / 有理數(shù)1/2被刪除/ 使用find_if算法查找分子是1的有理數(shù),不不存在assert(find_if(v.begin(), b.end(), bind(&ri:numerator, _1) = 1) = v.end();/ 查找分子大于3且分母小于8的有理數(shù)BOOST_AUTO(pos, find_if(v.begin(), b.end(), bind(&ri:numerator, _1) > 3 && bind(&ri:denominator, _1) < 8);cout << *pos << end
59、l; / 輸出5/68. 變長參數(shù)函數(shù)、_stdcall、_fastcall、extern "C"等函數(shù)bind時(shí)需要顯式指定返回值類型才行9. function是一個(gè)函數(shù)對(duì)象的“容器”,概念上像是C/C+中的函數(shù)指針類型的泛化,是一種“智能函數(shù)指針”10. 調(diào)用空的function將拋出bad_function_call異常,最好在使用前通過empty()來測試有效性11. 與原始的函數(shù)指針相比,function對(duì)象的體積要稍微大一點(diǎn)(3個(gè)指針的大小),速度要稍微慢一點(diǎn)(10%左右的性能差距),但這與它帶給程序的巨大好處相比是無足輕重的12. signals2基于boos
60、t中的另一個(gè)庫signals,實(shí)現(xiàn)了線程安全的觀察者模式。在signals2庫中,觀察者模式被稱為信號(hào)/插槽(sinals and slots),它是一種函數(shù)回調(diào)機(jī)制,一個(gè)信號(hào)關(guān)聯(lián)了多個(gè)插槽,當(dāng)信號(hào)發(fā)出時(shí),所有關(guān)聯(lián)它的插槽都會(huì)被調(diào)用13. signal是不可拷貝的,如果把signal作為自定義類的成員變量,那么自定義類也將是不可拷貝的,除非用shared_ptr來包裝14. signal.connection()連接插槽時(shí),會(huì)返回一個(gè)connection對(duì)象,可以用來管理信號(hào)和插槽之間的連接關(guān)系15. signal2庫使用slot類提供了自動(dòng)連接管理的功能,能夠自動(dòng)跟蹤插槽的生命周期,但插槽失
61、效時(shí)會(huì)自動(dòng)斷開連接16. 較之signals,signals2具有線程安全,能夠用于多線程環(huán)境,而且不需要編譯就可以使用 第12章 并發(fā)編程1. thread庫提供的互斥量:1. mutex:獨(dú)占式互斥量2. timed_mutex:提供超時(shí)鎖定功能的獨(dú)占式互斥量3. recursive_mutex:遞歸式互斥量,可以多次鎖定,相應(yīng)的也要多次解鎖4. recursive_timed_mutex:提供超時(shí)鎖定功能的遞歸式互斥量5. shared_mutex:multiple-reader/single-writer型的共享互斥量(讀寫鎖)1. scoped_lock和scoped_tr
62、y_lock可以在退出作用域時(shí)確保unlock的調(diào)用2. <boost/detail/atomic_count.hpp>提供了一個(gè)原子計(jì)數(shù)器atomic_count,使用long進(jìn)行線程安全的遞增遞減計(jì)數(shù)3. 信號(hào)量:condition_variable_any和condition_variable4. thread_group提供一個(gè)簡單的線程池,可以對(duì)一組線程統(tǒng)一操作5. thread庫使用future范式提供異步操作線程返回值的方法,因?yàn)檫@個(gè)返回值在線程開始執(zhí)行時(shí)開始不可用的,是一個(gè)“未來”的“期望值”,所以被稱為future(期貨)。future使用packaged_task和promise兩個(gè)模板類來包裝異步調(diào)用,用unique_future和shared_future來獲取異步調(diào)用的結(jié)果int fab(int n) / 遞歸計(jì)算斐波那契數(shù)列 if(n = 0 | n = 1) return 1; return fab(n - 1) + fab(n - 2);int main() packaged_task<int> pt(bind(fab, 10); / 聲明packaged_task對(duì)象,用模板參數(shù)指明返回值的類型,packag
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 小區(qū)門崗施工合同范本
- 特種租賃合同范本
- 個(gè)人錢財(cái)贈(zèng)與合同范本
- 八下第二單元《公民的基本權(quán)利義務(wù)》知識(shí)競賽教學(xué)案例
- 2025商務(wù)合作合同范例標(biāo)準(zhǔn)版
- 2025某省汽車改裝服務(wù)合同
- 《2025年度物流管理系統(tǒng)軟件采購與使用合同》
- 輕質(zhì)磚隔墻合同范本
- 《2025年企業(yè)合同續(xù)簽流程與關(guān)鍵注意事項(xiàng)》
- 2025年建設(shè)項(xiàng)目勘察設(shè)計(jì)合同示范文本
- 中華人民共和國愛國主義教育法
- 2022-2023學(xué)年北京市海淀區(qū)八年級(jí)下學(xué)期期中考生物試卷 含詳解
- 樓頂發(fā)光字采購安裝投標(biāo)方案
- 組建生物質(zhì)燃料公司方案
- 鐵路轉(zhuǎn)轍機(jī) ZDJ9型電動(dòng)轉(zhuǎn)轍機(jī)認(rèn)知
- 2021年4月四川省自考06093人力資源開發(fā)與管理試題及答案含解析
- 產(chǎn)房醫(yī)院感染控制風(fēng)險(xiǎn)評(píng)估表
- 《關(guān)于“人工智能”》非連續(xù)文本閱讀練習(xí)及答案
- 鋼平臺(tái)鋪板計(jì)算excel(可當(dāng)計(jì)算書)
- 《強(qiáng)化學(xué)習(xí)理論與應(yīng)用》環(huán)境
- 美麗的西雙版納
評(píng)論
0/150
提交評(píng)論