C++常用方法之Boost

安装:

在boost官网下载相应版本的库 http://www.boost.org/,再解压到/usr/local/目录下,就能使用了,如需要编译用于发布则可编译安装.so和.a库,具体如下:

http://www.boost.org/doc/libs/1_62_0/more/getting_started/windows.html

编译:

g++  test.cpp -o test -I/usr/local/boost_1_61_0

 

lexical_cast进行字符串、整数/浮点数之间的字面转换:

#include <boost/lexical_cast.hpp>
#include <iostream>
#include <string>
int main()
{
    int a = boost::lexical_cast<int>("123456");
    std::cout << a << std::endl;
    double b = boost::lexical_cast<double>("123.12");
    std::cout << b << std::endl;
    long double c = boost::lexical_cast<long double>("123.11");
    std::cout << c << std::endl;

    const double d = 123.12;
    std::string s = boost::lexical_cast<std::string>(d);
    std::cout << s << std::endl;

    int i;
    try{
        i = boost::lexical_cast<int>("abc");
    }
    catch(boost::bad_lexical_cast & e)
    {
        std::cout << e.what() << std::endl;
        return -1;
    }
    std::cout << i << std::endl;

    return 0;
}
123456
123.12
123.11
123.12
bad lexical cast: source type value could not be interpreted as target

progress进度条指示:

#include <boost/progress.hpp>
#include <fstream>
#include <string>
#include <vector>
#include <iterator>
int main()
{
    std::vector<std::string> v(100);
    std::ofstream fs("test");
    boost::progress_display pd(v.size());
    std::vector<std::string>::iterator pos;
    for(pos=v.begin();pos!=v.end();++pos)
    {
        fs<<*pos<<std::endl;
        ++pd;
        sleep(1);
    }
    return 0;
}

0%   10   20   30   40   50   60   70   80   90   100%
|----|----|----|----|----|----|----|----|----|----|
********

date_time扩展来处理时区的问题:

#include <boost/date_time/gregorian/gregorian.hpp>
#include <iostream>
int main()
{
        boost::gregorian::date d(2010, 1, 30);
        std::cout << d.year() << std::endl;
        std::cout << d.month() << std::endl;
        std::cout << d.day() << std::endl;
        std::cout << d.day_of_week() << std::endl;
        std::cout << d.end_of_month() << std::endl;
}
2010
Jan
30
Sat
2010-Jan-31

scoped_ptr等智能指针避免内存泄漏:

#include <boost/shared_ptr.hpp>
#include <boost/scoped_ptr.hpp>
#include <iostream>
#include <string>
int main()
{
    boost::shared_ptr<std::string> p1(new std::string("123"));
    std::cout << *p1 << '\n';
    boost::shared_ptr<std::string> p2(p1);
    p1.reset(new std::string("234"));
    std::cout << *p1.get() << '\n';
    std::cout << *p2.get() << '\n';
    p1.reset();
    std::cout << std::boolalpha << static_cast<bool>(p2) << '\n';

    boost::scoped_ptr<std::string> p3(new std::string("qwe"));
    std::cout << *p3 << std::endl;
    //boost::scoped_ptr<std::string> p4(p3); // error , is privated
    //p3.reset(); //delete p3

    return 0;
}
123
234
123
true
qwe

format替代C里面的sprintf进行字符串化:

#include <boost/format.hpp>
#include <iostream>
int main()
{
    std::cout << boost::format("writing %1%, x=%2% : %3%-th try") % "to" % 40.23 % 50 << std::endl;
    boost::format f("a=%1%, b=%2%, c=%3%, a=%1%");
    f % "string" % 2 % 10.0;
    std::cout << f.str() << std::endl;
}
writing to, x=40.23 : 50-th try
a=string, b=2, c=10, a=string

algorithm/string字符串算法库:

#include <boost/algorithm/string.hpp>
#include <iostream>
#include <vector>
#include <string>
int main()
{
        std::string str("readme.txt");
        if(boost::ends_with(str,"txt"))
        {
                std::cout << boost::to_upper_copy(str) + "UPPER" << std::endl;
                assert(boost::ends_with(str, "txt"));
        }
        boost::replace_first(str, "readme", "followme");
        std::cout << str << std::endl;
        std::vector<char> v(str.begin(),str.end());
        std::vector<char> v2 = boost::to_upper_copy(boost::erase_first_copy(v, "txt"));
        for(int i=0; i<v2.size(); ++i)
        {
                std::cout << v2[i];
        }
        std::cout << std::endl;
        return 0;
}
README.TXTUPPER
followme.txt
FOLLOWME.

tokenizer用于分词的字符串处理库:

#include <boost/tokenizer.hpp>
#include <string>
#include <iostream>
int main(void)
{
        std::string s("This is , a ,test!");
        boost::tokenizer<> tok(s);
        for(boost::tokenizer<>::iterator beg=tok.begin(); beg!=tok.end();++beg)
        {
                std::cout << *beg << " ";
        }
        return 0;
}
This is a test

xpressive正则表达式库,比原来的正则表达式库boost.regex要好的是不需要编译:

#include <boost/xpressive/xpressive_dynamic.hpp>
#include <iostream>
int main()
{
        boost::xpressive::cregex reg = boost::xpressive::cregex::compile("a.c");
        std::cout << boost::xpressive::regex_match("abc", reg) << std::endl;
        std::cout << boost::xpressive::regex_match("a+c", reg) << std::endl;
        std::cout << !boost::xpressive::regex_match("ac", reg) << std::endl;
        std::cout << !boost::xpressive::regex_match("abd", reg) << std::endl;
        return 0;
}
1
1
1
1

any一种通用的数据类型,可以将类型包装后统一放在容器中:

#include <boost/any.hpp>
#include <iostream>
#include <vector>
#include <string>
int main(void)
{
        typedef std::vector<boost::any> many;
        many a;
        a.push_back(2);
        a.push_back(std::string("test"));
        for(unsigned int i=0; i < a.size(); ++i)
        {
                std::cout << a[i].type().name() << std::endl;
                try
                {
                        int result = boost::any_cast<int>(a[i]);
                        std::cout << result << std::endl;
                }
                catch(boost::bad_any_cast & ex)
                {
                        std::cout << "cast error:" << ex.what() << std::endl;
                }
        }
        return 0;
}
i
2
NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
cast error:boost::bad_any_cast: failed conversion using boost::any_cast


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值