C++(23): C++:STL中的时间库(std::chrono)

2024-05-15 23:28
文章标签 c++ 时间 23 std stl chrono

本文主要是介绍C++(23): C++:STL中的时间库(std::chrono),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 简述

        C++ STL库中的 chrono 是一个关于日期和时间的库,它提供了一套丰富、灵活且类型安全的API,用于测量和操作时间。chrono 库是C++11标准的一部分,它使得我们可以进行高精度的时间测量,以及执行基于时间点的算术操作。

2. chrono的主要组件

(1)时间点(Time Points)

        表示一个特定的时间点,例如“2023-07-06 12:00:00”。chrono 库提供了几种时间点类型,如 system_clock::time_point,steady_clock::time_point,high_resolution_clock::time_point 等。

(2)时间长度(Durations)

        表示一段时间,例如“5小时”,“10分钟”或“2.5秒”。chrono 库提供了多种表示时间长度的类型,例如 hours,minutes,seconds,milliseconds,microseconds 和 nanoseconds。

(3)时钟(Clocks)

        用于获取当前时间点。chrono 库中定义了几个时钟类型,包括 system_clock(表示从1970年1月1日开始的实时时钟),steady_clock(表示一个不会被调整的时钟,通常用于测量持续时间),high_resolution_clock(提供最高精度的时钟)等。

3. 定义时间点并获得时间

        std::chrono::time_point是一个模板类,可以通过该类定义基于不同时钟的时间点。

        如下,定义了一个基于system_clock的时间点。

std::chrono::time_point<std::chrono::system_clock> sys_time_tic;

        之后可以通过如下方式获得某一时间点。

sys_time_tic = std::chrono::system_clock::now();

        也可以定义一个steady_clock或high_resolution_clock的时间点,分别如下所示。

std::chrono::time_point<std::chrono::steady_clock> steady_time_tic;

std::chrono::time_point<std::chrono::high_resolution_clock> high_res_time_tic;

        获取时间点的方式也有所不同,需要依赖于各自的时钟类型。

steady_time_tic = std::chrono::steady_clock::now();

high_res_time_tic = std::chrono::high_resolution_clock::now();

4. 定义一个时间长度

        一般情况下,我们使用std::chrono::duration来定义一个时间长度。

        其原型如下所示。

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

class duration;

Rep是一个数值类型,用来表示此持续时间的长度。这可以是任何数值类型,但通常是整数类型(如 int64_t、long long 等)或浮点数类型(如 double、float)。这个类型决定了能够表示的时间精度和范围。

Period是一个表示时间单位的类型,它通常是 std::ratio 的一个特化,用来表示时间的分母和分子。例如,std::ratio<1> 表示以秒为单位,std::ratio<1, 1000> 表示以毫秒为单位。这个模板参数使得 duration 可以灵活地表示不同的时间单位。

std::chrono::duration还有很多变种,可以更方便的表示一段时间。

  1. std::chrono::hours
  2. std::chrono::minutes
  3. std::chrono::seconds
  4. std::chrono::milliseconds
  5. std::chrono::microseconds
  6. std::chrono::nanoseconds

        举例来说,std::chrono::milliseconds类似于std::chrono::duration(int64_t, std::ratio(1, 1000)),但不完全等同,因为前者是一个特化类型,还包含了额外的一些特性。

5. 计算一个时间周期

        假如我们想计算一个操作的执行时间,我们定义两个时间点,分别是sys_time_tic和sys_time_toc,那么我们就可以通过std::chrono::duration或std::chrono::duration_cast计算这一操作所花费的时间。

如下,通过std::chrono::duration计算操作所需的秒数。

std::chrono::duration<double> elapsed = sys_time_tic - sys_time_toc;

当然也可以直接的进行转换,下面两种方式是一样的。

std::chrono::milliseconds duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start); 

auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);  

通过count()获取实际的时长。

std::cout << "The operation took " << duration.count() << " milliseconds." << std::endl;

这篇关于C++(23): C++:STL中的时间库(std::chrono)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/993223

相关文章

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

C++ 中的 if-constexpr语法和作用

《C++中的if-constexpr语法和作用》if-constexpr语法是C++17引入的新语法特性,也被称为常量if表达式或静态if(staticif),:本文主要介绍C++中的if-c... 目录1 if-constexpr 语法1.1 基本语法1.2 扩展说明1.2.1 条件表达式1.2.2 fa

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

C++字符串提取和分割的多种方法

《C++字符串提取和分割的多种方法》在C++编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时,本文将详细探讨如何使用C++标准库中的工具来提取和分割字符串,并分析不同方法的适用... 目录1. 字符串提取的基本方法1.1 使用 std::istringstream 和 >> 操作符示

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.

C++ 各种map特点对比分析

《C++各种map特点对比分析》文章比较了C++中不同类型的map(如std::map,std::unordered_map,std::multimap,std::unordered_multima... 目录特点比较C++ 示例代码 ​​​​​​代码解释特点比较1. std::map底层实现:基于红黑

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程