欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++11中的chrono庫(kù)詳解

 更新時(shí)間:2023年03月18日 09:44:31   作者:你好,馮同學(xué)  
C++11提供了日期時(shí)間相關(guān)的庫(kù)chrono,通過(guò)chrono庫(kù)可以很方便的處理日期和時(shí)間,這篇文章主要介紹了C++11中的chrono庫(kù),需要的朋友可以參考下

前言

C++11提供了日期時(shí)間相關(guān)的庫(kù)chrono,通過(guò)chrono庫(kù)可以很方便的處理日期和時(shí)間。chrono庫(kù)主要包含3種類型:時(shí)間間隔duration、時(shí)鐘clocks和時(shí)間點(diǎn)time_point

1、記錄時(shí)長(zhǎng)的duration

duration為一個(gè)模板類,表示時(shí)間間隔,可以是幾秒、幾分鐘或者幾個(gè)小時(shí)的時(shí)間間隔。duration的原型如下:

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

第一模板參數(shù)Rep是一個(gè)數(shù)值類型,表示時(shí)鐘數(shù)的類型;第二個(gè)模板參數(shù)是一個(gè)默認(rèn)模板參數(shù)std::ratio,表示時(shí)鐘周期,它的原型如下:

template <intmax_t N, 
intmax_t D = 1
> class ratio;

它表示每個(gè)時(shí)鐘周期的秒數(shù),其中第一個(gè)模板參數(shù)N代表分子,D代表分母,分母默認(rèn)為1,因此,ratio代表的是一個(gè)分子除以分母的分?jǐn)?shù)值。比如:

ratio<2>	//代表2秒
ratio<60>	//代表1分鐘
ratio<60*60>	//代表1小時(shí)
ratio<60*60*24>	//代表1天
ratio<1, 1000>	//代表1毫秒
ratio<1, 1000000>	//代表1微秒
ratio<1, 1000000000>	//代表1納秒

為了方便使用,標(biāo)準(zhǔn)庫(kù)定義了一些常用的時(shí)間間隔,如時(shí)、分、秒、毫秒、微秒和納秒,在chrono命名空間下,定義如下(vs2013的源碼):

typedef duration<long long, nano> nanoseconds;
typedef duration<long long, micro> microseconds;
typedef duration<long long, milli> milliseconds;
typedef duration<long long> seconds;
typedef duration<int, ratio<60> > minutes;
typedef duration<int, ratio<3600> > hours;

通過(guò)定義這些常用的時(shí)間間隔類型,我們能方便的使用它們,比如線程休眠:

//休眠100毫秒
this_thread::sleep_for(std::chrono::duration<int, ratio<1, 100>>(100));
this_thread::sleep_for(std::chrono::microseconds(100));//更簡(jiǎn)單

//休眠3秒
this_thread::sleep_for(std::chrono::duration<int>(3));
this_thread::sleep_for(std::chrono::seconds(3));//更簡(jiǎn)單

chrono還提供了獲取時(shí)間間隔的時(shí)鐘周期數(shù)的方法count(),它的基本用法如下:

#include<iostream>
#include<chrono>
int main()
{
	std::chrono::seconds s(3);//3秒
	std::chrono::milliseconds ms = 2 * s;//6000毫秒
	std::cout << "3 s duration has " << s.count() << " ticks\n" << "6000 ms duration has " << ms.count() << " ticks\n";
}

執(zhí)行結(jié)果:

在這里插入圖片描述

duration在某些情況下可以進(jìn)行轉(zhuǎn)換,例如,當(dāng)duration的Rep都為整型,且源Period要大于目標(biāo)Period時(shí)或者目標(biāo)duration的Rep為浮點(diǎn)數(shù)時(shí)可以使用傳統(tǒng)類型轉(zhuǎn)化或者隱式調(diào)用其單值構(gòu)造函數(shù),不必調(diào)用duration_cast

int main()
{
	//目標(biāo)duration的Rep為double
	std::chrono::milliseconds int_milliseconds(1024);       // 1024ms
	std::chrono::microseconds int_microseconds(1024);       // 1024us
	std::chrono::duration<double> double_seconds;
	double_seconds = int_microseconds;	//1024ms = 1.024s
	double_seconds = int_milliseconds;	//1024us = 0.001024s


	//當(dāng)duration的Rep都為整型,且源Period可被目標(biāo)Period整除時(shí)
	int_microseconds = int_milliseconds; //ms賦值給us可以,但是us賦值給ms不可
	int_milliseconds = std::chrono::seconds(1);	//s賦值給ms可以,但是ms賦值給s不可以


	//源duration的Rep為double, 目標(biāo)duration的Rep不為double,不能轉(zhuǎn)換
	//std::chrono::milliseconds t1 = std::chrono::duration<double>(1024);

/*
 * 數(shù)據(jù)會(huì)發(fā)生截?cái)鄷r(shí)的轉(zhuǎn)化
 * chrono庫(kù)提供了duration之間相互轉(zhuǎn)化的函數(shù),其定義如下
 *      template <class ToDuration, class Rep, class Period>
 *      constexpr ToDuration duration_cast(const duration<Rep,Period>& d);
*/
    std::chrono::seconds t1 = std::chrono::duration_cast<std::chrono::seconds>(std::chrono::milliseconds(1024));               // 1s = 1024ms(精度損失)
    std::chrono::seconds t2 = std::chrono::duration_cast<std::chrono::seconds>(std::chrono::duration<double>(1.024));          // 1s = 1.024s 
}

時(shí)間間隔之間可以做運(yùn)算,計(jì)算兩端時(shí)間間隔的差值的實(shí)例如下:

int main()
{
	std::chrono::minutes t1(10);
	std::chrono::seconds t2(50);
	std::chrono::seconds t3 = t1 - t2;
	cout << t3.count() << " second" << endl;
}

執(zhí)行結(jié)果:

在這里插入圖片描述

其中,t1代表10分鐘,t2代表50秒,t3則是t1減t2,也就是600-50=550秒。通過(guò)調(diào)用t3的count()輸出差值550個(gè)時(shí)鐘周期,因?yàn)閠3的時(shí)鐘周期為1秒,所以t3表示時(shí)間間隔為550秒。

值得注意的是,duration的加減運(yùn)算有一定的規(guī)則,當(dāng)兩個(gè)duration時(shí)鐘周期不相同的時(shí)候,會(huì)先統(tǒng)一成一種時(shí)鐘,然后再作加減運(yùn)算。統(tǒng)一成一種時(shí)鐘的規(guī)則如下:

對(duì)于ratio<x1, y1>count1和ratio<x2, y2>count2。如果x1、x2的最大公約數(shù)為x,y1、y2的最小公倍數(shù)為y,那么統(tǒng)一之后的ratio為ratio<x, y>

例如:

int main()
{
	std::chrono::duration<double, std::ratio<9, 7>> d1(3);
	std::chrono::duration<double, std::ratio<6, 5>> d2(1);
	auto d3 = d1 - d2;
	cout << "d3類型 : "<<typeid(d3).name() << endl;
	cout << d3.count() << endl;
}

執(zhí)行結(jié)果:

在這里插入圖片描述

根據(jù)前面介紹的規(guī)則,對(duì)于9/7和6/5,分子取最大公約數(shù)3,分母取最小公倍數(shù)35,所以,統(tǒng)一之后的duration為std::chrono::duration<double,struct std::ratio<3,35>>。然后再將原來(lái)的duration轉(zhuǎn)換為統(tǒng)一的duration,最后計(jì)算的時(shí)鐘周期數(shù)為:((9/7)/(3/35)*3)-((6/5)/(3/35)*1),結(jié)果為31

2、表示時(shí)間點(diǎn)的time_point

time_point表示一個(gè)時(shí)間點(diǎn),用來(lái)獲取從它的clock的開(kāi)始所經(jīng)過(guò)的duration(比如,可能是1970.1.1以來(lái)的時(shí)間間隔)和當(dāng)前時(shí)間,可以做一些時(shí)間的比較和算術(shù)運(yùn)算,可以喝ctime庫(kù)結(jié)合起來(lái)顯示時(shí)間。time_point必須用clock來(lái)計(jì)時(shí)。time_point有一個(gè)函數(shù)time_from_eproch()用來(lái)獲得1970年1月1日到time_point時(shí)間經(jīng)過(guò)的duration

time_point是一個(gè)類模板,原型如下:

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

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

第一個(gè)模板參數(shù)Clock用來(lái)指定所要使用的時(shí)鐘(標(biāo)準(zhǔn)庫(kù)中有三種時(shí)鐘,system_clock,steady_clock和high_resolution_clock)
第二個(gè)模板函數(shù)參數(shù)用來(lái)表示時(shí)間的計(jì)量單位(特化的std::chrono::duration<> )

計(jì)算當(dāng)前時(shí)間距離1970年1月1日有多少天

#include<iostream>
#include<chrono>
#include<ratio>
using namespace std::chrono;
int main()
{
	using days_type = duration<int, std::ratio<60 * 60 * 24>>;
	time_point<system_clock, days_type> today = time_point_cast<days_type>(system_clock::now());
	std::cout << today.time_since_epoch().count() << " days since epoch" << endl;
}

執(zhí)行結(jié)果:

在這里插入圖片描述

time_point還支持一些算術(shù)運(yùn)算,比如兩個(gè)time_point的差值時(shí)鐘周期數(shù),還可以和duration相加減。要注意不同clock的time_point是不能進(jìn)行算術(shù)運(yùn)算的。下面例子將展示前一天和后一天的日期:

#include<iostream>
#include<chrono>
#include<iomanip>
using namespace std::chrono;
int main()
{
	system_clock::time_point now = system_clock::now();
	std::time_t prev = system_clock::to_time_t(now - hours(24)); //返回時(shí)間戳
	std::time_t next = system_clock::to_time_t(now + hours(24)); //返回時(shí)間戳

	cout << "One day ago, the time was " << std::put_time(std::localtime(&prev), "%Y.%m.%d %H:%M:%S") << endl;
	cout << "A day later, the time is " << std::put_time(std::localtime(&next), "%Y.%m.%d %H:%M:%S") << endl;	 
}

執(zhí)行結(jié)果:

在這里插入圖片描述

3、獲取系統(tǒng)時(shí)鐘的clocks

clocks表示當(dāng)前的系統(tǒng)時(shí)鐘,內(nèi)部有time_point、duration、Rep、Period等信息,主要用來(lái)獲取當(dāng)前時(shí)間,以及實(shí)現(xiàn)time_t和time_point的相互轉(zhuǎn)換。clocks包含如下3種時(shí)鐘:
-system_clock:代表真實(shí)時(shí)間的掛鐘時(shí)間,具體時(shí)間依賴于系統(tǒng)。system_clock保證提供的時(shí)間值是一個(gè)可讀時(shí)間
-steady_clock:不能被“調(diào)整” 的時(shí)鐘,并不一定代表真實(shí)世界的掛鐘時(shí)間。保證先后調(diào)用now()得到的時(shí)間值是不會(huì)遞減的
-high_resoulution_clock:高精度時(shí)鐘,實(shí)際上是system_clock或者steady_clock的別名??梢酝ㄟ^(guò)now()來(lái)獲取當(dāng)前時(shí)間點(diǎn),代碼如下:

int main()
{
	std::chrono::system_clock::time_point t1 = std::chrono::system_clock::now();
	cout << "hello fl" << endl;
	std::chrono::system_clock::time_point t2 = std::chrono::system_clock::now();
	cout << (t2 - t1).count() << " tick count" << endl;
	return 0;
}

執(zhí)行結(jié)果:

在這里插入圖片描述

system_clock的to_time_t方法可以將一個(gè)time_point轉(zhuǎn)換為ctime:

std::time_t now_c = std::chrono::system_clock::to_time_t(time_point);

而from_time_t方法則正好相反,它將ctime轉(zhuǎn)換為time_point

steady_clock可以獲取穩(wěn)定可靠的時(shí)間間隔,后一次調(diào)用now()的值和前一次的差值不會(huì)因?yàn)樾薷牧讼到y(tǒng)時(shí)間而改變,從而保證了穩(wěn)定的時(shí)間間隔。steady_clock的用法和system用法一樣。

到此這篇關(guān)于C++11中的chrono庫(kù)詳解的文章就介紹到這了,更多相關(guān)C++11中的chrono庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • QT+ffmpeg實(shí)現(xiàn)視頻解析的示例詳解

    QT+ffmpeg實(shí)現(xiàn)視頻解析的示例詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用QT+ffmpeg實(shí)現(xiàn)視頻解析功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Qt有一定幫助,需要的可以參考一下
    2022-09-09
  • C++實(shí)現(xiàn)二分法求方程近似解

    C++實(shí)現(xiàn)二分法求方程近似解

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)二分法求方程近似解,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • 利用Matlab復(fù)刻羊了個(gè)羊小游戲

    利用Matlab復(fù)刻羊了個(gè)羊小游戲

    最近羊了個(gè)羊游戲可謂是異常火爆,身邊幾乎都在玩,他其實(shí)就是一個(gè)簡(jiǎn)單的卡通背景消除闖關(guān)游戲,本文將用Matlab復(fù)刻這一游戲,感興趣的可以了解一下
    2022-09-09
  • 淺談C++中字符串輸入get與getline的區(qū)別

    淺談C++中字符串輸入get與getline的區(qū)別

    這篇文章主要介紹了C++中字符串輸入get與getline的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • QT編寫tcp通信工具(Server端)

    QT編寫tcp通信工具(Server端)

    這篇文章主要為大家詳細(xì)介紹了QT編寫tcp通信工具,一個(gè)類似網(wǎng)上常見(jiàn)的網(wǎng)絡(luò)調(diào)試工具,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C語(yǔ)言中關(guān)于指針變量的坑

    C語(yǔ)言中關(guān)于指針變量的坑

    這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中關(guān)于指針變量坑的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • C++實(shí)現(xiàn)機(jī)票預(yù)訂系統(tǒng)

    C++實(shí)現(xiàn)機(jī)票預(yù)訂系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)機(jī)票預(yù)訂系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • VS?Code?C++環(huán)境的搭建過(guò)程

    VS?Code?C++環(huán)境的搭建過(guò)程

    這篇文章主要介紹了VS?Code?C++環(huán)境的搭建,Somasegar 也告訴筆者這款編輯器也擁有對(duì) Git 的開(kāi)箱即用的支持,需要的朋友可以參考下
    2022-04-04
  • OpenCV圖像輪廓提取的實(shí)現(xiàn)

    OpenCV圖像輪廓提取的實(shí)現(xiàn)

    本文主要介紹了OpenCV圖像輪廓提取的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • C語(yǔ)言新手練習(xí)題之求第n個(gè)斐波那契數(shù)

    C語(yǔ)言新手練習(xí)題之求第n個(gè)斐波那契數(shù)

    斐波那契數(shù)列這一個(gè)大一上C語(yǔ)言就有的問(wèn)題大家應(yīng)該都不陌生,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言新手練習(xí)題之求第n個(gè)斐波那契數(shù)的相關(guān)資料,文中通過(guò)圖文以及實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11

最新評(píng)論