C++ boost庫總結(jié)_第1頁
C++ boost庫總結(jié)_第2頁
C++ boost庫總結(jié)_第3頁
C++ boost庫總結(jié)_第4頁
C++ boost庫總結(jié)_第5頁
已閱讀5頁,還剩33頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、【精品文檔】如有侵權(quán),請聯(lián)系網(wǎng)站刪除,僅供學(xué)習(xí)與交流C+ boost庫總結(jié).精品文檔.第1章 Boost程序庫總論1. 使用Boost,將大大增強C+的功能和表現(xiàn)力第2章 時間與日期1. timer提供毫秒級的計時精度,內(nèi)部是通過std:clock取時間的2. progress_timer自動打印某生命周期的執(zhí)行時間3. 原則上程序庫的代碼是不應(yīng)該被用戶修改的4. progress_display可以在控制臺上顯示程序的執(zhí)行進度5. date_time庫能很好的表示日期時間概念,并能和C的時間結(jié)構(gòu)tm進行友好互轉(zhuǎn)6. date類提供年月日和星期幾的概念。data可通過from_string或f

2、rom_undelimited_string從字符串解析而來,可通過to_simple_string、to_iso_string、to_extended_iso_string轉(zhuǎn)換為字符串。(精度到天的DateTime)7. day_clock是精度到天的時鐘8. date_duration表示的是天精度的時間間隔概念,別名為days,另外還有years、months、weeks9. date_period表示兩個date之間的日期區(qū)間(精度到天的TimeSpan)10. date_iterator、week_iterator、month_iterator和year_iterator是時間的迭代

3、器11. boost:greorian:gregorian_calendar中有實用靜態(tài)方法:is_leap_year、end_of_month_day12. time_duration表示微妙或納秒級的時間概念,幾個實用子類:hours、minutes、seconds、millisec/milliseconds、microsec/microseconds、nanosec/nannoseconds13. duration_from_string可以從字符串解析time_duration14. ptime用來表示時間點,相當(dāng)于date和time_duration的組合??梢杂胻ime_from_

4、string或from_iso_string解析。(TimeSpan)ptime now1 = second_clock:local_time(); / 得到本地當(dāng)前秒精度時間ptime now2 = microsec_clock:universal_time(); / 得到本地當(dāng)前微秒精度時間15. time_period表示兩個ptime之間的時間區(qū)間。(DateTime)16. 時間迭代器沒有日期迭代器那么多,只有time_iterator一個17. (boost時間日期庫亂、破碎、過度設(shè)計) 第3章 內(nèi)存管理1. scoped_ptr類似auto_ptr,但其一旦獲得對象的管

5、理權(quán),你就無法再從它那里取回來。該智能指針只希望在本作用域里使用,不希望被轉(zhuǎn)讓。auto_ptr有意設(shè)計成所有權(quán)的自動轉(zhuǎn)讓,scoped_ptr有意設(shè)計成所有權(quán)的無法轉(zhuǎn)讓。scoped_ptr和auto_ptr均不能作為容器元素。2. scoped_array包裝的是new產(chǎn)生的指針,并調(diào)用的是delete。往往是用來和C代碼保持兼容,一般不推薦使用3. 無論是編譯器還是程序員都很難區(qū)分出new和new分配的空間,錯誤的運用delete將導(dǎo)致資源異常4. 在C+歷史上曾經(jīng)出現(xiàn)過無數(shù)的引用計數(shù)型智能指針實現(xiàn),但沒有一個比得上boost:shared_ptr,在過去、現(xiàn)在和將來,它都是最好的5.

6、shared_ptr支持的轉(zhuǎn)型有:static_pointer_cast<T>、const_pointer_cast<T>、dynamic_pointer_cast<T>,返回的結(jié)果是shared_ptr,并能保證這些指針的引用計數(shù)正確6. 用shared_ptr可以消除代碼中顯示的delete,用make_shared、allocate_shared可以消除代碼中顯示的new7. 橋接模式(bridge)是一種結(jié)構(gòu)型設(shè)計模式,它把類的具體實現(xiàn)細節(jié)對用戶隱藏起來,以達到類之間的最小耦合關(guān)系。在具體編程實踐中橋接模式也被稱為pimpl或者handle/body

7、慣用法,它可以將頭文件的依賴關(guān)系降到最小,減少編譯時間,而且可以不使用虛函數(shù)實現(xiàn)多態(tài)8. get_deleter(shared_ptr<T> const& p)可以獲得刪除器。shared_ptr的刪除器在處理某些特殊資源時非常有用,它使得用戶可以定制、擴展shared_ptr的行為,使其不僅僅能夠管理內(nèi)存資源,而是稱為一個“萬能”的資源管理工具9. 對應(yīng)shared_ptr,也有一個shared_array,scoped_array和shared_array均不對operator做下標檢測10. weak_ptr是為配合shared_ptr而引入的,更像是shared_p

8、tr的一個助手而不是智能指針,其沒有重載operator*和->,不具有普通指針的行為。它最大的作用在于協(xié)助shared_ptr工作,像旁觀者那樣觀測資源的使用情況11. weak_ptr被設(shè)計為與shared_ptr共同工作,可以從一個shared_ptr或者另一個weak_ptr對象構(gòu)造,獲得資源的觀測權(quán)。但weak_ptr沒有共享資源,它的構(gòu)造不會引起指針引用計數(shù)的增加。同樣,在weak_ptr析構(gòu)時也不會導(dǎo)致引用計數(shù)的減少,它只是一個靜靜的觀察者12. 獲得this指針的shared_ptr,使對象自己能夠產(chǎn)生shared_ptr管理自己:class T : public ena

9、ble_shared_from_this<T>, then shared_ptr shared_from_this().13. intrusive_ptr是一個侵入式的引用計數(shù)型指針。當(dāng)對內(nèi)存占用的要求非常嚴格,或現(xiàn)存代碼已經(jīng)有了引用計數(shù)機制時可以考慮。一般情況不推薦使用。14. pool為固定塊大小的類似malloc的原生內(nèi)存分配器,支持數(shù)組式分配,一般情況下不必對分配的內(nèi)存調(diào)用free()。只分配原生內(nèi)存,不調(diào)用構(gòu)造函數(shù),回收不調(diào)用析構(gòu)函數(shù),最好不要用于對象。15. singleton_pool和pool接口完全一致,但為單件線程安全,同樣要求編譯期指定要分配的原生內(nèi)存塊大小1

10、6. object_pool為特定類型的對象池,不支持數(shù)組式分配,支持對象分配和對象原生內(nèi)存分配17. pool_alloc和fast_pool_allocator是boost提供的兩個STL分配器。除非有特別需求,我們應(yīng)該總使用STL實現(xiàn)自帶的內(nèi)存分配器。使用定制的分配器需要經(jīng)過仔細的測試,以保證它與容器可以共同工作。18. 內(nèi)存管理是C+程序開發(fā)中永恒的話題,因為沒有GC,小心謹慎的管理內(nèi)存等系統(tǒng)資源是每一個C+程序員都必須面對的問題第4章 實用工具1. private繼承自noncopyable可以編譯時禁止對象拷貝語法2. C+靜態(tài)強類型的優(yōu)點有時候反而是阻礙程序員生產(chǎn)力的“缺陷”3.

11、 typeof庫使用宏模擬了C+0X中的typedef和auto關(guān)鍵字,可以減輕書寫繁瑣的變量類型聲明工作,簡化代碼。對于用戶自定義類型需要手工用宏注冊。(語法并沒那么好看,不準備使用)4. optional<T>使用“容器”語義,包裝了“可能產(chǎn)生無效值”的對象,實現(xiàn)了“未初始化”的概念(Nullable<T>)5. optional<T> make_optional(bool condition, T const& v)用來簡單構(gòu)建optional對象,但不能處理optional<T&>的情況。(此乃雞肋) 6. op

12、tional<string> str(in_place("string就地創(chuàng)建"),而不需拷貝臨時對象,避免大對象的拷貝開銷7. 用于初始化的assign庫(僅限于STL標準容器,通過重載“+=”和“,”運算符實現(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>

13、; m; m += make_pair(1, "one"), make_pair(2, "2");8. assign還支持insert()、push_front()、push_back()(通過重載“()”實現(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);ma

14、p<int, string> m; insert(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 =

15、list_of(1)(2)(3);deque<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")如果需要將括號與逗號混合使用,則要求最外側(cè)加一個括號,否則編譯器無法推導(dǎo)11. assign map_list_of/pair_list_of函數(shù):m

16、ap<int, int> m1 = map_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)(

17、5); / v = 1,2,2,2,3,4,5multiset<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個STL標準容器(vector、string、deque、list、set、multiset、map、multimap),對容器適配器(stack、queue、prio

18、rity_queue)則需要通過to_adapter():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中的非標準容器slist、hash_

19、map、hash_set,因為其符合標準容器定義,同時也支持大部分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

20、 = 1, b = 2, c = 3;vector<int> v = ref_list_of<3>(a)(b)(c);18. boost:swap是對std:swap的增強,并且擴充了對數(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之前進行構(gòu)造,支持繼承或非繼承形式(最恨main之前的事情了)20. 單件boost:serial

21、ization:singleton<T>在main之前進行構(gòu)造,支持繼承或非繼承形式。繼承方式更徹底一些,非繼承方式不影響原有代碼21. boost:tribool三態(tài)bool,indeterminate(tribool)可判斷一個三態(tài)bool是否處于不確定狀態(tài)22. 選擇optional<bool>還是tribool:如果返回值可能是無效的,那么就是optional<bool>,如果返回值總是確定的,但可能無法確定其意義,那么就用tribool(最多自己隨手定義個enum狀態(tài),為了這點需求需要記住這一堆名稱和細節(jié)?。?3. using namespace

22、std:rel_ops; 則一旦為類定義了operator=和<,則自動具有!=、>、<=和>=的功能。boost operators庫提供了對該功能的增強,使用時只需繼承自這些類并提供指定的operator重載即可獲得附送的重載:1. equality_comparable<T>:要求提供=,可自動實現(xiàn)!=,相等語義2. less_than_comparable<T>:要求提供<,可自動實現(xiàn)>、<=、>=3. addable<T>:要求提供+=,可自動實現(xiàn)+4. subtractable<T>:要

23、求提供-=,可自動實現(xiàn)-5. incrementable<T>:要求提供前置+,可自動實現(xiàn)后置+6. decrementable<T>:要求提供前置-,可自動實現(xiàn)后置-7. equivalent<T>:要求提供<,可自動實現(xiàn)=,等價語義8. totally_ordered:全序概念,組合了equality_comparable和less_than_comparable9. additive:可加減概念,組合了addable和subtractable10. multiplicative:可乘除概念,組合了multipliable和diviable11.

24、arithmetic:算術(shù)運算概念,組合了additive和multiplicative12. unit_stoppable:可步進概念,組合了incrementable和decrementable13. public dereferenceable<T, P, (B)>:解引用操作符,要求提供operator*,可自動實現(xiàn)operator->。P為operator->返回類型,一般為T*14. public indexable<T, I, R, (B)>:下標操作符,I為下標類型,要求能夠與類型T做加法操作,通常為int;R是operator的返回值類型,

25、通常是一個類型的引用。要求提供operator+(T, I),將自動實現(xiàn)operator1. 如果只關(guān)心類的等價語義,那么就用equivalent,如果想要精確的比較兩個對象的值,就是用equality_comprable。相等equivalent基于"="實現(xiàn),而equality_comprable基于"<"的"!(x<y)&&!(x>y)"實現(xiàn)。2. 應(yīng)該總對異常類是用虛繼承3. struct my_exception :  virtual std:exception,  /

26、兼容C+標準異常  virtual boost: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)    c

27、out << *get_error_info<err_no>(e) << endl;    cout << e.what() << endl;    e << err_str("向異常追加信息,還可再次拋出");    cout << *get_error_info<err_str>(e) << endl;4. 從exception派生的異常定義非常簡單,沒有實現(xiàn)代碼,可以很容易

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>> err

29、info_file_handle;typedef 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_

30、info<struct throw_function_, 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(任意異常類型),可以自動將任意異常類型包裝為bo

31、ost異常,還能保證線程安全8. diagnostic_information(e)可以得到任意boost異常的字符串內(nèi)容描述;在catch塊中調(diào)用current_exception_diagnostic_information(),則不用傳參數(shù)e。(何必呢,為少寫一兩個字母反而要記住一個更長的名字)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, Unive

32、rsally Unique Identifier, 128bit(16 Byte),不需要中央認證機構(gòu)就可以創(chuàng)建全球唯一的標識符。別名GUID12. 不是所有的警告都可以忽略的,有的警告預(yù)示著可能潛在的錯誤13. BOOST_BINARY(111 00 1),可以實現(xiàn)編譯器的二進制定義,但不能超過8bit第5章 字符串與文本處理1. lexical_cast<T>(X),可以實現(xiàn)字符串和數(shù)值類型之間的轉(zhuǎn)換,但不支持高級格式控制。轉(zhuǎn)換失敗將拋出bad_lexical_cast異常。lexical_cast底層用C+流實現(xiàn),要求目標類型支持operator<<、operat

33、or>>、無參構(gòu)造函數(shù)和拷貝構(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<<或st

34、r()都會拋出異常4. format完全支持printf的格式化選項方式,同時還增加了新的方式:1. %|spec|%:與printf格式選項功能相同,但兩邊增加了豎線分隔,可以更好的區(qū)分格式化選項有普通字符2. %N%:標記第N個參數(shù),相當(dāng)于占位符,不帶任何其他的格式化選項1. format因為做了很多安全檢查工作,會比printf慢至少2-5倍2. format相關(guān)的高級功能:1. basic_format& bind_arg(int argN, const T& val) 把格式化字符串第argN位置的輸入?yún)?shù)固定為val,即使調(diào)用clear()也保持不變,除非

35、調(diào)用clear_bind()或clear_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位置的格式化選項,manipulator是一個boost:io:group()返回的對象5. boost:io:group(T1 a1, ., Var const& var) 是

36、一個最多支持10個參數(shù)的模板函數(shù),可以設(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(十進制數(shù)字), is_graph, is_lower, is_print

37、, is_punct(是否是標點符號), is_upper, is_xdigit(字符是否為十六進制數(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、replac

38、e/erase_tail8. find_all、split、find_iterator、split_iterator、join1. tokenizer類似string_algo:split,為更專業(yè)的token劃分工具。tokenizer庫提供預(yù)定義好的四個分詞對象:1. char_delimiter_separator:使用標點符號分詞,是默認的分詞函數(shù)對象。已被聲明廢棄2. char_separator:支持一個字符集合作為分隔符,默認行為與char_delimiter_separator類似3. escaped_list_separator:用于CSV格式的分詞4. offset_sep

39、arator:使用偏移量來分詞2. xpressive,類似boost.regex的正則表達式解析器,同時還是一個類似于boost.spirit的語法分析器,并且將這兩種完全不相交的文本處理方式完美的融合在了一起3. xpressive使用regex_token_iterator<>提供了強大的分詞迭代器第6章 正確性測試1. 測試對于軟件開發(fā)是非常重要的,程序員尤其是C+程序員更應(yīng)該認識到這一點2. BOOST_ASSERT宏類似于assert宏,提供運行時斷言,但功能有所增強??梢酝ㄟ^BOOST_DISABLE_ASSERTS來關(guān)閉。當(dāng)定義BOOST_ENABLE_ASSERT

40、_HANDLER后,斷言觸發(fā)時將會調(diào)用boost:assertion_failed回調(diào)3. BOOST_VERIFY類似BOOST_ASSERT,但斷言表達式一定會被求值,Release下仍然會失效(放棄BOOST_VERIFY)4. BOOST_STATIC_ASSERT,編譯時斷言??梢猿霈F(xiàn)在程序的任何位置,而不一定只在函數(shù)域內(nèi)5. 測試用例是一個包含多個測試斷言的函數(shù),它是可以被獨立執(zhí)行測試的最小單元,各個測試用例之間是無關(guān)的,發(fā)生的錯誤不會影響到其他測試用例第7章 容器與數(shù)據(jù)結(jié)構(gòu)1. array是的C原生數(shù)組的STL接口包裝2. std:vector<bool>是vecto

41、r對bool的特化,內(nèi)部保存的實際為bit,支持動態(tài)長度。std:bitset大小固定,但支持更多的位運算3. boost.dynamic_bitset類似std:vector<bool>可以動態(tài)長度,同時提供了豐富的位運算。dynamic_bitset還支持集合相關(guān)操作4. 哈希容器:boost:unordered_map、boost:unordered_set、boost:unordered_multimap、boost:unordered_multiset5. boost:bimap,雙向映射容器,提供left、right兩個試圖。支持的集合類型有:set_of、multis

42、et_of、unordered_set_of、unordered_multiset_of、list_of、vector_of、unconstrained_set_of6. bimap的左右視圖還可以通過標簽訪問: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&q

43、uot;, 2); / 相當(dāng)于使用右視圖7. circular_buffer<T>為大小固定的循環(huán)緩沖區(qū),circular_buffer_space_optimized<T>類似circular_buffer<T>但只在確實需要時才分配內(nèi)存,并且當(dāng)容器內(nèi)元素減少時自動釋放內(nèi)存8. tuple是固定數(shù)目非同質(zhì)元素容器。tuple是std:pair的泛化,可以從函數(shù)返回任意數(shù)量的值,也可以代替struct組合數(shù)據(jù)9. 和std:make_pair對應(yīng),也有個make_tuple用來簡化tuple的創(chuàng)建10. tie()可以生成一個元素類型全是引用的tuple,相

44、當(dāng)于make_tuple(ref(a), ref(b), .),可以用于左值,通常用來接收返回tuple或pair函數(shù)的返回值,可以看成是對tuple的解包11. element<N, T>:type可以給出T中第N個元素的類型,length<T>:value可以給出T的元素數(shù)量12. any能夠容納任意類型,可以用any_cast<T>(a)類型安全的取出any中的值(讓人聯(lián)想到Ogre:Any)13. any可以持有原始指針,但這樣的用法很不安全,會導(dǎo)致內(nèi)存泄露。應(yīng)該使用智能指針包裝原始指針,這樣在any析構(gòu)時智能指針會自動的調(diào)用delete,從而安全的

45、釋放資源14. 如果希望一種數(shù)據(jù)結(jié)構(gòu)具有tuple那樣的容納任意類型的能力,又可以在運行時動態(tài)變化大小,那么就可以用any作為元素類型搭配容器15. variant是對C/C+中union概念的增強和擴展。varinat是有界類型,元素類型范圍由用戶指定,any是無界類型,可以容納任意類型16. multi_array<int, 3>,相當(dāng)于int maXYZ的多維數(shù)組。multi_array沒有異常機制來處理錯誤,保證數(shù)組范圍不越界是庫用戶自己的責(zé)任17. property_tree是一個保存了多個屬性值的樹形數(shù)據(jù)結(jié)構(gòu),可以用類似路徑的簡單方式訪問任意節(jié)點的樹形,而且每個節(jié)點都可

46、以用類似STL的風(fēng)格遍歷子節(jié)點。property_tree特別適合于應(yīng)用程序的配置數(shù)據(jù)處理,可以解析xml、ini、json和info四種格式的文本數(shù)據(jù),使用它能減輕自己開發(fā)配置管理的工作。第8章 算法1. boost foreach庫提供BOOST_FOREACH和BOOST_REVERSE_FOREACH來實現(xiàn)對容器的正向和反向遍歷2. minmax(a, b)可在一次處理中同時獲得最大最小值,執(zhí)行效率上有很大提高(有提前優(yōu)化的感覺了)3. minmax_element算法族可以得到迭代器區(qū)間內(nèi)的最大最小值第9章 數(shù)學(xué)與數(shù)字1. 從純數(shù)學(xué)的角度看,程序也不過是一個非常大的整數(shù)而已2. in

47、teger_traits : public std:numeric_limits,提供各種整數(shù)類型的編譯期最大最小值3. <boost/cstdint.hpp>基于C99標準中的<stdint.h>,定義了各種標準的整數(shù)4. <boost/integer.hpp>與<boost/cstdint.hpp>功能類似,用模板類而不是typedef提供各種整數(shù)類型定義5. boost.rational表示有理數(shù)(分數(shù)),rational_cast<R>可以將有理數(shù)轉(zhuǎn)換為普通數(shù)字6. 最大公約數(shù)gcd();最小公倍數(shù)lcm()7. crc_op

48、timal以字節(jié)為單位的快速CRC計算,實際常用的是crc_32_type的預(yù)定義算法8. boost random庫提供了26個偽隨機數(shù)發(fā)生器9. random庫提供的隨機數(shù)分布器:1. uniform_smallint:在小整數(shù)域內(nèi)的均勻分布2. uniform_int:在整數(shù)域上的均勻分布3. uniform_01:在區(qū)間0,1上的實數(shù)連續(xù)均勻分布4. uniform_real:在區(qū)間min,max上的實數(shù)連續(xù)均勻分布5. bernoulli_distribution:伯努利分布6. binomial_distribution:二項分布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:對數(shù)正態(tài)分布15. uniform_on_sphere:球面均勻分布1. variate_generator<Engine, Distribution>變量發(fā)生器,用于組

50、合隨機數(shù)發(fā)生器和分布器2. 真隨機數(shù)無法用純軟件產(chǎn)生,因為計算機本身是個確定的有限狀態(tài)自動機第10章 操作系統(tǒng)相關(guān)1. io_state_savers庫可以簡化恢復(fù)流狀態(tài)的工作,它能夠保存流的當(dāng)前狀態(tài),自動恢復(fù)流的狀態(tài)或者由程序員控制恢復(fù)的時機1. 基本的標準屬性保存器:ios_flags_saver、ios_width_saver2. 增強的標準屬性保存器:ios_iostate_saver、ios_rdbuf_saver3. 自定義的屬性保存器:ios_iword_saver、ios_pword_saver4. 組合的屬性保存器:ios_all_saver1. system庫使用輕量級的對

51、象封裝了操作系統(tǒng)底層的錯誤代碼和錯誤信息,使調(diào)用操作系統(tǒng)功能的程序可以被很容易的移植到其他操作系統(tǒng)filesystem庫中的path和wpath提供了文件路徑相關(guān)的很多實用操作(類似Path)2. portable_posix_name()和windows_name()分別檢測文教案名字符串是否符合POSIX和Windows規(guī)范。Windows的文件名可以字符范圍比POSIX的大。3. native()判斷文件名是否符合本地文件系統(tǒng)命名規(guī)則4. 為了程序的健壯性,應(yīng)總使用try-catch來保護文件訪問代碼5. directory_iterator和wdirectory_iterator提供了

52、迭代一個目錄下所有文件的功能6. recursive_directory_iterator和wrecursive_directory_iterator提供遞歸遍歷目錄功能7. program_options庫提供了強大的命令行參數(shù)處理功能,它不僅能夠分析命令行,也能夠從配置文件甚至環(huán)境變量中獲取參數(shù),實現(xiàn)了非常完善的程序配置選項處理功能8. #include <boost/program_options.hpp>using namespace boost:program_options;int main(int argc, char* argv)  options_des

53、cription 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, argv, op

54、ts), vm);  / 解析完成,實現(xiàn)選項處理邏輯  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庫的解析程序選項功能由三個基本組件構(gòu)成,分別是選項描述器、分析器和存儲器。選項描述其定義選項及選項的值,分析器依據(jù)選項描述器的定義解析命令行或數(shù)據(jù)文件,存儲器則把分析器的結(jié)果保存起來以供使用第11章 函數(shù)與回調(diào)1. result_of<Func(T1, T2)>:type確定一個調(diào)用表達式的返回類型,是實現(xiàn)泛型庫的底層基本構(gòu)件2. ref(

56、)和cref()可以包裝對象的引用,在傳遞參數(shù)時消除對象拷貝的代價,或者將不可拷貝的對象變?yōu)榭梢钥截?. bind是對標準庫bind1st、bind2nd的泛化和增強,可以適配任意的可調(diào)用對象。4. bind第一個參數(shù)必須是一個可調(diào)用對象,包括函數(shù)、函數(shù)指針、函數(shù)對象和成員函數(shù)指針5. bind也可以綁定到public成員變量,用法與綁定成員函數(shù)類似,只需要把成員變量名像一個成員函數(shù)一樣去使用6. bind綁定到仿函數(shù)時,要求仿函數(shù)typedef xxx result_type;否則就只能用bind<xxx>(functor()的形式7. bind重載了比較操作符和邏輯非操作符,可

57、以把多個bind綁定式組合起來,形成一個復(fù)雜的邏輯表達式,配合標準庫算法可以實現(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() = 3); / 有理數(shù)1

58、/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 << endl; / 輸出5/68

59、. 變長參數(shù)函數(shù)、_stdcall、_fastcall、extern "C"等函數(shù)bind時需要顯式指定返回值類型才行9. function是一個函數(shù)對象的“容器”,概念上像是C/C+中的函數(shù)指針類型的泛化,是一種“智能函數(shù)指針”10. 調(diào)用空的function將拋出bad_function_call異常,最好在使用前通過empty()來測試有效性11. 與原始的函數(shù)指針相比,function對象的體積要稍微大一點(3個指針的大?。?,速度要稍微慢一點(10%左右的性能差距),但這與它帶給程序的巨大好處相比是無足輕重的12. signals2基于boost中的另一個庫sign

60、als,實現(xiàn)了線程安全的觀察者模式。在signals2庫中,觀察者模式被稱為信號/插槽(sinals and slots),它是一種函數(shù)回調(diào)機制,一個信號關(guān)聯(lián)了多個插槽,當(dāng)信號發(fā)出時,所有關(guān)聯(lián)它的插槽都會被調(diào)用13. signal是不可拷貝的,如果把signal作為自定義類的成員變量,那么自定義類也將是不可拷貝的,除非用shared_ptr來包裝14. signal.connection()連接插槽時,會返回一個connection對象,可以用來管理信號和插槽之間的連接關(guān)系15. signal2庫使用slot類提供了自動連接管理的功能,能夠自動跟蹤插槽的生命周期,但插槽失效時會自動斷開連接16

61、. 較之signals,signals2具有線程安全,能夠用于多線程環(huán)境,而且不需要編譯就可以使用第12章 并發(fā)編程1. thread庫提供的互斥量:1. mutex:獨占式互斥量2. timed_mutex:提供超時鎖定功能的獨占式互斥量3. recursive_mutex:遞歸式互斥量,可以多次鎖定,相應(yīng)的也要多次解鎖4. recursive_timed_mutex:提供超時鎖定功能的遞歸式互斥量5. shared_mutex:multiple-reader/single-writer型的共享互斥量(讀寫鎖)1. scoped_lock和scoped_try_lock可以在退出作用域時確保

62、unlock的調(diào)用2. <boost/detail/atomic_count.hpp>提供了一個原子計數(shù)器atomic_count,使用long進行線程安全的遞增遞減計數(shù)3. 信號量:condition_variable_any和condition_variable4. thread_group提供一個簡單的線程池,可以對一組線程統(tǒng)一操作5. thread庫使用future范式提供異步操作線程返回值的方法,因為這個返回值在線程開始執(zhí)行時開始不可用的,是一個“未來”的“期望值”,所以被稱為future(期貨)。future使用packaged_task和promise兩個模板類來包裝異步調(diào)用,用unique_future和shared_future來獲取異步調(diào)用的結(jié)果int fab(int n) / 遞歸計算斐波那契數(shù)列    if(n = 0 | n = 1) return 1;    return fab(n - 1) + fab(n - 2);int main()    packaged_task<int> pt(bind(fab, 10); / 聲明pack

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論