[Boost]boost, C++的扩展库

如果你的经历是在学校接触了C语言,然后一直使用,后来开始学C++…中间偶尔接触其他高级语言...但还是在使用着C或C++,你应该会有下面的感受:

1> C语言,严谨的一门中级语言,给你(开发者)发挥空间。C的语法很少,标准的函数库涉及范围也较小,使用面向过程编程,加上经典的pointer指针操作构成了它的全部。这里好像我不看好它,其实不是的,我觉得C语言的是必不可少的,强大的。在学习层面来说,它是很好的入门语言,比汇编可读性强易理解,比Java,C++的知识范围少。从应用层面来讲,许多底层开发,不需要太复杂的逻辑,软硬件资源有限,同时兼顾性能,没有必要使用太高级的语言,使用C就可以做到。

2>C++,一种面向对象编程的高级语言,相对C语言,很多库函数更加方便了。它给人感觉能做所有事情,是的。可是,跟Java,或动态语言python作比较,很多操作还是很繁琐的。在此举一个简单的例子,将字符串"2012-12-21"打印成为"21 Dec 2012”.

C++:

隐藏行号 复制代码 date_convert.cpp
  1. #include <iostream>
    
  2. #include <string>
    
  3. using namespace std;
    
  4. int main() {
    
  5.     string str = "2012-12-21";
    
  6.     string month_array[12] = {"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
    
  7.     int year_,month_,day_;
    
  8.     sscanf(str.c_str(),"%d-%d-%d",&year_,&month_,&day_);
    
  9.     cout << day_ << " " << month_array[month_-1] << " " << year_ << endl;;
    
  10.     return 0;
    
  11. }
    

Java:

date_convert.java
  1. import java.text.ParseException;
    
  2. import java.text.SimpleDateFormat;
    
  3. import java.util.Date;
    
  4. import java.util.Locale;
    
  5. public class HelloWorld {
    
  6.     public static void main(String[] args) {
    
  7.         String str_ = "2012-12-21";
    
  8.         SimpleDateFormat sdf_ = new SimpleDateFormat("yyyy-MM-dd");
    
  9.         Date date_ = null;
    
  10.         try {
    
  11.             date_ = sdf_.parse(str_);
    
  12.         } catch (ParseException e) {
    
  13.             e.printStackTrace();
    
  14.         }
    
  15.         Locale.setDefault(new Locale("en","US"));        
    
  16.         System.out.println((new SimpleDateFormat("d MMM yyyy")).format(date_).toUpperCase());
    
  17.     }
    
  18. }
    

Python:

date_convert.py
  1. import datetime
  2. if __name__ == "__main__":
  3.     in_date = "2012-12-21"
  4. print datetime.datetime.strptime(in_date,"%Y-%m-%d").date().strftime("%d %b %Y").upper()

看到这里,相信大家已经有感觉到了。由于C++标准库里面没有date相关的库支持,所作的转换都需要自己设计,而java和python有库支持,可以直接用库来做字符解析、格式化等操作。所以,扩展C++的库显得还是很有必要的。

那么,该boost登场了。boost是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一。来看看boost怎么写上述的问题:

C++ using Boost:

隐藏行号 复制代码 date_convert.cpp
  1. #include <iostream>
    
  2. #include <string>
    
  3. #include <boost/date_time/gregorian/gregorian.hpp>
    
  4. #include <locale>
    
  5. using namespace std;
    
  6. int main() {
    
  7.     using namespace std;
    
  8.     using namespace boost::gregorian;
    
  9.     string in_date("2012-12-21");
    
  10.     date date_(from_simple_string(in_date));
    
  11.     date_facet *f(new date_facet("%d %b %Y"));
    
  12.     cout.imbue(locale(cout.getloc(),f));
    
  13.     cout << date_ << endl;
    
  14.     return 0;
    
  15. }
    

可以看出,这里使用boost的date_time后,日期的读取设输出变得比c++写法自如多了。

这篇帖子只是boost库的抛砖引玉,我会写一个系列来介绍常用到的boost库函数,以及用boost来解决一些日常的一些操作。敬请期待。

posted on 2013-01-03 10:45  _小球儿_  阅读(1360)  评论(0编辑  收藏  举报

导航