[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++:
-
#include <iostream>
-
#include <string>
-
using namespace std;
-
int main() {
-
string str = "2012-12-21";
-
string month_array[12] = {"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
-
int year_,month_,day_;
-
sscanf(str.c_str(),"%d-%d-%d",&year_,&month_,&day_);
-
cout << day_ << " " << month_array[month_-1] << " " << year_ << endl;;
-
return 0;
-
}
Java:
-
import java.text.ParseException;
-
import java.text.SimpleDateFormat;
-
import java.util.Date;
-
import java.util.Locale;
-
public class HelloWorld {
-
public static void main(String[] args) {
-
String str_ = "2012-12-21";
-
SimpleDateFormat sdf_ = new SimpleDateFormat("yyyy-MM-dd");
-
Date date_ = null;
-
try {
-
date_ = sdf_.parse(str_);
-
} catch (ParseException e) {
-
e.printStackTrace();
-
}
-
Locale.setDefault(new Locale("en","US"));
-
System.out.println((new SimpleDateFormat("d MMM yyyy")).format(date_).toUpperCase());
-
}
-
}
Python:
-
import datetime
-
if __name__ == "__main__":
-
in_date = "2012-12-21"
-
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:
-
#include <iostream>
-
#include <string>
-
#include <boost/date_time/gregorian/gregorian.hpp>
-
#include <locale>
-
using namespace std;
-
int main() {
-
using namespace std;
-
using namespace boost::gregorian;
-
string in_date("2012-12-21");
-
date date_(from_simple_string(in_date));
-
date_facet *f(new date_facet("%d %b %Y"));
-
cout.imbue(locale(cout.getloc(),f));
-
cout << date_ << endl;
-
return 0;
-
}
可以看出,这里使用boost的date_time后,日期的读取设输出变得比c++写法自如多了。
这篇帖子只是boost库的抛砖引玉,我会写一个系列来介绍常用到的boost库函数,以及用boost来解决一些日常的一些操作。敬请期待。