参考书从boost库最简单的库开始编写,这对初学者甚好。
虽然简单,但是我也只是用到了BOOST库timer库中的timer组件,date_time显得稍微更加的强大些[ 也更显复杂一些 ]。先让脚步迈进门,然后学习点BOOST编库的思想。
boost使用time及date_time库来解决日期和时间问题[ 从timer组件迈进门 ]。
timer库提供简易的度量时间和进度显示功能。主要包含三个组件:
计时器类 | 进度指示类 |
timer组件,progress_timer组件 | Progress_display组件 |
timer组件由构造函数,4个成员函数和一个数据成员(_start_time)组成。
restart()设置当前时间[自进程启动以来的时间 ]给时间变量。
调用<ctime>里面的clock函数及windows下每秒的clock数宏CLOCKS_PRE_SEC。
elapsed_max()返回timer能够测量的最大时间范围。
调用<ctime>里面的clock函数、标准库里面的数值极限numeric_limits及windows下每秒的clock数宏CLOCKS_PRE_SEC。
elapsed_min()返回timer能够测量的最小时间精度。
调用每秒的clock数宏CLOCKS_PRE_SEC。
elapsed()测量在timer对象被创建时到执行此条语句的时间。
调用<ctime>里面的clock函数及及windows下每秒的clock数宏CLOCKS_PRE_SEC。
CLOCKS_PRE_SEC宏定义了每秒下的clock数,这个值因操作系统不同而不同,windows下为1000,linux下为1000000。这个值决定timer组件的计时精度[elapsed_min() ]。
std::clock()函数,它返回自进程启动以来的clock数。每秒的clock数由CLOCKS_PRE_SEC宏值决定。
那么timer组件的各个函数通过标准库的变量及函数来实现的呢?
0.timer():将进程启动的值赋值给时间变量,_start_time=std::clock();
1.restart():设置当前时间给时间变量,只需一条语句:_start_time= std::clock();
2.elapsed_min():每秒的clock数为1000下,那么可以得到的最小时间精度为(double)1/(double)CLOCKS_PRE_SEC
3.elapsed():用自进程启动以来的时间减去_start_time的值。
4.elapsed_max():用标准库里的最大数值减去_srart_time的值( timer组件是以秒为单位的,所以还需要除以CLOCKS_PRE_SEC )
在调用过restart函数过后,_start_time的值不再是进程启动时的值。elapsed_min()及elapsed_max()体现了timer组件的计时能力,能够计时的最小精度值[0.001s ] 及最大计时范围段[592.532h,时间戳 ]。使用timer组件时可以参考这两个函数决定符不符合需求。
可在控制台程序中在包含了boost timer组件头文件[ #include <boost/time.hpp> ]后直接调用这些函数,然后输出到控制台观察结果。只是尽管是控制台程序,但是当使用timer t;时标明定义了一个对象,对应的构造函数就会被系统执行,并且后期的代码都是通过此对象来引用的[学C++的人都晓得,我没C++课程就记录一下子 ]。
<pre class="cpp" name="code">#include "stdafx.h"#include <iostream> using namespace std;#include <boost/timer.hpp> using namespace boost;int _tmain(int argc, _TCHAR* argv[]) { timer t; cout << "max timespan:"<< t.elapsed_max() / 3600 << "h"; cout << "\nmin timespan:"<< t.elapsed_min() << "s"; cout << "\ntime elapsed:"<< t.elapsed()<<"s"; getchar(); }
当然,程序的运行效果为下图所示:
Progress_timer继承于timer,它拥有了timer的全部属性。Progress_timer还具有自己的析构函数。若将progress_timer对象放在main函数内的大括号内则当运行程序时progress_timer对象会自动输出elapsed的时间。用多个大括号将progress_timer对象括起来时[多个局部的progress_timer对象 ],就会输出多个时间段。这个功能由progress_timer的构造函数实现:progres_timer( std::ostream& os );
Progress_display可以在控制台上显示程序[如程序中将字符串写入到文本文件的进度 ]执行的进度。
在VS2010中新建一个空的控制台程序,然后编写以下代码,就可以看到进度条出现的过程了[短 ]
。
#include "stdafx.h" #include <boost/progress.hpp> using namespace boost; #include "ace/Log_Msg.h" #include <iostream> #include <fstream> #include <vector> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { vector<string> str(10000); ofstream ofs("C:\\Users\\XRL\\Desktop\\file.txt"); progress_display pd(str.size()); vector<string>::iterator pos; for( pos = str.begin(); pos != str.end();++pos ){ ofs << *pos ; ++pd; } getchar(); }
控制台程序运行结果如下:
最开始虽然一直知道boost是一个C++库[准标准就不夸奖了 ],但是跟它一直有个隔阂。就像知道西施很美一样,但是我至今不知道西施长什么样子[那BOOST的C++库又是啥子样子 ],所以我还是觉得西施长得很“抽象”。或许我见过西施的背影或者侧面之后情况会比较好一些,起码我以后见到西施正面我就能够根据以前见到的背影和侧面将其认出来。在见到背影或者侧面之后我还会对西施之美做一些评价。
今天找了本书看了boost库的第二章:日期和时间库。虽说体会其内部思维是下一步即将打算做的事情,但总算是见到了boost库的“头发”或者“鞋带”了。我管它boost还有什么神奇的库及组件,都和用时间和日期库一个道理。只是我还不认识boost库的其余部分[当然了,其余库可能要复杂的多 ]。
还是那句话,虽说一早就知道了boost是一个C++库,但是未见过也未实用过boost的库始终不知道这个库到底是啥概念,C++库就是用C++封装一些代码[这些代码不得了 ]然后能供其它编写代码的人调用。书中还将类摘要贴出来,就让读者认识boost库更加明白一些,然后加上在开发环境中[ VS2010 ]中的编码操作及一些简单的调试就将boost和编写程序连接起来了:
程序功能需求 | 能用boost的什么库 | 在VS中包含头文件及用boost库的命名空间名 | 定义boost库内组件对象 | 访问组件对象内成员 | 欧,减少了coder自己编码的时间 | 剩下的工作就是想要有boost的手册,查阅式的学习 | 查阅和自己编码哪一个的效率更高呢 | 查阅的效率可能会高一些 |
在大量查阅boost库组件来用的同时不要忘记了学习boost库组件设计的思想,这才是我们最应该加油去领悟的地方。
这就是今天的收获,实习要下班了,还是挺累的。
此次笔记记录完毕。