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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Boost入门

發(fā)布時(shí)間:2023/12/20 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Boost入门 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

也歡迎大家轉(zhuǎn)載本篇文章。分享知識(shí),造福人民,實(shí)現(xiàn)我們中華民族偉大復(fù)興!

Boost入門(mén)向?qū)?/strong>


簡(jiǎn)介:boost是一套開(kāi)源的、高度可移植的C++模板庫(kù)。它由C++標(biāo)準(zhǔn)委員發(fā)起,且里面很多組件有望成為下一代的C++標(biāo)準(zhǔn)庫(kù),其地位將會(huì)與STL一樣。boost庫(kù)的英文站點(diǎn)是http://www.boost.org。如果上個(gè)頁(yè)面不能訪問(wèn),可以看http://boost.c-view.org,它是Boost鏡像。boost按功能分為:字符串、容器、算法、迭代器、數(shù)據(jù)結(jié)構(gòu)、內(nèi)存管理、多線程、IO等。其中字符串組中的正規(guī)表達(dá)式可以與POSIX API和Perl語(yǔ)言處理正則表達(dá)式的功能相媲美;多線程組件不比java的多線程難用;內(nèi)存管理組件如果能合理使用可以杜絕內(nèi)存泄露,而其效率更是與垃圾收集機(jī)制不可同日而語(yǔ)。boost的接口(或concept)完全與STL兼容,它在實(shí)現(xiàn)上使用了很多STL功能,它本身的組件也可以作為STL容器及算法的元素,所以有使用上,感覺(jué)不出是兩個(gè)類(lèi)庫(kù),我們可以當(dāng)成是一個(gè)類(lèi)庫(kù)來(lái)使用就行了。只是boost庫(kù)是在boost::名字空間里。而我個(gè)人最喜歡的一點(diǎn)是,boost的源碼可讀性非常高,非不得已它很少用宏,且不會(huì)象某些STL的實(shí)現(xiàn)一樣,到處都是下劃線開(kāi)頭的變量。下載與安裝:當(dāng)boost成為標(biāo)準(zhǔn)庫(kù)后,以下步驟就可以省略了,現(xiàn)在要用boost,還得親自動(dòng)手。下載:打開(kāi)boost主頁(yè),點(diǎn)擊Getting StartedàDownloadàdownload?releases from SourceForge,目前最新版本是boost_1_31_0.tar.bz2。然后再在同一個(gè)頁(yè)面中下載boost-1.31.0-regex-patch-20040503.zip,這是一個(gè)補(bǔ)丁。下載之后,X/boost_1_31_0/?index.htm是一個(gè)本地的文檔目錄。安裝:大多數(shù)boost組件只要直接包含相應(yīng)頭文件就可以使用[1]。但如果你用到date_time、filesystem、graph、python、regex、signals、test、thread?等組件,則要要編譯成相應(yīng)的靜態(tài)或動(dòng)態(tài)庫(kù)。新版本的boost在所有平臺(tái)下統(tǒng)一使用jam完成編譯與部署,并且boost還特別特化了一個(gè)jam版本bjam。這里以1.31.0版本為例,編譯所有的boost庫(kù):執(zhí)行boost源碼發(fā)布包中的X/boost_1_31_0/tools/build/jam_src下的build.bat,build.bat將自動(dòng)在系統(tǒng)中選擇一個(gè)編譯器,并在bin.xxxx目錄下生成jam,bjam等工具。生成bjam后,配置好命令行編譯環(huán)境。并用bjam解釋(boostsrc)/下的jam文件即可編譯并部署。其參數(shù)繁多,這里不一一列出,見(jiàn)X/boost_1_31_0/boost_1_31_0/more/getting_started.html#Build_Install。String and text processing:提供了字符串的操作功能,大概分為五個(gè)組件。但要注意的是,某些組件效率上可能會(huì)有問(wèn)題,比如字符串與基本類(lèi)型的相互轉(zhuǎn)換、格式化等,它們的實(shí)現(xiàn)是先把輸入?yún)?shù)轉(zhuǎn)化為STL的字符流,然后通過(guò)字符流轉(zhuǎn)換為用戶想要的類(lèi)型輸出(從這一點(diǎn)也可以看出,可以相互轉(zhuǎn)換的類(lèi)型只限于字符流可接受的那幾類(lèi),字符流使用與可接受類(lèi)型與io流基本一樣)。
組件描述
lexical_cast字符串與其它類(lèi)型的相互轉(zhuǎn)換
format格式化字符
regex正則表達(dá)式
spirit字符串分析框架。用inline的C++寫(xiě)成的EBNF語(yǔ)法。
tokenizer按位移或字符提取字符串
lexical_cast:很多時(shí)候,我們想要把字符串與其它類(lèi)型相互轉(zhuǎn)換,而使用標(biāo)簽的C庫(kù),比如atoi,itoa等有時(shí)會(huì)很麻煩,而且難以記住所有這些函數(shù),使用lexical_cast做這種事情則非常之簡(jiǎn)單而安全。例子如下:#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下不能通過(guò)編譯。format:format的使用與一般的C格式化函數(shù)要靈活的多,而且它提供了多種語(yǔ)言風(fēng)格的格式化。format其實(shí)是一個(gè)仿函數(shù),查看源代碼有以下的定義:typedef basic_format<char >???? format;format要真正格式化的參數(shù)是通過(guò)operator%來(lái)傳遞給函數(shù)對(duì)象的。下面是一個(gè)簡(jiǎn)單的例子:#include?<boost/format.hpp>std::cout?<<boost::format("writing %1%,?x=%2% : %3%-th try") % "toto" % 40.23 % 50; format生成的對(duì)象可以直接入到輸出流,要生成一個(gè)字符串,我們可以這樣:std::string?str?=?boost::lexical_cast<std::string>(boost::format("%1% %2% %3% %2% %1% /n") %?"a"?%?"b"?%?"c");這里生成的字符串是:"abcba /n"(%1%對(duì)應(yīng)的參數(shù)是字符a,%2%對(duì)應(yīng)的參數(shù)是字符b,%3%對(duì)應(yīng)的參數(shù)是字符c)。regex:要分析一個(gè)字符串是否符合某種語(yǔ)法規(guī)則是一件很煩人而且容易出錯(cuò)的事,boost::regex組件實(shí)現(xiàn)了這種分析功能,我們就不用自己去分析了。語(yǔ)法分析通常使用正則表達(dá)式,regex正是通過(guò)接受一個(gè)正則表達(dá)式字符串作為參數(shù),來(lái)分析給定的字符串是否符合某種語(yǔ)法規(guī)則的。下面這個(gè)例子字符串"abcd"是否符合表達(dá)式 /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";我們還可以分析一篇文檔,提取只符合表達(dá)式的內(nèi)容,比如,有一篇xml文檔,超級(jí)鏈接的地址是放在屬性href中,我想要提取所有超鏈接的地址可以這樣寫(xiě)表達(dá)式:boost::regex?expression("//s+href//s*=//s*/"([^/"]*)/"");完整的代碼如下:void?test_regex_split(){using?namespace?boost;regex?expression("//s+href//s*=//s*/"([^/"]*)/"");//?假如文檔的內(nèi)容如下:std::string?s?=?"<a href=/"index.html/"><img src=/"logo.gif/"></a>";std::vector<std::string>?result;?//?用于保存結(jié)果//?把字符串s按表達(dá)式expression分割,并把結(jié)果放到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是需要編譯成相應(yīng)的庫(kù)的。tokenizer:tokenizer組件提供了一種非常彈性且容易使用的方法來(lái)分割字符串。它的使用比較簡(jiǎn)單,下面兩個(gè)例子,例子一是把"hello, word!"分成7+5兩個(gè)字符,例子二是把字符串按分隔符符分隔開(kāi):#include?<boost/tokenizer.hpp>void?test_tokenizer1(){std::string?s?=?"hello, word!";int?offsets[] = {7,?5};//?分成兩串,一串7個(gè)字符,一串5個(gè)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容器的一個(gè)補(bǔ)充。靜態(tài)數(shù)組、多維數(shù)組的使用跟一般的C語(yǔ)法數(shù)組差不多,但作為容器,它提供了STL中的很多concept(比如iterater),所以可以使用STL算法來(lái)訪問(wèn)它們。dynamic_bitset 是一種動(dòng)態(tài)的biset。property map是把key對(duì)象影射到value對(duì)象,所有具有下標(biāo)操作的類(lèi)型都可以作為它的元素,對(duì)property map的需求來(lái)源于BGL。
組件描述
array符合STL容器語(yǔ)意4的靜態(tài)數(shù)組
multi_array多維數(shù)組,而且可以與array適配(前提是有共同的邊界)
dynamic_bitset一種可以在運(yùn)行時(shí)改變大小的bitset。
property map一套可以把key對(duì)象影射到value對(duì)象的類(lèi)與全局函數(shù)
graph圖容器,即BGL[2]
array:STL提供了一套接口(或concept),用于處理不同容器的算法。但普通數(shù)組卻因?yàn)闆](méi)有相應(yīng)的接口[3]而不能很好的配合這些算法的使用。boost中的array具有靜態(tài)數(shù)組的效率與功能,且提供了STL容器的各種接口。multi_array:使用STL,如果要聲明一個(gè)二元的整數(shù)數(shù)組,我們可以這樣:std::vector<std::vector<int>>如果要三維,四維,N維,還使用這種方式?先不說(shuō)這種代碼有多惡心,做起來(lái)有多麻煩,只要能完成工作就行了,但很多時(shí)候偏偏不能,比如在效率上有要求的時(shí)候(想一想vector的實(shí)現(xiàn),這種動(dòng)態(tài)增加如果發(fā)生在N維數(shù)組上)。而使用普通的數(shù)組,又不能很好配合STL算法,這在上面已經(jīng)提過(guò)了。而boost的multi_array組件提供了標(biāo)準(zhǔn)庫(kù)的接口,而且功能與效率上與普通數(shù)組一樣。下面是一個(gè)該組件的簡(jiǎn)單例子:#include?"boost/multi_array.hpp"void?test_array (){//?創(chuàng)建一個(gè) 3 x 4 x 2 的3D數(shù)組boost::multi_array<double,?3>?A(boost::extents[3][4][2]);typedef?boost::multi_array<double,?3>::index????index;//?給數(shù)組的元素賦值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++;//?輸出數(shù)組的元素值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幾乎等價(jià)于std::bitest,不同的是,dynamic_bitset的大小是可以在運(yùn)行時(shí)改變的。該組件在使用VC6.0下編譯不過(guò)。property map:property map定義了一套接口把key對(duì)象影射到相應(yīng)的value對(duì)象,所有具有下標(biāo)操作的類(lèi)型(比如指針、數(shù)組、std::map等)都可以作為它的元素。對(duì)property?map的需求最初來(lái)源于BGL。property map的接口包含三個(gè)全局函數(shù)get(),?put(), 和?operator[]。下面是property map的使用例子,例子中使用到了boost::associative_property_map類(lèi),但其實(shí)使用其它的具有下標(biāo)操作的類(lèi)型也一樣可以:#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可以接受不同的類(lèi)型的值,當(dāng)一個(gè)容器要接受不同的類(lèi)型元素時(shí)用它會(huì)很方便
compressed_pair與std::pair相似,但如果其中一個(gè)元素為空類(lèi)時(shí),會(huì)比std::pair更節(jié)省空間
tuple可以定義一個(gè)或多個(gè)元素的結(jié)構(gòu),作為函數(shù)返回值時(shí)會(huì)很方便
tuple:如果說(shuō),pair是可以定義有兩個(gè)元素的結(jié)構(gòu)體,那么tuple是可以定義1到10元素的結(jié)構(gòu)體。tuple的大部分定義是在boost::tuples::名字空間內(nèi)(除了某些很通用的是在boost::內(nèi))訪問(wèn)tuple元素可以通過(guò)兩個(gè)方式,t.get<N>()或者get<N>(t)這里,t是一個(gè)tuple實(shí)例。(第一種方法在VC6.0下編譯不過(guò))它的使用例子如下:#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組件提供的內(nèi)存分配可以使指針為作一個(gè)真正的原生指針,而又不用管理內(nèi)存。智能指針要比std::auto_prt的好,但并非不可以代替(之前網(wǎng)上有編文章評(píng)論沒(méi)有l(wèi)oki提供智能指針的好用,而且KFC也有相應(yīng)的組件。)
組件描述
pool內(nèi)存池管理
smart_ptr智能指針,總共提供了6種類(lèi)型
pool:pool是什么?pool是一套非常高效的內(nèi)存分配方案。為什么要使用pool?使用pool分配內(nèi)存得到的指針是真正的指針,這意味著,使用者可以對(duì)內(nèi)存有更多的控制(相對(duì)于智能指針)。使用pool接口,你可以選擇只運(yùn)行對(duì)象的析構(gòu)函數(shù)或只簡(jiǎn)單地對(duì)指向?qū)ο蟮闹羔樆厥铡ool會(huì)保證沒(méi)有內(nèi)存泄漏。什么時(shí)候使用pool?當(dāng)有大量小對(duì)象分配與回收,而又不想去親自去管理內(nèi)存時(shí)。總之,當(dāng)你想要高效率的方式去操縱內(nèi)存時(shí)用它會(huì)帶來(lái)很多好處。pool 提供了四個(gè)比較通常的組件:pool、object_pool、singleton_pool、pool_alloc。下面給出前兩個(gè)組件的簡(jiǎn)單使用樣例:#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,我們可以不用管內(nèi)存釋放。當(dāng)然,如果你想自己釋放內(nèi)存,可以使用void destroy(element_type * p)成員函數(shù)。這里element_type是傳進(jìn)來(lái)的模板參數(shù)類(lèi)型。object_pool是使用內(nèi)存池管理內(nèi)存,如果頻繁分配和刪除相同類(lèi)型的對(duì)象,object_pool要比直接調(diào)用new,delete高出幾個(gè)數(shù)量級(jí)。smart_ptr:STL的std::auto被很多人認(rèn)為是標(biāo)準(zhǔn)庫(kù)的一個(gè)缺陷,其實(shí)并不是這樣,只是因?yàn)閟td::auto提供的功能不夠豐富擺了,它缺少對(duì)引用數(shù)和數(shù)組的支持,并且,std::auto_ptr在被復(fù)制的時(shí)候會(huì)傳輸所有權(quán)。因?yàn)槿鄙僖?#xff0c;所以對(duì)象沒(méi)有共享所有權(quán),結(jié)果就不可以跟其它STL組件(比如容器)很好的配合使用。boost提供的智能指針正好補(bǔ)充了以上功能,比較通用的組件有:scoped_ptr,用于處理單個(gè)對(duì)象的唯一所有權(quán)。scoped_array,與scoped_ptr類(lèi)似,但是用來(lái)處理數(shù)組的。shared_ptr,允許共享對(duì)象所有權(quán)。shared_array,允許共享數(shù)組所有權(quán)。其它:date_time:一套處理日期與時(shí)間的組件,在它之前,我沒(méi)有發(fā)現(xiàn)有類(lèi)似的C++庫(kù),每次處理時(shí)間日期時(shí),都覺(jué)繁瑣且容易出錯(cuò),現(xiàn)在用它,就再也不用記浮點(diǎn)數(shù)0是哪年哪月哪日了。使用date_time要編譯boost代碼成相應(yīng)的庫(kù)。它的使用比較簡(jiǎn)單,下面給出例子:#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]?這里是大多數(shù)而不是全部,是因?yàn)閎oost不象STL那樣已經(jīng)標(biāo)準(zhǔn)化,主流的編譯器要么提供本地版本要么完全支持開(kāi)源版本。而目前boost的開(kāi)源版本可能不是每一個(gè)編譯器都能完全支持;另一個(gè)與STL不同的是,boost某些庫(kù)需要編譯成相應(yīng)的靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)才可以用。[2]?Boost?Graph Library(boost 圖形庫(kù),一套用于圖形的容器與算法組件)[3]?其實(shí)普通數(shù)組的指針也是可以看作為一種簡(jiǎn)單的iterator???????????

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

總結(jié)

以上是生活随笔為你收集整理的Boost入门的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。