2 C++ Boost 容器
C++ Boost 2 容器
在线文档:http://www.boost.org/doc/
离线文档:解压Boost压缩包,浏览boost_1_62_0/boost_1_62_0/libs/libraries.htm#Containers
目录:Boostany容器引用与指针复习,引用并不会退化boost.tuple,类似STL的pair键值对,但是tuple可以装10种不同的任意数据类型tuple的创建,值操作要注意的tuple.tie:创建一个所有元素类型为非const引用的tupletupleIO设定输出格式,只接受固定格式的输入Boost.arrayBoost.unordered无序数据插入Boost,unorderedhash_map桶的分布情况Boost:Multi-Array多维数组Boost多维数组,Boost.PropertyMapKey,valuePropertyTree解析XML文件PropertyTree生成XML文件PropertyTree解析JSON文件PropertyTree生成JSON文件
Boost any 容器
chunli@Linux:~/boost$catmain.cpp#include<iostream>#include<list>#include<boost/any.hpp>usingboost::any_cast;typedefstd::list<boost::any>many;voidappend_int(many&values,intvalue){boost::anyto_append=value;values.push_back(to_append);}voidappend_string(many&values,conststd::string&value){values.push_back(value);}voidappend_char_ptr(many&values,constchar*value){values.push_back(value);}voidappend_any(many&values,constboost::any&value){values.push_back(value);}voidappend_nothing(many&values){values.push_back(boost::any());}boolis_empty(constboost::any&operand){returnoperand.empty();}boolis_int(constboost::any&operand){returnoperand.type()==typeid(int);}boolis_char_ptr(constboost::any&operand){try{any_cast<constchar*>(operand);returntrue;}catch(constboost::bad_any_cast&){returnfalse;}}boolis_string(constboost::any&operand){returnany_cast<std::string>(&operand);}voidcount_all(many&values,std::ostream&out){out<<"#empty=="<<std::count_if(values.begin(),values.end(),is_empty)<<std::endl;out<<"#int=="<<std::count_if(values.begin(),values.end(),is_int)<<std::endl;out<<"#constchar*=="<<std::count_if(values.begin(),values.end(),is_char_ptr)<<std::endl;out<<"#string=="<<std::count_if(values.begin(),values.end(),is_string)<<std::endl;}intmain(){manym1;append_int(m1,128);append_int(m1,65535);append_char_ptr(m1,"Hello");append_string(m1,"Hello");append_nothing(m1);count_all(m1,std::cout);}chunli@Linux:~/boost$g++main.cpp-Wall&&./a.out#empty==1#int==2#constchar*==1#string==1chunli@Linux:~/boost$
引用与指针复习,引用并不会退化
chunli@Linux:~/boost$catmain.cpp#include<iostream>voidfun1(int(&a)[20]){std::cout<<sizeof(a)<<std::endl;std::cout<<a[0]<<std::endl;std::cout<<a[1]<<std::endl;}voidfun2(int*a){std::cout<<a[0]<<std::endl;std::cout<<a[1]<<std::endl;}intmain(){inta[20];a[0]=1;a[1]=111;fun1(a);fun2(a);return0;}chunli@Linux:~/boost$g++main.cpp-Wall&&./a.out8011111111chunli@Linux:~/boost$
boost.tuple,类似STL的pair键值对,但是tuple可以装10种不同的任意数据类型
tuple的创建,值操作要注意的
chunli@Linux:~/boost$catmain.cpp#include<iostream>#include<boost/tuple/tuple.hpp>classA{};intmain(){usingboost::tuple;doubled=2.7;Aa;tuple<int,double&,constA&>t(1,d,a);//创建tuple对象++boost::get<0>(t);inti=boost::get<0>(t);i=t.get<0>();boost::get<0>(t)=5;Aaa=boost::get<2>(t);//接收对象//Aaa=boost::get<3>(t);//下标溢出doublee=boost::get<1>(t);//数据类型自动转换boost::get<1>(t)=3.14;//修改值//boost::get<2>(t)="hello";//数据类型不匹配consttuple<int,double&,constA&>ct=t;//创建tuple对象intj=boost::get<0>(ct);//boost::get<0>(ct)=5;//无法修改const数据类型return0;}chunli@Linux:~/boost$g++main.cpp&&./a.outchunli@Linux:~/boost$
tuple.tie:创建一个所有元素类型为非const引用的tuple
chunli@Linux:~/boost$catmain.cpp#include<iostream>#include<boost/tuple/tuple.hpp>intmain(){inti;charc;doubled;boost::tie(i,c,d);//通过boost::tuple来修改boost::tie(i,c,d)=boost::tuple<int,char,double>(1,'A',3.1415926);std::cout<<i<<std::endl;std::cout<<c<<std::endl;std::cout<<d<<std::endl;chare;boost::tie(boost::tuples::ignore,e)=std::make_pair(1,'a');//ignorestd::cout<<e<<std::endl;return0;}chunli@Linux:~/boost$g++main.cpp-Wall&&./a.out1A3.14159achunli@Linux:~/boost$
tuple IO设定输出格式,只接受固定格式的输入
chunli@Linux:~/boost$catmain.cpp#include<iostream>#include<boost/tuple/tuple_io.hpp>usingnamespacestd;intmain(){//输出//默认输出(1602214129HelloBoost!)boost::tuple<float,int,string>a(1.0f,602214129,string("HelloBoost!"));cout<<a<<endl;//自定义输出格式[1,602214129,HelloBoost!]boost::tuple<float,int,string>b(1.0f,602214129,string("HelloBoost!"));cout<<boost::tuples::set_open('[')<<boost::tuples::set_close(']')<<boost::tuples::set_delimiter(',')<<b<<endl;//输入boost::tuple<int,int,int>i;cin>>i;cout<<i<<endl;boost::tuple<int,int>j;cin>>boost::tuples::set_open('[')>>boost::tuples::set_close(']')>>boost::tuples::set_delimiter(':');cin>>j;cout<<j<<endl;return0;}chunli@Linux:~/boost$chunli@Linux:~/boost$g++main.cpp&&./a.out(1602214129HelloBoost!)[1,602214129,HelloBoost!](123321213)[123,321,213][123:321][123,321]chunli@Linux:~/boost$g++main.cpp&&./a.out(1602214129HelloBoost!)[1,602214129,HelloBoost!]234567890[0,0,0][0,0]chunli@Linux:~/boost$
Boost.array
chunli@Linux:~/boost$catmain.cpp#include<iostream>#include<algorithm>#include<boost/array.hpp>usingnamespacestd;intmain(){//boost::array<int,10>arr1={9,1,8,2,7,3,6,4,0,5};//创建一个装int类型,容量是10个boost::array<int,10>arr1={{9,1,8,2,7,3,6,4,0,5}};//创建一个装int类型,容量是10个sort(arr1.begin(),arr1.end());copy(arr1.begin(),arr1.end(),ostream_iterator<int>(cout,""));return0;}chunli@Linux:~/boost$g++main.cpp-Wall&&./a.out0123456789chunli@Linux:~/boost$
Boost.unordered 数据插入
chunli@Linux:~/boost$catmain.cpp#include<iostream>#include<boost/unordered_map.hpp>usingnamespacestd;template<typenameIter>voidprint(Iterfirst,Iterlast){while(first!=last){cout<<first->first<<","<<first->second<<endl;first++;}}intmain(){boost::unordered_map<string,int>map1;map1.insert(make_pair("HelloBoost",11));map1.insert(make_pair("HelloWorld",12));map1.insert(make_pair("HelloLinux",13));map1.insert(make_pair("HelloC++",14));map1["apple"]=666;map1["banana"]=777;map1["pare"]=888;//map1["X2"],对map下标操作,如果key不存在,就插入.尽量少用这种费解的语法cout<<map1["对map下标操作,如果key不存在,就插入"]<<endl;//打印0print(map1.begin(),map1.end());return0;}chunli@Linux:~/boost$g++main.cpp-Wall&&./a.out0pare,888banana,777对map下标操作,如果key不存在,就插入,0apple,666HelloC++,14HelloLinux,13HelloWorld,12HelloBoost,11chunli@Linux:~/boost$
Boost,unordered hash_map桶的分布情况
chunli@Linux:~/boost$catmain.cpp#include<iostream>#include<boost/unordered_map.hpp>usingnamespacestd;template<typenameIter>voidprint(Iterfirst,Iterlast){while(first!=last){cout<<first->first<<","<<first->second<<endl;first++;}}intmain(){boost::unordered_map<string,int>map1;map1.insert(make_pair("HelloBoost",11));map1.insert(make_pair("HelloWorld",12));map1.insert(make_pair("HelloLinux",13));map1.insert(make_pair("HelloC++",14));map1["apple"]=666;map1["banana"]=777;map1["pare"]=888;//map1["X2"],对map下标操作,如果key不存在,就插入.尽量少用这种费解的语法cout<<map1["对map下标操作,如果key不存在,就插入"]<<endl;//打印0print(map1.begin(),map1.end());///////////////////查看有多少个元素/////////////////////////////cout<<"map1size:"<<map1.size()<<endl;//map1size:3///////////////////查看有多少个桶/////////////////////////////cout<<"当前共有"<<map1.bucket_count()<<"个桶"<<endl;///////////////////查看每个桶的分布情况/////////////////////////////cout<<"每个桶的情况如下"<<endl;intn=map1.bucket_count();for(inti=0;i<n;i++){cout<<"Bucket#"<<i<<":"<<map1.bucket_size(i)<<endl;}cout<<"-------------------------------------------"<<endl;typedefboost::unordered_map<string,int>::local_iteratorLIter;for(LIterit=map1.begin(0);it!=map1.end(0);++it){cout<<it->first<<""<<it->second<<endl;}return0;}chunli@Linux:~/boost$g++main.cpp-Wall&&./a.out0pare,888banana,777对map下标操作,如果key不存在,就插入,0apple,666HelloC++,14HelloLinux,13HelloWorld,12HelloBoost,11map1size:8当前共有16个桶每个桶的情况如下Bucket#0:2Bucket#1:0Bucket#2:0Bucket#3:0Bucket#4:0Bucket#5:0Bucket#6:1Bucket#7:1Bucket#8:1Bucket#9:2Bucket#10:0Bucket#11:1Bucket#12:0Bucket#13:0Bucket#14:0Bucket#15:0-------------------------------------------HelloLinux13HelloWorld12chunli@Linux:~/boost$
Boost:Multi-Array 多维数组
chunli@Linux:~/boost$catmain.cpp#include<iostream>#include"boost/multi_array.hpp"#include"boost/cstdlib.hpp"usingnamespacestd;intmain(){//Createa3Darraythatis3x4x2typedefboost::multi_array<double,3>array;arrayA(boost::extents[3][4][2]);//AssignavaluetoanelementinthearrayA[0][0][0]=3.14;if(A[0][0][0]==3.14){cout<<"yes!"<<endl;}else{cout<<"no!"<<endl;}return0;}chunli@Linux:~/boost$g++main.cpp-Wall&&./a.outyes!chunli@Linux:~/boost$
Boost 多维数组,
chunli@Linux:~/boost$catmain.cpp#include<stdio.h>#include"boost/multi_array.hpp"#include"boost/array.hpp"#include"boost/cstdlib.hpp"usingnamespacestd;intmain(){boost::array<int,3>shape={{5,5,5}};//普通数组,装3个数据boost::multi_array<int,3>A(shape);//设定3个维度的大小/////////////填充////////////////////////for(inti=0;i<5;i++){for(intj=0;j<5;j++){for(intk=0;k<5;k++){A[i][j][k]=(i+j+k)*(i+j+k);}}}////////////遍历/////////////////////////////for(inti=0;i<5;i++){for(intj=0;j<5;j++){for(intk=0;k<5;k++){printf("A[%d][%d][%d]=%3d,",i,j,k,A[i][j][k]);}printf("\n");}printf("\n");}return0;}chunli@Linux:~/boost$g++main.cpp&&./a.outA[0][0][0]=0,A[0][0][1]=1,A[0][0][2]=4,A[0][0][3]=9,A[0][0][4]=16,A[0][1][0]=1,A[0][1][1]=4,A[0][1][2]=9,A[0][1][3]=16,A[0][1][4]=25,A[0][2][0]=4,A[0][2][1]=9,A[0][2][2]=16,A[0][2][3]=25,A[0][2][4]=36,A[0][3][0]=9,A[0][3][1]=16,A[0][3][2]=25,A[0][3][3]=36,A[0][3][4]=49,A[0][4][0]=16,A[0][4][1]=25,A[0][4][2]=36,A[0][4][3]=49,A[0][4][4]=64,A[1][0][0]=1,A[1][0][1]=4,A[1][0][2]=9,A[1][0][3]=16,A[1][0][4]=25,A[1][1][0]=4,A[1][1][1]=9,A[1][1][2]=16,A[1][1][3]=25,A[1][1][4]=36,A[1][2][0]=9,A[1][2][1]=16,A[1][2][2]=25,A[1][2][3]=36,A[1][2][4]=49,A[1][3][0]=16,A[1][3][1]=25,A[1][3][2]=36,A[1][3][3]=49,A[1][3][4]=64,A[1][4][0]=25,A[1][4][1]=36,A[1][4][2]=49,A[1][4][3]=64,A[1][4][4]=81,A[2][0][0]=4,A[2][0][1]=9,A[2][0][2]=16,A[2][0][3]=25,A[2][0][4]=36,A[2][1][0]=9,A[2][1][1]=16,A[2][1][2]=25,A[2][1][3]=36,A[2][1][4]=49,A[2][2][0]=16,A[2][2][1]=25,A[2][2][2]=36,A[2][2][3]=49,A[2][2][4]=64,A[2][3][0]=25,A[2][3][1]=36,A[2][3][2]=49,A[2][3][3]=64,A[2][3][4]=81,A[2][4][0]=36,A[2][4][1]=49,A[2][4][2]=64,A[2][4][3]=81,A[2][4][4]=100,A[3][0][0]=9,A[3][0][1]=16,A[3][0][2]=25,A[3][0][3]=36,A[3][0][4]=49,A[3][1][0]=16,A[3][1][1]=25,A[3][1][2]=36,A[3][1][3]=49,A[3][1][4]=64,A[3][2][0]=25,A[3][2][1]=36,A[3][2][2]=49,A[3][2][3]=64,A[3][2][4]=81,A[3][3][0]=36,A[3][3][1]=49,A[3][3][2]=64,A[3][3][3]=81,A[3][3][4]=100,A[3][4][0]=49,A[3][4][1]=64,A[3][4][2]=81,A[3][4][3]=100,A[3][4][4]=121,A[4][0][0]=16,A[4][0][1]=25,A[4][0][2]=36,A[4][0][3]=49,A[4][0][4]=64,A[4][1][0]=25,A[4][1][1]=36,A[4][1][2]=49,A[4][1][3]=64,A[4][1][4]=81,A[4][2][0]=36,A[4][2][1]=49,A[4][2][2]=64,A[4][2][3]=81,A[4][2][4]=100,A[4][3][0]=49,A[4][3][1]=64,A[4][3][2]=81,A[4][3][3]=100,A[4][3][4]=121,A[4][4][0]=64,A[4][4][1]=81,A[4][4][2]=100,A[4][4][3]=121,A[4][4][4]=144,chunli@Linux:~/boost$
Boost.Property Map
chunli@Linux:~/boost$catmain.cpp#include<iostream>#include<map>#include<string>#include<boost/property_map/property_map.hpp>template<typenameAddressMap>voidfoo(AddressMapaddress){std::cout<<"foo:"<<sizeof(address)<<std::endl;typedeftypenameboost::property_traits<AddressMap>::key_typekey_type;typedeftypenameboost::property_traits<AddressMap>::value_typevalue_type;value_typeold_address,new_address;key_typefred="Fred";old_address=get(address,fred);new_address="384FitzpatrickStreet";put(address,fred,new_address);key_typejoe="工程师";value_type&joes_address=address[joe];joes_address="西湖中国浙江";}intmain(){std::map<std::string,std::string>name2address;boost::associative_property_map<std::map<std::string,std::string>>address_map(name2address);std::cout<<"std::map<std::string,std::string>:"<<sizeof(name2address)<<std::endl;name2address.insert(make_pair(std::string("Fred"),std::string("710West13thStreet")));name2address.insert(make_pair(std::string("Joe"),std::string("710West13thStreet")));std::cout<<"std::map<std::string,std::string>:"<<sizeof(name2address)<<std::endl;foo(address_map);for(std::map<std::string,std::string>::iteratori=name2address.begin();i!=name2address.end();i++){std::cout<<i->first<<":"<<i->second<<std::endl;}returnEXIT_SUCCESS;}chunli@Linux:~/boost$g++main.cpp-Wall&&./a.outstd::map<std::string,std::string>:48std::map<std::string,std::string>:48foo:8Fred:384FitzpatrickStreetJoe:710West13thStreet工程师:西湖中国浙江chunli@Linux:~/boost$
Property Tree 解析XML文件
chunli@Linux:~/boost$catdebug_persons.xml<debug> <total>3</total> <persons> <person> <age>23</age> <name>hugo</name> </person> <person> <age>23</age> <name>mayer</name> </person> <person> <age>30</age> <name>boy</name> </person> </persons></debug>chunli@Linux:~/boost$chunli@Linux:~/boost$catmain.cpp#include<boost/property_tree/ptree.hpp>#include<boost/property_tree/xml_parser.hpp>#include<boost/foreach.hpp>#include<vector>#include<string>#include<exception>#include<iostream>structperson{intage;std::stringname;};structdebug_persons{intitsTotalNumber;std::vector<person>itsPersons;voidload(conststd::string&filename);voidsave(conststd::string&filename);};std::ostream&operator<<(std::ostream&o,constdebug_persons&dp){o<<"totoal:"<<dp.itsTotalNumber<<"\n";o<<"persons\n";BOOST_FOREACH(constperson&p,dp.itsPersons){o<<"\tperson:Age:"<<p.age<<"Nmae:"<<p.name<<"\n";}returno;}voiddebug_persons::save(conststd::string&filename){usingboost::property_tree::ptree;ptreept;pt.put("debug.total",itsTotalNumber);BOOST_FOREACH(constperson&p,itsPersons){ptreechild;child.put("age",p.age);child.put("name",p.name);pt.add_child("debug.persons.person",child);}//WritepropertytreetoXMLfilewrite_xml(filename,pt);}voiddebug_persons::load(conststd::string&filename){usingboost::property_tree::ptree;ptreept;read_xml(filename,pt);itsTotalNumber=pt.get<int>("debug.total");BOOST_FOREACH(ptree::value_type&v,pt.get_child("debug.persons")){//m_modules.insert(v.second.data());personp;p.age=v.second.get<int>("age");p.name=v.second.get<std::string>("name");itsPersons.push_back(p);}}intmain(intargc,char*argv[]){try{debug_personsdp;dp.load("debug_persons.xml");std::cout<<dp<<std::endl;personp;p.age=100;p.name="oldman";dp.itsPersons.push_back(p);dp.save("new.xml");std::cout<<"Success\n";}catch(std::exception&e){std::cout<<"Error:"<<e.what()<<"\n";}return0;}chunli@Linux:~/boost$g++main.cpp-Wall&&./a.outtotoal:3personsperson:Age:23Nmae:hugoperson:Age:23Nmae:mayerperson:Age:30Nmae:boySuccesschunli@Linux:~/boost$
Property Tree 生成XML文件
chunli@Linux:~/boost$catmain.cpp#include<iostream>#include<boost/property_tree/ptree.hpp>#include<boost/property_tree/xml_parser.hpp>#include<boost/foreach.hpp>#include<string>#include<vector>usingnamespacestd;intmain(intargc,char**argv){vector<string>vect_str;vector<string>::iteratorit;vect_str.push_back("111111");vect_str.push_back("222222");vect_str.push_back("333333");vect_str.push_back("444444");usingnamespaceboost::property_tree;ptreept;//定义一个树ptptreeout;ptreecond;ptreerule;ptreedata;ptreeinfo;for(it=vect_str.begin();it!=vect_str.end();it++)//迭代vector{data.put("<xmlattr>.key",it->data());info.add_child("data",data);data.clear();}pt.add_child("root.output.info",info);info.clear();BOOST_FOREACH(std::string&str,vect_str)//迭代vector{for(inti=0;i<2;i++){cond.put("<xmlattr>.desc","123");cond.put("<xmlattr>.path","345");cond.put("<xmlattr>.version","567");cond.put("<xmlattr>.priority","789");rule.add_child("cond",cond);cond.clear();}out.put("<xmlattr>.where",str);rule.add_child("out",out);out.clear();pt.add_child("root.output.rule",rule);rule.clear();}//设置写入xml文件的格式,boost::property_tree::xml_writer_settings<string>settings=boost::property_tree::xml_writer_make_settings<string>('',4);//把property_tree转为XML文件write_xml("newconfig.xml",pt,std::locale(),settings);return0;}chunli@Linux:~/boost$g++main.cpp-Wall&&./a.outchunli@Linux:~/boost$catnewconfig.xml<?xmlversion="1.0"encoding="utf-8"?><root><output><info><datakey="111111"/><datakey="222222"/><datakey="333333"/><datakey="444444"/></info><rule><conddesc="123"path="345"version="567"priority="789"/><conddesc="123"path="345"version="567"priority="789"/><outwhere="111111"/></rule><rule><conddesc="123"path="345"version="567"priority="789"/><conddesc="123"path="345"version="567"priority="789"/><outwhere="222222"/></rule><rule><conddesc="123"path="345"version="567"priority="789"/><conddesc="123"path="345"version="567"priority="789"/><outwhere="333333"/></rule><rule><conddesc="123"path="345"version="567"priority="789"/><conddesc="123"path="345"version="567"priority="789"/><outwhere="444444"/></rule></output></root>chunli@Linux:~/boost$
Property Tree 解析JSON文件
chunli@Linux:~/boost$cattest.json{"rate":{"linktype":[0.8,1.0,1.0,0.7,0.4,0.7,0.8,0.8,0.9,0.9,0.4,0.8,1.0],"width":[[0.6,0.8],[0.7,0.87],[1.0,1.2],[1.2,1.4],[1.0,1.0]],"use_toll":[0.33,1.2]},"turn_cost":{"uturn":{"Hturn":0,"triangle":1200,"normal":[1200,300,60,5]}}}chunli@Linux:~/boost$catmain.cpp#include<iostream>#include<boost/property_tree/ptree.hpp>#include<boost/property_tree/json_parser.hpp>#include<boost/foreach.hpp>usingnamespacestd;intmain(){boost::property_tree::ptreept;boost::property_tree::json_parser::read_json("test.json",pt);boost::property_tree::ptreechild_linktype=pt.get_child("rate.linktype");BOOST_FOREACH(boost::property_tree::ptree::value_type&vt,child_linktype){cout<<vt.second.get_value<double>()<<"";}cout<<endl;return0;}chunli@Linux:~/boost$g++main.cpp-Wall&&./a.out0.8110.70.40.70.80.80.90.90.40.81chunli@Linux:~/boost$
Property Tree 生成JSON文件
chunli@Linux:~/boost$catmain.cpp#include<iostream>#include<string>#include<boost/property_tree/ptree.hpp>#include<boost/property_tree/json_parser.hpp>#include<boost/foreach.hpp>usingnamespacestd;usingnamespaceboost::property_tree;intmain(){ptreept_1,pt_11,pt_12;pt_11.put("id","3445");pt_11.put<int>("age",29);pt_11.put("name","chen");pt_12.push_back(make_pair("",pt_11));pt_12.push_back(make_pair("",pt_11));//replaceorcreatechildnode"data"pt_1.put_child("data",pt_12);ostringstreamos;write_json(os,pt_1);cout<<os.str()<<endl;return0;}chunli@Linux:~/boost$g++main.cpp-Wall&&./a.out{"data":[{"id":"3445","age":"29","name":"chen"},{"id":"3445","age":"29","name":"chen"}]}chunli@Linux:~/boost$
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。