最近在读Boost的代码,将一些Boost库中好用的模块用法以及实现分析写一下咯,不定期更新。
注意:在使用Boost时不要再偷懒直接使用using namespace std;
了,因为Boost中有很多和标准库中重名的情况,而namespace
的引入也正是为了解决这个问题,合理正确地使用命名空间,是一个合格的cpper应该做的事。
Timer
目前版本的Boost(1.62)中含有两个版本的timer,一个是timer
(v1),是使用C/C++库函数实现的低精度(依赖于操作系统或编译器)版本,timer不需要链接库,只需要包含<boost/timer.hpp>;二是cpu_timer
(v2),是基于chrono
库使用操作系统的API,计时的精度更高。
timer
1 |
|
Boost中的timer是通过调用C/C++的库函数clock()
来实现的:
1 | class timer |
而std::clock()
是在C++中的ctime.h
中定义的:
1 | std::clock_t clock(void); |
其中std::clock_t
也定义在ctime.h
中。
Defined in header
typedef /* unspecified */ clock_t;
Arithmetic type capable of representing the process running time of implementation-defined range and precision.
其实上面调用timer的代码就等同于:
1 |
|
注意:每秒的clock数由宏CLOCKS_PER_SEC
定义,CLOCKS_PER_SEC
的值在各个操作系统下不一。在win32下是1‘000(计时精度则为1s/1’000=1ms(毫秒)),在Linux下是1’000’000(计时精度为1s/1’000’000=1μs(微秒))。
progress_timer
progress_timer
继承自timer
类,因此具有timer类的所有成员函数(接口与timer相同),我们可以progress_timer
对象进行可对timer
对象的任何操作。
progress_timer的构造函数由timer的构造函数+progress_timer中定义的构造函数构成。progress_timer
构造时需传递一个IO流对象,以便析构时将时间输出至该流。默认是std::cout
,也可以使用其他标准输出流(ofsttream/ostringstream)替换,或者时所用cout.rdbuf()重定向cout的输出。
1 | public: |
可以看到,当我们构造一个progress_timer
时会自动开始计时(timer::timer()
),并且在progress_timer
析构时会输出从对象构造开始至析构期间的时间。
progress_display
progress_display
可以在控制台显示程序的执行进度,我觉得这个类没什么卵用就不写了…
date_time
Boost有date_time库用来处理时间,date_time需要编译才能使用,需要在编译时链接boost_date_time
库。
date_time包含两部分,一是处理日期的gregorian
和处理时间的posix_time
。
更多关于boost中date_time的接口用法可以看这里:Chapter 10. Boost.Date_Time
date_time基本涵盖了我们对于日期之间计算的需求,不过date_time库的日期基于格里高利历,只能支持从1400-01-01到9999-12.31之间的日期。
这个废话也不多说,直接看一些简单常用的用法…更多的用法可以看Boost的文档或者《Boost程序库完全开发之南》。
1 |
|
date_time中date类的部分代码:
具体的可以看boostcode/date_time/date.hpp
1 | template<class T, class calendar, class duration_type_> |