计算机 · 2021年5月25日 0

深入应用C++11笔记 第6章

使用C++11中便利的工具

处理日期和时间的chrono库

记录时长的duration

template<
    class Rep,
    class Period = std::ratio<1>
> class duration;

template<
    std::intmax_t Num,
    std::intmax_t Denom = 1
> class ratio;

duration类模板用于表示一段时间长度,duration模板类中会保存一个tick数,tick数的类型为Rep类型,每个tick代表的时间长度为Period指定的秒数,Period是一个ratio形式的分数。

看下chrono命名空间中,各个时间单位是怎么定义的:

typedef duration<Rep, ratio<3600, 1>> hours;
typedef duration<Rep, ratio<60, 1>> minutes;
typedef duration<Rep, ratio<1, 1>> seconds;
typedef duration<Rep, ratio<1, 1000>> milliseconds;
typedef duration<Rep, ratio<1, 1000000>> microseconds;
typedef duration<Rep, ratio<1, 1000000000>> nanoseconds;

duration中保存的tick数可以通过count()方法获得。

不同单位的duration类型之间可以相加减和互相转换,相加减时,单位就统一成两个操作数的单位的“分数形式”的最小公约数。

表示时间点的time_point

template<
    class Clock,
    class Duration = typename Clock::duration
> class time_point;

这个time_point其实和clock_gettime很像,选取一种时钟Clock,然后通过time_since_epoch方法获取自该时钟的Epoch开始过去了多长时间,只不过time_point返回的类型是duration而已(如果没有在模板参数中指定duration类型,那么就用指定的时钟Clock中的duration类型)。和clock_gettime返回的timespec的不同之处在于time_point把时钟类型也一起保存在这个值里了。

Clock的类型可以选择:

  • system_clock,类比clock_gettime中的CLOCK_REALTIME
  • steady_clock,类比clock_gettime中的CLOCK_MONOTONIC
  • high_resolution_clock,系统支持的最高精度的时钟类型,可能就是system_clock或者steady_clock,也可能是其他的时钟实现

Clock的成员函数:

  • now,返回一个代表当前时间点的time_point;
  • to_time_t,将time_point转换为time_t;
  • from_time_t,将time_t转换为time_point;

同一个时钟的time_point可以相减,不同时钟的time_point不可以进行相减运算。

数值类型和字符串的相互转换

数字转字符串:std::to_string和std::to_wstring。

字符串转数组:作者居然只讲了C里面就有的atoi,atol,atoll,atof这些,没有讲std::stoi,std::stol,std::stoul,std::stoll这些函数。

宽窄字符转换

Unicode,UTF8,宽字符傻傻分不清楚。需要先仔细学习一下这些概念先:)。