C/C++時間庫chrono的使用總結
在程序設計中,時間管理是一個核心概念,它不僅關系到程序的效率和性能,而且直接影響用戶體驗。C++作為一門高效的編程語言,提供了std::chrono
庫,用于精確地處理和計算時間。這個庫的設計體現(xiàn)了程序員對時間流逝的敏感性,同時也揭示了編程中對精確度和性能的持續(xù)追求。
使用 <chrono>
庫的好處是可以以不同的精度測量時間,包括納秒、微秒、毫秒和秒。通過計算兩個時間點之間的時間間隔,可以精確地測量代碼執(zhí)行的時間。
std::chrono庫主要包含以下功能:
- 時間點:表示特定的時間點,比如當前的時間。這如同人們通過記憶可以回憶起特定的時刻。
- 時間段:表示時間的長度,比如1秒,1分鐘,1小時等。這如同人們能夠感知時間的流逝,理解"早","晚"等概念。
- 時鐘:用于獲取當前的時間點,有三種類型的時鐘:system_clock,steady_clock和high_resolution_clock。這如同人們通過看表來知道現(xiàn)在的具體時間。
為了更好的理解這些功能,讓我們看一下下面的表格:
類名 | 描述 | 對應的心理學概念 |
---|---|---|
std::chrono::system_clock | 系統(tǒng)的實際時間,可能會受到系統(tǒng)時間調(diào)整的影響 | 外部環(huán)境對人的影響 |
std::chrono::steady_clock | 穩(wěn)定的時鐘,時間從不調(diào)整 | 穩(wěn)定、可靠的心理狀態(tài) |
std::chrono::high_resolution_clock | 提供最小的可表示的時間間隔 | 細微的心理變化 |
std::chrono::time_point | 表示特定的時間點 | 特定的記憶 |
std::chrono::duration | 表示時間的長度 | 時間的感知 |
通過一個具體實例來逐步講解時間庫chrono的使用,實例如下:
// 開始計時 auto startTime = std::chrono::steady_clock::now(); //自己定義的檢查答案的函數(shù),可忽略 checkAnswers(problems); // 停止計時 auto endTime = std::chrono::steady_clock::now(); // 計算答題時間 std::chrono::duration<double> elapsedSeconds = endTime - startTime; int elapsedMinutes = static_cast<int>(elapsedSeconds.count() / 60); int elapsedSecondsRemainder = static_cast<int>(elapsedSeconds.count()) % 60; std::cout << "Time taken: " << elapsedMinutes << " minutes " << elapsedSecondsRemainder << " seconds" << std::endl;
逐條語句講解:
開始或者停止計時的代碼
// 開始計時 auto startTime = std::chrono::steady_clock::now(); // 停止計時 auto endTime = std::chrono::steady_clock::now();
這段代碼使用了C++標準庫中的 <chrono>
頭文件中的時間庫,用于獲取開始計時時間并將其存儲在變量 startTime
中,獲取停止計時時間并將其存儲在變量 endTime
中。
下面是對該代碼的解釋:
std::chrono::steady_clock
:steady_clock
是一個表示穩(wěn)定、遞增的時鐘,用于測量時間間隔。它提供了一個相對穩(wěn)定的時間基準,適用于測量較小時間間隔。std::chrono::steady_clock::now()
:now()
是steady_clock
類的成員函數(shù),用于獲取當前的時間點。auto startTime = std::chrono::steady_clock::now();
:這行代碼使用auto
關鍵字自動推導變量類型,將當前時間點的值賦給變量startTime
。由于std::chrono::steady_clock::now()
返回的是一個時間點對象,編譯器通過自動類型推導將其分配給startTime
變量。
計算答題時間的代碼
// 計算答題時間 std::chrono::duration<double> elapsedSeconds = endTime - startTime; int elapsedMinutes = static_cast<int>(elapsedSeconds.count() / 60); int elapsedSecondsRemainder = static_cast<int>(elapsedSeconds.count()) % 60;
這段代碼用于計算答題時間,并將其分解為分鐘和秒。
1.std::chrono::duration<double> elapsedSeconds = endTime - startTime;
:
這一行代碼計算 endTime
和 startTime
之間的時間差,并將結果存儲在 elapsedSeconds
變量中。elapsedSeconds
是一個 std::chrono::duration
類型的對象,用于表示持續(xù)的時間。通過將 endTime
減去 startTime
,我們得到了這段時間的持續(xù)時間。
注:std::chrono::duration
是 C++ 標準庫中用于表示時間持續(xù)的類模板。std::chrono::duration
提供了一系列成員函數(shù)和運算符,用于對時間持續(xù)進行操作和計算。一些常用的成員函數(shù)和運算符包括:
count()
:返回持續(xù)時間的內(nèi)部表示值(類型為 Rep)。operator+、operator-
:用于對兩個持續(xù)時間進行加法和減法運算。operator*、operator/
:用于將持續(xù)時間乘以或除以一個標量值。operator==、operator!=、operator<、operator>
:用于比較兩個持續(xù)時間的大小關系。
2.int elapsedMinutes = static_cast<int>(elapsedSeconds.count() / 60);
:
這一行代碼將持續(xù)時間轉(zhuǎn)換為以分鐘為單位的整數(shù)值。elapsedSeconds.count()
返回持續(xù)時間的秒數(shù),除以 60 可以得到分鐘數(shù)。使用 static_cast<int>
進行強制類型轉(zhuǎn)換,將浮點數(shù)結果轉(zhuǎn)換為整數(shù)。
注:static_cast
是 C++ 中的一種類型轉(zhuǎn)換操作符,用于進行靜態(tài)類型轉(zhuǎn)換(static_cast)。
靜態(tài)類型轉(zhuǎn)換是一種在編譯時進行的類型轉(zhuǎn)換,它允許將一個類型轉(zhuǎn)換為另一個相關類型,前提是這兩個類型之間存在某種類型轉(zhuǎn)換的關系。
static_cast 可以用于以下幾種轉(zhuǎn)換:
- 隱式類型轉(zhuǎn)換:static_cast 可以將一種算術類型轉(zhuǎn)換為另一種算術類型,如將 int 轉(zhuǎn)換為 double、將 float 轉(zhuǎn)換為 int 等。
- 類層次轉(zhuǎn)換:static_cast 可以在類層次結構中進行向上轉(zhuǎn)型(upcast)和向下轉(zhuǎn)型(downcast),但在向下轉(zhuǎn)型時需要注意安全性,因為 static_cast 不提供運行時類型檢查。如果向下轉(zhuǎn)型是不安全的,應該使用 dynamic_cast 進行動態(tài)類型轉(zhuǎn)換。
- 指針類型轉(zhuǎn)換:static_cast 可以在指針類型之間進行轉(zhuǎn)換,包括將派生類指針轉(zhuǎn)換為基類指針(向上轉(zhuǎn)型)和將基類指針轉(zhuǎn)換為派生類指針(向下轉(zhuǎn)型)。在指針轉(zhuǎn)換時,編譯器不會進行運行時類型檢查,因此需要確保轉(zhuǎn)換是安全的。
引用類型轉(zhuǎn)換:static_cast 可以在引用類型之間進行轉(zhuǎn)換,類似于指針類型轉(zhuǎn)換。轉(zhuǎn)換時需要注意類型的兼容性和安全性。
3.int elapsedSecondsRemainder = static_cast<int>(elapsedSeconds.count()) % 60;
:
這一行代碼計算以秒為單位的剩余時間。elapsedSeconds.count()
返回持續(xù)時間的秒數(shù),使用 static_cast<int>
將其轉(zhuǎn)換為整數(shù)。然后,通過取模運算符 %
將其對 60 取余,得到不足一分鐘的剩余秒數(shù)。
到此這篇關于C/C++時間庫chrono的使用總結的文章就介紹到這了,更多相關C++時間庫chrono內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C++開發(fā)在IOS環(huán)境下運行的LRUCache緩存功能
本文著重介紹如何在XCODE中,通過C++開發(fā)在IOS環(huán)境下運行的緩存功能。算法基于LRU,最近最少使用,需要的朋友可以參考下2012-11-11C++實現(xiàn)LeetCode(152.求最大子數(shù)組乘積)
這篇文章主要介紹了C++實現(xiàn)LeetCode(152.求最大子數(shù)組乘積),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07