C++常用的新特性-->day06

时间间隔duration

duration表示一段时间间隔,用来记录时间长度,可以表示几秒、几分钟、几个小时的时间间隔。duration的原型如下

// 定义于头文件 <chrono>
template<class Rep,class Period = std::ratio<1>
> class duration;

Rep:这是一个数值类型,表示时钟数(周期)的类型(默认为整形)。若 Rep 是浮点数,则 duration 能使用小数描述时钟周期的数目。
Period:表示时钟的周期,它的原型如下:

// 定义于头文件 <ratio>
template<std::intmax_t Num,std::intmax_t Denom = 1
> class ratio;

ratio类表示每个时钟周期的秒数,其中第一个模板参数Num代表分子,Denom代表分母,该分母值默认为1,因此,ratio代表的是一个分子除以分母的数值,比如:ratio<2>代表一个时钟周期是2秒,ratio<60>代表一分钟,ratio<6060>代表一个小时,ratio<6060*24>代表一天。而ratio<1,1000>代表的是1/1000秒,也就是1毫秒,ratio<1,1000000>代表一微秒,ratio<1,1000000000>代表一纳秒。

duration类的构造函数

// 1. 拷贝构造函数
duration( const duration& ) = default;
// 2. 通过指定时钟周期的类型来构造对象
template< class Rep2 >
constexpr explicit duration( const Rep2& r );
// 3. 通过指定时钟周期类型,和时钟周期长度来构造对象
template< class Rep2, class Period2 >
constexpr duration( const duration<Rep2,Period2>& d );

chrono库中根据duration类封装了不同长度的时钟周期(也可以自定义),基于这个时钟周期再进行周期次数的设置就可以得到总的时间间隔了(时钟周期 * 周期次数 = 总的时间间隔)。

综合案例

#include <chrono>
#include <iostream>
using namespace std;
int main()
{chrono::hours h(1);                          // 一小时chrono::milliseconds ms{ 3 };                // 3 毫秒chrono::duration<int, ratio<1000>> ks(3);    // 3000 秒// chrono::duration<int, ratio<1000>> d3(3.5);  // errorchrono::duration<double> dd(6.6);               // 6.6 秒// 使用小数表示时钟周期的次数chrono::duration<double, ratio<1, 30>> hz(3.5);//count()统计的是时间周期cout << "count:" << h.count() << endl;cout << "count:" << ms.count() << endl;cout << "count:" << ks.count() << endl;cout << "count:" << dd.count() << endl;cout << "count:" << hz.count() << endl;cout << "************************************************************" << endl;chrono::milliseconds mss{ 3 };         // 3 毫秒chrono::microseconds uss = 2 * mss;     // 6000 微秒// 时间间隔周期为 1/30 秒 --> 一共有3.5个时间周期,每个周期为1/30秒chrono::duration<double, ratio<1, 30>> hzz(3.5);//count()统计的是时间周期cout << "3 ms duration has " << mss.count() << " ticks\n"<< "6000 us duration has " << uss.count() << " ticks\n"<< "3.5 hz duration has " << hzz.count() << " ticks\n";cout << "************************************************************" << endl;chrono::minutes t1(10);chrono::seconds t2(60);chrono::seconds t3 = t1 - t2;cout << t3.count() << " second" << endl;cout << "************************************************************" << endl;//统一时钟周期//分子的最大公约数是1 分母的最小公倍数是1 ---> 统一为ration<1,1>chrono::duration<int, ratio<60, 1>> jb(10);chrono::duration<int, ratio<1,1>> jk(60);auto jkb = jb - jk;cout << "count:" << jkb.count() << endl;cout << "************************************************************" << endl;//分子的最大公约数是3 分母的最小公倍数是35 ---> 统一为ration<3,35>chrono::duration<int, ratio<9, 7>> ak(3);chrono::duration<int, ratio<6, 5>> m4(1);auto hql = ak - m4;//auto --> chrono::duration<int,ration<3,35>>cout << "count:" << hql.count() << endl;
}

在这里插入图片描述

时间点和时钟

时间点结构体

hrono库中提供了一个表示时间点的类time_point,该类的定义如下:

// 定义于头文件 <chrono>
template<class Clock,class Duration = typename Clock::duration
> class time_point;

它被实现成如同存储一个 Duration 类型的自 Clock 的纪元起始开始的时间间隔的值,通过这个类最终可以得到时间中的某一个时间点。
Clock:此时间点在此时钟上计量
Duration:用于计量从纪元起时间的 std::chrono::duration 类型

时间点time_point构造函数

// 1. 构造一个以新纪元(epoch,即:1970.1.1)作为值的对象,需要和时钟类一起使用,不能单独使用该无参构造函数
time_point();
// 2. 构造一个对象,表示一个时间点,其中d的持续时间从epoch开始,需要和时钟类一起使用,不能单独使用该构造函数
explicit time_point( const duration& d );
// 3. 拷贝构造函数,构造与t相同时间点的对象,使用的时候需要指定模板参数
template< class Duration2 >
time_point( const time_point<Clock,Duration2>& t );

时钟clocks

system_clock:系统的时钟,系统的时钟可以修改,甚至可以网络对时,因此使用系统时间计算时间差可能不准。
steady_clock:是固定的时钟,相当于秒表。开始计时后,时间只会增长并且不能修改,适合用于记录程序耗时
high_resolution_clock:和时钟类 steady_clock 是等价的(是它的别名)。

在使用chrono提供的时钟类的时候,不需要创建类对象,直接调用类的静态方法就可以得到想要的时间了。

成员类型描述
rep表示时钟周期次数的有符号算术类型
period表示时钟计次周期的 std::ratio 类型
duration时间间隔,可以表示负时长
time_point表示在当前时钟里边记录的时间点

system_clock

时钟类system_clock是一个系统范围的实时时钟。system_clock提供了对当前时间点time_point的访问,将得到时间点转换为time_t类型的时间对象,就可以基于这个时间对象获取到当前的时间信息了。

system_clock底层源码

struct system_clock { // wraps GetSystemTimePreciseAsFileTime/GetSystemTimeAsFileTimeusing rep                       = long long;using period                    = ratio<1, 10'000'000>; // 100 nanosecondsusing duration                  = chrono::duration<rep, period>;using time_point                = chrono::time_point<system_clock>;static constexpr bool is_steady = false;_NODISCARD static time_point now() noexcept { // get current timereturn time_point(duration(_Xtime_get_ticks()));}_NODISCARD static __time64_t to_time_t(const time_point& _Time) noexcept { // convert to __time64_treturn duration_cast<seconds>(_Time.time_since_epoch()).count();}_NODISCARD static time_point from_time_t(__time64_t _Tm) noexcept { // convert from __time64_treturn time_point{seconds{_Tm}};}
};

静态方法

// 返回表示当前时间的时间点。
static std::chrono::time_point<std::chrono::system_clock> now() noexcept;
// 将 time_point 时间点类型转换为 std::time_t 类型
static std::time_t to_time_t( const time_point& t ) noexcept;
// 将 std::time_t 类型转换为 time_point 时间点类型
static std::chrono::system_clock::time_point from_time_t( std::time_t t ) noexcept;

system_clock案例

#define _CRT_SECURE_NO_WARNINGS#include <chrono>
#include <iostream>
using namespace std;
using namespace std::chrono;
int main()
{// 新纪元1970.1.1时间system_clock::time_point epoch;chrono::hours h(10 * 24);system_clock::time_point epoch1 = epoch + h;system_clock::time_point epoch2(epoch + h);//当前的时间system_clock::time_point nowTime = system_clock::now();//时间点 -> 时间段(单位秒)time_t allSec = system_clock::to_time_t(nowTime);//时间格式化 -> 通过ctime转化为字符串cout << "当前的时间:" << ctime(&allSec) << endl;//时间段转化为时间点system_clock::time_point tp = system_clock::from_time_t(allSec);
}

steady_clock

在C++11中提供的时钟类steady_clock相当于秒表,只要启动就会进行时间的累加,并且不能被修改,非常适合于进行耗时的统计。

底层源码

struct steady_clock { // wraps QueryPerformanceCounterusing rep                       = long long;using period                    = nano;using duration                  = nanoseconds;using time_point                = chrono::time_point<steady_clock>;static constexpr bool is_steady = true;// get current time_NODISCARD static time_point now() noexcept { // doesn't change after system bootconst long long _Freq = _Query_perf_frequency(); const long long _Ctr  = _Query_perf_counter();static_assert(period::num == 1, "This assumes period::num == 1.");const long long _Whole = (_Ctr / _Freq) * period::den;const long long _Part  = (_Ctr % _Freq) * period::den / _Freq;return time_point(duration(_Whole + _Part));}
};

静态方法

static std::chrono::time_point<std::chrono::steady_clock> now() noexcept;

案例

#define _CRT_SECURE_NO_WARNINGS#include <chrono>
#include <iostream>
using namespace std;
using namespace std::chrono;void steadyClockTest()
{auto p1 = steady_clock::now();for (int i = 0; i < 100; i++){cout << "*";}cout << endl;auto p2 = steady_clock::now();auto d1 = p2 - p1;cout << "count:" << d1.count() << endl;
}int main()
{steadyClockTest();return 0;
}

在这里插入图片描述
得到的值是纳秒,去掉9个0换算成秒

high_resolution_clock

同system_clock

转换函数

如果是对时钟周期进行转换:源时钟周期必须能够整除目的时钟周期(比如:小时到分钟)。
如果是对时钟周期次数的类型进行转换:低等类型默认可以向高等类型进行转换(比如:int 转 double)。
如果时钟周期和时钟周期次数类型都变了,根据第二点进行推导(也就是看时间周期次数类型)。
以上条件都不满足,那么就需要使用 duration_cast 进行显示转换。

duration_cast

通过这个函数可以对duration类对象内部的时钟周期Period,和周期次数的类型Rep进行修改

#define _CRT_SECURE_NO_WARNINGS#include <chrono>
#include <iostream>
using namespace std;
using namespace std::chrono;void durationCastTest()
{//分钟 -> 小时 hours h = duration_cast<hours>(minutes(60));cout << "60 minutes is " << h.count() << " hours\n";//小时 -> 分钟minutes m1 = hours(1);cout << "1 hour is " << m1.count() << " minutes\n";//浮点 -> 整形 --> 不建议会损失精度//seconds ss = duration<double> s(2.5);//err seconds ss1 = duration_cast<seconds>(duration<double> (2.5));using mydouble = duration<double>;seconds ss2 = duration_cast<seconds>(mydouble(2.5));cout << "ss1.count():" << ss1.count() << endl;cout << "ss2.count():" << ss2.count() << endl;//整形 -> 浮点mydouble dd = seconds(9);cout << "dd.count():" << dd.count() << endl;//时钟周期数据类型和时钟周期都变了duration<int, ratio<1, 100>>t1(100);duration<double, ratio<1, 100>>t2(12.56);//duration<int, ratio<1, 100>>t3 = t2;//err double转int有问题duration<int, ratio<1, 100>>t3 = duration_cast<duration<int, ratio<1, 100>>>(t2);cout << "t3.count():" << t3.count() << endl;duration<double, ratio<1, 100>>t4 = t1;// >>>> 时钟周期和时钟周期的数据类型都不相同,看类型转化,由于是int转double是没问题的-->会进行隐式类型转化cout << "t4.count():" << t4.count() << endl;
}int main()
{durationCastTest();return 0;
}

在这里插入图片描述

time_point_cast

函数的作用是对时间点进行转换,因为不同的时间点对象内部的时钟周期Period,和周期次数的类型Rep可能也是不同的

#define _CRT_SECURE_NO_WARNINGS#include <chrono>
#include <iostream>
using namespace std;
using namespace std::chrono;void durationCastTest()
{//分钟 -> 小时 hours h = duration_cast<hours>(minutes(60));cout << "60 minutes is " << h.count() << " hours\n";//小时 -> 分钟minutes m1 = hours(1);cout << "1 hour is " << m1.count() << " minutes\n";//浮点 -> 整形 --> 不建议会损失精度//seconds ss = duration<double> (2.5);//err 
/*template< class Rep2 >constexpr explicit duration( const Rep2& r );
*/seconds ss1 = duration_cast<seconds>(duration<double> (2.5));using mydouble = duration<double>;seconds ss2 = duration_cast<seconds>(mydouble(2.5));duration<double>a(2.5);seconds ss3 = duration_cast<seconds>(a);cout << "ss1.count():" << ss1.count() << endl;cout << "ss2.count():" << ss2.count() << endl;cout << "ss3.count():" << ss3.count() << endl;//整形 -> 浮点mydouble dd = seconds(9);cout << "dd.count():" << dd.count() << endl;//时钟周期数据类型和时钟周期都变了duration<int, ratio<1, 100>>t1(100);duration<double, ratio<1, 100>>t2(12.56);//duration<int, ratio<1, 100>>t3 = t2;//err double转int有问题duration<int, ratio<1, 100>>t3 = duration_cast<duration<int, ratio<1, 100>>>(t2);cout << "t3.count():" << t3.count() << endl;duration<double, ratio<1, 100>>t4 = t1;// >>>> 时钟周期和时钟周期的数据类型都不相同,看类型转化,由于是int转double是没问题的-->会进行隐式类型转化cout << "t4.count():" << t4.count() << endl;
}//时间段传入
template<typename Duration>
using MyTimePoint = time_point<system_clock, Duration>;int main()
{durationCastTest();cout << "********************************" << endl;MyTimePoint<seconds> mPoint(seconds(100));MyTimePoint<milliseconds> millPoint(milliseconds(1000));//s->msMyTimePoint<milliseconds> ms = mPoint;time_t tm1 = system_clock::to_time_t(ms);//时间点转化cout << "  " << ctime(&tm1);//ms->s//MyTimePoint<seconds> mss = millPoint;//err >>>>  MyTimePoint<seconds> mss = time_point_cast<seconds>(millPoint);time_t tm2 = system_clock::to_time_t(mss);cout << "  " << ctime(&tm2);return 0;
}

在这里插入图片描述

作者: 苏丙榅
链接: https://subingwen.cn/cpp/chrono/#1-2-%E7%B1%BB%E7%9A%84%E4%BD%BF%E7%94%A8

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/471794.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云服务器端口开放

云服务器一般除了必要端口&#xff0c;其它端口默认都是关闭的&#xff0c;要想进行网络通信就必须开放指定的端口。下面以腾讯云服务器为例来进行详细说明。 腾讯云的轻量服务器是没有安全组的&#xff0c;这里有的只是防火墙&#xff0c;开放端口也是通过防火墙来设置的。首先…

[Linux网络编程]10-http协议,分别使用epoll和libevent两种方式实现B/S服务器

一.HTTP协议&#xff0c;Request请求和Response响应 二.常用状态码 接下来使用两种方式构建B/S模型,实现浏览器向客户端请求文件的功能。 浏览器向构建好的服务器发送请求&#xff0c;在请求行中请求具体文件&#xff0c;服务器连通客户端(浏览器)后&#xff0c;检查文件是否存…

C#从入门到放弃

C#和.NET的区别 C# C#是一个编程语言 .NET .NET是一个在window下创建程序的框架 .NET框架不仅局限于C#,它还可以支持很多语言 .NET包括了2个组件&#xff0c;一个叫CLR(通用语言运行时)&#xff0c;另一个是用来构建程序的类库 CLR 用C写一个程序&#xff0c;在一台8688的机器…

Suricata

02-Suricata 一 ICMP流量预警 一条ICMP报文有四个重要内容&#xff0c;可与相应的ICMP关键字相匹配。它们是&#xff1a;消息的类型、代码、ID和序列。 通过ICMP的type进行匹配 alert icmp any any <> any any (msg:"icmp流量预警";itype:8;threshold:type t…

在 WPF 中,如何实现数据的双向绑定?

在 WPF 中&#xff0c;数据绑定是一个非常重要的特性&#xff0c;它允许 UI 与数据源之间自动同步。双向绑定是一种常见的绑定方式&#xff0c;当数据源更新时&#xff0c;UI 会自动更新&#xff1b;同样&#xff0c;当 UI 中的元素&#xff08;如文本框&#xff09;发生改变时…

2、 家庭网络发展现状

上一篇我们讲了了解家庭网络历史(https://blog.csdn.net/xld_hung/article/details/143639618?spm1001.2014.3001.5502),感兴趣的同学可以看对应的文章&#xff0c;本章我们主要讲家庭网络发展现状。 关于家庭网络发展现状&#xff0c;我们会从国内大户型和小户型的网络说起&…

Linux——Linux环境基础开发工具使用

一、软件包管理器yum 在Linux上想要安装一个软件需要下载程序的源代码并且进行编译得到一个可执行的程序。这样会引发很多的问题&#xff0c;第一是这样做很麻烦&#xff1b;第二是我们不知道软件的开发者在开发这款软件的时候用的是一个什么样的环境&#xff0c;我们用不一样的…

Mysql每日一题(行程与用户,困难※)

今天给大家分享一个截止到目前位置&#xff0c;我遇到最难的一道mysql题目&#xff0c;非常建议大家亲手做一遍 完整代码如下&#xff0c;这道题的主要难点是它有两个外键&#xff0c;以前没遇到过&#xff0c;我也没当回事&#xff0c;分享一下错误经验哈 当时我写的where判断…

大模型研究报告 | 2024年中国金融大模型产业发展洞察报告|附34页PDF文件下载

随着生成算法、预训练模型、多模态数据分析等AI技术的聚集融合&#xff0c;AIGC技术的实践效用迎来了行业级大爆发。通用大模型技术的成熟推动了新一轮行业生产力变革&#xff0c;在投入提升与政策扶植的双重作用下&#xff0c;以大模型技术为底座、结合专业化金融能力的金融大…

React Native 全栈开发实战班 - 核心组件与导航

在 React Native 中&#xff0c;组件是构建用户界面的基本单元。React Native 提供了丰富的内置组件&#xff0c;涵盖了从基础布局到复杂交互的各种需求。本章节将详细介绍常用的内置组件&#xff0c;并重点讲解列表与滚动视图的使用。 1. 常用内置组件详解 React Native 提供…

检测敏感词功能

今天策划给我一个任务 —— 检测昵称中是否含有敏感词功能&#xff0c;然后丢给我两个压缩包&#xff0c;我解压一看&#xff1a; 有的txt文件是一行一个词&#xff1a; 有的txt文件是按逗号分隔开&#xff1a; 不管是什么格式的总之量非常多&#xff0c;把我这辈子脏话都囊括…

LeetCode59. 螺旋矩阵 II

题目 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 思路 规则 填充上行从左到右 填充右列从上到下 填充下行从右到左 填充左列从下到上 定义上下左右四个基数每行每列填充完后行列…

Vue3 -- 项目配置之stylelint【企业级项目配置保姆级教程3】

stylelint为css的lint工具。可格式化css代码&#xff0c;检查css语法错误与不合理的写法&#xff0c;指定css书写顺序等。 配置stylelint&#xff1a; 我们项目使用scss作为预处理器 安装依赖&#xff1a; pnpm add sass sass-loader stylelint postcss postcss-scss postc…

RabbitMQ轻松构建高效可靠的消息队列系统

目录 1、什么是AMQP 2、什么是SpringAMQP SpringAMQP 的特点&#xff1a; 3、Basic Queue简单队列模型案例 3.1、消息发送 3.2、消息接收 4、WordQueue 4.1、消息发送 4.2、消息接收 4.3、测试 4.4、能者多劳 4.5、总结 5、发布/订阅 6、Fanout 6.1、声明队列和…

AutoHotKey自动热键AHK-正则表达式

在这个软件的操作中,基本都是需要即时的解决一些问题,所以对字符串的操作是比较多的,所以正则的使用还是比较重要的,接下来我们用一个例子来了解正则表达式的使用 str "7654321" RegExMatch(str, "65(43)(21)", SubPat)str ( str %str% SubPat %SubPa…

LinuxCentos中安装apache网站服务详细教程

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f427;Linux基础知识(初学)&#xff1a;点击&#xff01; &#x1f427;Linux高级管理防护和群集专栏&#xff1a;点击&#xff01; &#x1f510;Linux中firewalld防火墙&#xff1a;点击&#xff01; ⏰️创作…

微信小程序自定义顶部导航栏(适配各种机型)

效果图 1.pages.js&#xff0c;需要自定义导航栏的页面设置"navigationStyle": "custom" 2.App.vue,获取设备高度及胶囊位置 onLaunch: function () {// 系统信息const systemInfo uni.getSystemInfoSync()// 胶囊按钮位置信息const menuButtonInfo uni.…

Elasticsearch集群和Kibana部署流程

搭建Elasticsearch集群 1. 进入Elasticsearch官网下载页面&#xff0c;下载Elasticsearch 在如下页面选择Elasticsearch版本&#xff0c;点击download按钮&#xff0c;进入下载页面 右键选择自己操作系统对应的版本&#xff0c;复制下载链接 然后通过wget命令下载Elastics…

基于Java Springboot快递物流管理系统

一、作品包含 源码数据库全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Layui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA 数据库&#xff1a;MySQL8.0 数据库管…

【论文阅读】WaDec: Decompiling WebAssembly Using Large Language Model

论文阅读笔记:WaDec: Decompiling WebAssembly Using Large Language Model 1. 来源出处 论文标题: WaDec: Decompiling WebAssembly Using Large Language Model作者: Xinyu She, Yanjie Zhao, Haoyu Wang会议: 39th IEEE/ACM International Conference on Automated Softwar…