zoukankan      html  css  js  c++  java
  • boost库常用功能

    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>
    
    using namespace std;
    
    int main()
    {
        boost::promise<int> pi;
        boost::unique_future<int> fi;
        fi=pi.get_future();
        //等待2s,超时返回0,被promise被set返回1
        cout << "wait over:" << fi.timed_wait(boost::posix_time::milliseconds(2000)) << endl;
        //检查promise是否被set
        cout << "is ready:" << fi.is_ready() << endl;
        
        pi.set_value(42);
        cout << "wait over:" << fi.timed_wait(boost::posix_time::milliseconds(2000)) << endl;
        cout << "is ready:" << fi.is_ready() << endl;
        cout << fi.get() << endl;
    }   

    上面代码运行结果为

    image

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

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

    int main()
    {
        boost::promise<int> pi; 
        boost::unique_future<int> fi = pi.get_future();
        char content[1024] = "";
        int size = 1024;
        zoo_wget(zk_handle, path, callback, static_cast<void*>(&pi), content, &size, NULL));
        fi.get();
    }
    
    void callback(zhandle_t* zh, int type, int state, const char* path, void* watcherCtx)
    {
        boost::promise<int>* pi = static_cast<boost::promise<int>*>(watcherCtx);
        pi->set_value(1);
    }

    3、regex

    match

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

    search

        boost::regex r("(a+)");
        string content = "bbbaaaaacccaaaaddddaaaeeeaaa";
        boost::smatch m;
        string::const_iterator strstart = content.begin();
        string::const_iterator strend = 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::regex r("(a)c");
        string content = "bbbaaaaacccaaaaddddaaaeeeaaa";
        //第四个参数0表示匹配到的整个字符串,1以后表示括号中的index,-1表示匹配除了本字符串以外的,可以用来分割字符串
        boost::sregex_token_iterator iter(content.begin(), content.end(), r, -1);
        boost::sregex_token_iterator end;
    
        for(; iter != end; ++ iter)
        {
            cout<< *iter << endl;
        }

    regex_replace

    class func {
        public:
            func(vector<string> vec){
                _vec = vec;
                _index = 0;
            }   
            string aaa(boost::match_results<std::string::const_iterator> match){
                string  aa = _vec[_index];
                cout <<_index<<endl;
                _index++;
                cout <<_index<<endl;
                return aa;
            }   
        private:
            vector<string> _vec;
            int _index;
    };      
    
    
    int main(int argc, 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::string s="a ? b ?b c? d? e?";
        std::string b="a ? b ?b c? d? e?";
        std::cout << s << std::endl; 
        boost::regex reg("\?");
        
        func f(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;
        return 0;
    }
    

    4、path

        namespace bf = boost::filesystem;
        string my_path = "/";
        bf::path file_path(my_path);
        bf::directory_iterator end_iter;
        //遍历目录下的文件
        for (bf::directory_iterator file_itr(file_path); file_itr != end_iter; ++file_itr)
        {   
            string fname = file_itr->path().filename().string();
            cout << fname << endl;
        } 
  • 相关阅读:
    数据可视化之DAX篇(二十)Think in DAX 之报表自动化实践
    数据可视化之DAX篇(十九)值得你深入了解的函数:SUMMARIZE
    数据可视化之DAX篇(十八)收藏 | DAX代码格式指南
    数据可视化之DAX篇(十七)Power BI表格总计行错误的终极解决方案
    atomic_compare_exchange_weak_explicit (Atomic operations) – C 中文开发手册
    Spring Boot的How-to指南:嵌入式Web服务器
    C# 文本文件的读写
    CSS outline 属性
    operator (Numeric & Mathematical) – Python 中文开发手册
    HTML DOM Style animationDirection 属性
  • 原文地址:https://www.cnblogs.com/xhcqwl/p/4672048.html
Copyright © 2011-2022 走看看