您的位置:首页 > 其它

boost库常用功能

2015-07-23 23:06 357 查看

1、shared_ptr

shared_ptr除了最基本的可以用new初始化以外,还可以使用其他方式初始化。在使用一些c的api时候,这种初始化方式非常有用,如下

boost::shared_ptr<CURL>curl_(curl_easy_init(),curl_easy_cleanup);
上面这段代码用来初始化一个curl的shared_ptr。

2、promise,future

#include<boost/thread.hpp> #include<boost/thread/future.hpp> #include<iostream> usingnamespacestd; intmain() { boost::promise<int>pi; boost::unique_future<int>fi; fi=pi.get_future(); //等待2s,超时返回0,被promise被set返回1 cout<<"waitover:"<<fi.timed_wait(boost::posix_time::milliseconds(2000))<<endl; //检查promise是否被set cout<<"isready:"<<fi.is_ready()<<endl; pi.set_value(42); cout<<"waitover:"<<fi.timed_wait(boost::posix_time::milliseconds(2000))<<endl; cout<<"isready:"<<fi.is_ready()<<endl; cout<<fi.get()<<endl; } 上面代码运行结果为



future和promise配合可以应用在各种多线程环境下。

比如有些异步api(如zookeeper的watch),提高了编程难度。当我们想要并不要求效率,或者对时序有要求时,可以使用promise和future将这些异步api改为同步

intmain() { boost::promise<int>pi; boost::unique_future<int>fi=pi.get_future(); charcontent[1024]="\0"; intsize=1024; zoo_wget(zk_handle,path,callback,static_cast<void*>(&pi),content,&size,NULL)); fi.get(); } voidcallback(zhandle_t*zh,inttype,intstate,constchar*path,void*watcherCtx) { boost::promise<int>*pi=static_cast<boost::promise<int>*>(watcherCtx); pi->set_value(1); }

3、regex

match

boost::regexr("(a*)ddd(b*)ddd"); boost::smatchm; if(boost::regex_match(string("aaaadddbbbddd"),m,r)) { cout<<m.size()<<endl; for(size_ti=0;i<m.size();++i) { //0表示匹配到的整个字符串,1以后的index表示括号中匹配的内容 cout<<m[i]<<endl; } }

search

boost::regexr("(a+)"); stringcontent="bbbaaaaacccaaaaddddaaaeeeaaa"; boost::smatchm; string::const_iteratorstrstart=content.begin(); string::const_iteratorstrend=content.end(); while(boost::regex_search(strstart,strend,m,r)) { //search到的结果,0表示整个,1以后表示括号的index匹配的结果 cout<<m[1]<<endl; //从上次搜索到的地方接着搜索 strstart=m[0].second; }

regex_token_iterator


boost::regexr("(a)c");
stringcontent="bbbaaaaacccaaaaddddaaaeeeaaa";
//第四个参数0表示匹配到的整个字符串,1以后表示括号中的index,-1表示匹配除了本字符串以外的,可以用来分割字符串
boost::sregex_token_iteratoriter(content.begin(),content.end(),r,-1);
boost::sregex_token_iteratorend;

for(;iter!=end;++iter)
{
cout<<*iter<<endl;
}

regex_replace

classfunc{
public:
func(vector<string>vec){
_vec=vec;
_index=0;
}
stringaaa(boost::match_results<std::string::const_iterator>match){
stringaa=_vec[_index];
cout<<_index<<endl;
_index++;
cout<<_index<<endl;
returnaa;
}
private:
vector<string>_vec;
int_index;
};

intmain(intargc,char*argv[])
{
vector<string>test;
test.push_back("1");
test.push_back("2");
test.push_back("3");
test.push_back("4");
test.push_back("5");
test.push_back("6");
test.push_back("7");
std::strings="a?b?bc?d?e?";
std::stringb="a?b?bc?d?e?";
std::cout<<s<<std::endl;
boost::regexreg("\\?");

funcf(test);
boost::function<std::string(boost::match_results<std::string::const_iterator>)>function1=
boost::bind(&func::aaa,&f,_1);
//替换s中的所有符合r的字符串
//第三个参数可以放一个函数对象或者boost::function类型,用来实现特殊逻辑
s=boost::regex_replace(s,reg,function1);
std::cout<<s<<std::endl;
return0;
}

4、path

namespacebf=boost::filesystem;
stringmy_path="/";
bf::pathfile_path(my_path);
bf::directory_iteratorend_iter;
//遍历目录下的文件
for(bf::directory_iteratorfile_itr(file_path);file_itr!=end_iter;++file_itr)
{
stringfname=file_itr->path().filename().string();
cout<<fname<<endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: