日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Boost入门

發布時間:2023/12/20 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Boost入门 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

分享一下我老師大神的人工智能教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

Boost入門向導


簡介:boost是一套開源的、高度可移植的C++模板庫。它由C++標準委員發起,且里面很多組件有望成為下一代的C++標準庫,其地位將會與STL一樣。boost庫的英文站點是http://www.boost.org。如果上個頁面不能訪問,可以看http://boost.c-view.org,它是Boost鏡像。boost按功能分為:字符串、容器、算法、迭代器、數據結構、內存管理、多線程、IO等。其中字符串組中的正規表達式可以與POSIX API和Perl語言處理正則表達式的功能相媲美;多線程組件不比java的多線程難用;內存管理組件如果能合理使用可以杜絕內存泄露,而其效率更是與垃圾收集機制不可同日而語。boost的接口(或concept)完全與STL兼容,它在實現上使用了很多STL功能,它本身的組件也可以作為STL容器及算法的元素,所以有使用上,感覺不出是兩個類庫,我們可以當成是一個類庫來使用就行了。只是boost庫是在boost::名字空間里。而我個人最喜歡的一點是,boost的源碼可讀性非常高,非不得已它很少用宏,且不會象某些STL的實現一樣,到處都是下劃線開頭的變量。下載與安裝:當boost成為標準庫后,以下步驟就可以省略了,現在要用boost,還得親自動手。下載:打開boost主頁,點擊Getting StartedàDownloadàdownload?releases from SourceForge,目前最新版本是boost_1_31_0.tar.bz2。然后再在同一個頁面中下載boost-1.31.0-regex-patch-20040503.zip,這是一個補丁。下載之后,X/boost_1_31_0/?index.htm是一個本地的文檔目錄。安裝:大多數boost組件只要直接包含相應頭文件就可以使用[1]。但如果你用到date_time、filesystem、graph、python、regex、signals、test、thread?等組件,則要要編譯成相應的靜態或動態庫。新版本的boost在所有平臺下統一使用jam完成編譯與部署,并且boost還特別特化了一個jam版本bjam。這里以1.31.0版本為例,編譯所有的boost庫:執行boost源碼發布包中的X/boost_1_31_0/tools/build/jam_src下的build.bat,build.bat將自動在系統中選擇一個編譯器,并在bin.xxxx目錄下生成jam,bjam等工具。生成bjam后,配置好命令行編譯環境。并用bjam解釋(boostsrc)/下的jam文件即可編譯并部署。其參數繁多,這里不一一列出,見X/boost_1_31_0/boost_1_31_0/more/getting_started.html#Build_Install。String and text processing:提供了字符串的操作功能,大概分為五個組件。但要注意的是,某些組件效率上可能會有問題,比如字符串與基本類型的相互轉換、格式化等,它們的實現是先把輸入參數轉化為STL的字符流,然后通過字符流轉換為用戶想要的類型輸出(從這一點也可以看出,可以相互轉換的類型只限于字符流可接受的那幾類,字符流使用與可接受類型與io流基本一樣)。
組件描述
lexical_cast字符串與其它類型的相互轉換
format格式化字符
regex正則表達式
spirit字符串分析框架。用inline的C++寫成的EBNF語法。
tokenizer按位移或字符提取字符串
lexical_cast:很多時候,我們想要把字符串與其它類型相互轉換,而使用標簽的C庫,比如atoi,itoa等有時會很麻煩,而且難以記住所有這些函數,使用lexical_cast做這種事情則非常之簡單而安全。例子如下:#include?<boost/lexical_cast.hpp>void?test_lexical_cast(){std::string?strNember?=?boost::lexical_cast<std::string>(123);int?a?=?boost::lexical_cast<int>("123");double?b?=?boost::lexical_cast<double>("123.456");?}要注意的是,test_lexical_cast里的最后兩句在VC6.0下不能通過編譯。format:format的使用與一般的C格式化函數要靈活的多,而且它提供了多種語言風格的格式化。format其實是一個仿函數,查看源代碼有以下的定義:typedef basic_format<char >???? format;format要真正格式化的參數是通過operator%來傳遞給函數對象的。下面是一個簡單的例子:#include?<boost/format.hpp>std::cout?<<boost::format("writing %1%,?x=%2% : %3%-th try") % "toto" % 40.23 % 50; format生成的對象可以直接入到輸出流,要生成一個字符串,我們可以這樣:std::string?str?=?boost::lexical_cast<std::string>(boost::format("%1% %2% %3% %2% %1% /n") %?"a"?%?"b"?%?"c");這里生成的字符串是:"abcba /n"(%1%對應的參數是字符a,%2%對應的參數是字符b,%3%對應的參數是字符c)。regex:要分析一個字符串是否符合某種語法規則是一件很煩人而且容易出錯的事,boost::regex組件實現了這種分析功能,我們就不用自己去分析了。語法分析通常使用正則表達式,regex正是通過接受一個正則表達式字符串作為參數,來分析給定的字符串是否符合某種語法規則的。下面這個例子字符串"abcd"是否符合表達式 /d{4}[- ]){3}/d{4}:#include<boost/regex.hpp>std::string?s("abcd");static?const?boost::regex?e("(//d{4}[-?]){3}//d{4}");if(boost::regex_match(s,?e))std::cout?<<?"match /n";elsestd::cout?<<?"not match /n";我們還可以分析一篇文檔,提取只符合表達式的內容,比如,有一篇xml文檔,超級鏈接的地址是放在屬性href中,我想要提取所有超鏈接的地址可以這樣寫表達式:boost::regex?expression("//s+href//s*=//s*/"([^/"]*)/"");完整的代碼如下:void?test_regex_split(){using?namespace?boost;regex?expression("//s+href//s*=//s*/"([^/"]*)/"");//?假如文檔的內容如下:std::string?s?=?"<a href=/"index.html/"><img src=/"logo.gif/"></a>";std::vector<std::string>?result;?//?用于保存結果//?把字符串s按表達式expression分割,并把結果放到result中regex_split(std::back_inserter(result),?s,?expression);for?(std::vector<std::string>::iterator?it?=?result.begin();?it?!=?result.end(); ++it)std::cout?<< *it;std::cout?<<?std::endl;}注意,要用regex是需要編譯成相應的庫的。tokenizer:tokenizer組件提供了一種非常彈性且容易使用的方法來分割字符串。它的使用比較簡單,下面兩個例子,例子一是把"hello, word!"分成7+5兩個字符,例子二是把字符串按分隔符符分隔開:#include?<boost/tokenizer.hpp>void?test_tokenizer1(){std::string?s?=?"hello, word!";int?offsets[] = {7,?5};//?分成兩串,一串7個字符,一串5個boost::offset_separator?f(offsets,?offsets+2);typedef?boost::tokenizer<boost::offset_separator>?SeparatoTokenizer;SeparatoTokenizer?tok(s,?f);???for(SeparatoTokenizer::iterator?it?=?tok.begin();?it?!=?tok.end();?++it){std::cout?<<?"<"?<< *it?<<?"> "?<<?'/t';}std::cout?<<?std::endl;}void?test_tokenizer2(){std::string?str?=?";;Hello|world||-foo--bar;yow;baz|";boost::char_separator<char>?sep("-;|");?//分隔符typedef?boost::tokenizer<boost::char_separator<char> >?CharTokenizer;CharTokenizer?tokens(str,?sep);for?(CharTokenizer::iterator?tok_iter?=?tokens.begin();???tok_iter?!=?tokens.end(); ++tok_iter){std::cout?<<?"<"?<< *tok_iter?<<?"> "?<<?'/t';}std::cout <<?std::endl;}Containers:boost中的容器主要是作為STL容器的一個補充。靜態數組、多維數組的使用跟一般的C語法數組差不多,但作為容器,它提供了STL中的很多concept(比如iterater),所以可以使用STL算法來訪問它們。dynamic_bitset 是一種動態的biset。property map是把key對象影射到value對象,所有具有下標操作的類型都可以作為它的元素,對property map的需求來源于BGL。
組件描述
array符合STL容器語意4的靜態數組
multi_array多維數組,而且可以與array適配(前提是有共同的邊界)
dynamic_bitset一種可以在運行時改變大小的bitset。
property map一套可以把key對象影射到value對象的類與全局函數
graph圖容器,即BGL[2]
array:STL提供了一套接口(或concept),用于處理不同容器的算法。但普通數組卻因為沒有相應的接口[3]而不能很好的配合這些算法的使用。boost中的array具有靜態數組的效率與功能,且提供了STL容器的各種接口。multi_array:使用STL,如果要聲明一個二元的整數數組,我們可以這樣:std::vector<std::vector<int>>如果要三維,四維,N維,還使用這種方式?先不說這種代碼有多惡心,做起來有多麻煩,只要能完成工作就行了,但很多時候偏偏不能,比如在效率上有要求的時候(想一想vector的實現,這種動態增加如果發生在N維數組上)。而使用普通的數組,又不能很好配合STL算法,這在上面已經提過了。而boost的multi_array組件提供了標準庫的接口,而且功能與效率上與普通數組一樣。下面是一個該組件的簡單例子:#include?"boost/multi_array.hpp"void?test_array (){//?創建一個 3 x 4 x 2 的3D數組boost::multi_array<double,?3>?A(boost::extents[3][4][2]);typedef?boost::multi_array<double,?3>::index????index;//?給數組的元素賦值int?values?=?0;for(index?i?=?0;?i?!=?3;?++i)for(index?j?=?0;?j?!=?4;?++j)for(index?k?=?0;?k?!=?2;?++k)A[i][j][k] =?values++;//?輸出數組的元素值for(i?=?0;?i?!=?3; ++i)for(index?j?=?0;?j?!=?4;?++j)for(index?k?=?0;?k?!=?2;?++k)std::cout?<<?A[i][j][k]?<<?"/t";std::cout?<<?std::endl;}dynamic_bitset:boost的dynamic_bitset幾乎等價于std::bitest,不同的是,dynamic_bitset的大小是可以在運行時改變的。該組件在使用VC6.0下編譯不過。property map:property map定義了一套接口把key對象影射到相應的value對象,所有具有下標操作的類型(比如指針、數組、std::map等)都可以作為它的元素。對property?map的需求最初來源于BGL。property map的接口包含三個全局函數get(),?put(), 和?operator[]。下面是property map的使用例子,例子中使用到了boost::associative_property_map類,但其實使用其它的具有下標操作的類型也一樣可以:#include?<boost/property_map.hpp>template?<typename?AddressMap>void?foo(AddressMap?address){typedef?typename?boost::property_traits<AddressMap>::value_type?value_type;typedef?typename?boost::property_traits<AddressMap>::key_type???key_type;value_type?old_address,?new_address;key_type?fred?=?"Fred";old_address?=?boost::get(address,?fred);new_address?=?"384 Fitzpatrick Street";boost::put(address,?fred,?new_address);address["Joe"] =?"325 Cushing Avenue";}void?test_property_map(){typedef?std::map<std::string,?std::string>?NameAddrMap;NameAddrMap?name2address;boost::associative_property_map<NameAddrMap>?address_map(name2address);name2address.insert(std::make_pair(std::string("Fred"),std::string("710 West 13th Street")));name2address.insert(std::make_pair(std::string("Joe"),std::string("710 West 13th Street")));foo(address_map);for?(NameAddrMap::iterator?it?=?name2address.begin();?it?!=?name2address.end();?++it)std::cout?<<?it->first?<<?": "?<<?it->second?<<?"/n";}Data structures:
組件描述
any可以接受不同的類型的值,當一個容器要接受不同的類型元素時用它會很方便
compressed_pair與std::pair相似,但如果其中一個元素為空類時,會比std::pair更節省空間
tuple可以定義一個或多個元素的結構,作為函數返回值時會很方便
tuple:如果說,pair是可以定義有兩個元素的結構體,那么tuple是可以定義1到10元素的結構體。tuple的大部分定義是在boost::tuples::名字空間內(除了某些很通用的是在boost::內)訪問tuple元素可以通過兩個方式,t.get<N>()或者get<N>(t)這里,t是一個tuple實例。(第一種方法在VC6.0下編譯不過)它的使用例子如下:#include?"boost/tuple/tuple.hpp"void?test_tuple(){//?最多可以10元素boost::tuples::tuple<char,?double,?std::string>?triples('a',?2.4,?"hello");std::cout?<<?boost::tuples::get<0>(triples) <<?'/t'<<?boost::tuples::get<1>(triples) <<?'/t'<<?boost::tuples::get<2>(triples) <<?std::endl;}Memory:Memory中的組件比較通用,pool組件提供的內存分配可以使指針為作一個真正的原生指針,而又不用管理內存。智能指針要比std::auto_prt的好,但并非不可以代替(之前網上有編文章評論沒有loki提供智能指針的好用,而且KFC也有相應的組件。)
組件描述
pool內存池管理
smart_ptr智能指針,總共提供了6種類型
pool:pool是什么?pool是一套非常高效的內存分配方案。為什么要使用pool?使用pool分配內存得到的指針是真正的指針,這意味著,使用者可以對內存有更多的控制(相對于智能指針)。使用pool接口,你可以選擇只運行對象的析構函數或只簡單地對指向對象的指針回收。pool會保證沒有內存泄漏。什么時候使用pool?當有大量小對象分配與回收,而又不想去親自去管理內存時。總之,當你想要高效率的方式去操縱內存時用它會帶來很多好處。pool 提供了四個比較通常的組件:pool、object_pool、singleton_pool、pool_alloc。下面給出前兩個組件的簡單使用樣例:#include?<boost/pool/pool.hpp>void?test_pool_BaseType(){boost::pool<>?p(sizeof(int));for?(int?i?=?0;?i?<?5; ++i){int*?const?t?= (int*)p.malloc();*t?=?i;std::cout?<< *t?<<?'/t';}std::cout?<<?std::endl;}// on function exit, p is destroyed, and all malloc()'ed ints are implicitly freed#include?<boost/pool/object_pool.hpp>class?X {};void?test_pool_object(){boost::object_pool<X>?p;for?(int?i?=?0;?i?<?10000;?++i){X*?const?t?=?p.construct();// to do}}使用pool,我們可以不用管內存釋放。當然,如果你想自己釋放內存,可以使用void destroy(element_type * p)成員函數。這里element_type是傳進來的模板參數類型。object_pool是使用內存池管理內存,如果頻繁分配和刪除相同類型的對象,object_pool要比直接調用new,delete高出幾個數量級。smart_ptr:STL的std::auto被很多人認為是標準庫的一個缺陷,其實并不是這樣,只是因為std::auto提供的功能不夠豐富擺了,它缺少對引用數和數組的支持,并且,std::auto_ptr在被復制的時候會傳輸所有權。因為缺少引用,所以對象沒有共享所有權,結果就不可以跟其它STL組件(比如容器)很好的配合使用。boost提供的智能指針正好補充了以上功能,比較通用的組件有:scoped_ptr,用于處理單個對象的唯一所有權。scoped_array,與scoped_ptr類似,但是用來處理數組的。shared_ptr,允許共享對象所有權。shared_array,允許共享數組所有權。其它:date_time:一套處理日期與時間的組件,在它之前,我沒有發現有類似的C++庫,每次處理時間日期時,都覺繁瑣且容易出錯,現在用它,就再也不用記浮點數0是哪年哪月哪日了。使用date_time要編譯boost代碼成相應的庫。它的使用比較簡單,下面給出例子:#include?<boost/date_time/gregorian/gregorian.hpp>#include?<boost/date_time/posix_time/posix_time.hpp>void?test_data_time(){using?namespace?boost::gregorian;date?today?=?day_clock::local_day();std::string?strToday?=?to_simple_string(today);std::cout?<<?"today is: "?<<?strToday?<<?std::endl;using?namespace?boost::posix_time;date?d(2004,?May,?1);ptime?t1(d,?hours(5)+minutes(4)+seconds(2)+millisec(1));ptime?t2?=?t1?-?hours(5) -?minutes(4)?-?seconds(2) -?millisec(1);time_duration?td?=?t2?-?t1;std::cout?<<?to_simple_string(t2) <<?" - "<<?to_simple_string(t1) <<?" = "<<?to_simple_string(td) <<?std::endl;}

[1]?這里是大多數而不是全部,是因為boost不象STL那樣已經標準化,主流的編譯器要么提供本地版本要么完全支持開源版本。而目前boost的開源版本可能不是每一個編譯器都能完全支持;另一個與STL不同的是,boost某些庫需要編譯成相應的靜態庫與動態庫才可以用。[2]?Boost?Graph Library(boost 圖形庫,一套用于圖形的容器與算法組件)[3]?其實普通數組的指針也是可以看作為一種簡單的iterator???????????

給我老師的人工智能教程打call!http://blog.csdn.net/jiangjunshow

總結

以上是生活随笔為你收集整理的Boost入门的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。