C/C++时间库chrono的使用总结

 更新时间:2023年12月14日 10:28:25   作者:小谢sd  
std::chrono是C++标准库中的一个组件,用于表示和处理时间,其功能就像是心理学中的感知系统,它可以为我们捕捉、量化并操作抽象的时间概念,这就如同我们的大脑可以理解和感知周围环境的时间流逝一样,这种感知和理解能力是人类进行日常活动所必需的,

在程序设计中,时间管理是一个核心概念,它不仅关系到程序的效率和性能,而且直接影响用户体验。C++作为一门高效的编程语言,提供了std::chrono库,用于精确地处理和计算时间。这个库的设计体现了程序员对时间流逝的敏感性,同时也揭示了编程中对精确度和性能的持续追求。

使用 <chrono> 库的好处是可以以不同的精度测量时间,包括纳秒、微秒、毫秒和秒。通过计算两个时间点之间的时间间隔,可以精确地测量代码执行的时间。

std::chrono库主要包含以下功能:

  • 时间点:表示特定的时间点,比如当前的时间。这如同人们通过记忆可以回忆起特定的时刻。
  • 时间段:表示时间的长度,比如1秒,1分钟,1小时等。这如同人们能够感知时间的流逝,理解"早","晚"等概念。
  • 时钟:用于获取当前的时间点,有三种类型的时钟:system_clock,steady_clock和high_resolution_clock。这如同人们通过看表来知道现在的具体时间。

为了更好的理解这些功能,让我们看一下下面的表格:

类名描述对应的心理学概念
std::chrono::system_clock系统的实际时间,可能会受到系统时间调整的影响外部环境对人的影响
std::chrono::steady_clock稳定的时钟,时间从不调整稳定、可靠的心理状态
std::chrono::high_resolution_clock提供最小的可表示的时间间隔细微的心理变化
std::chrono::time_point表示特定的时间点特定的记忆
std::chrono::duration表示时间的长度时间的感知

通过一个具体实例来逐步讲解时间库chrono的使用,实例如下:

  // 开始计时
  auto startTime = std::chrono::steady_clock::now();
  //自己定义的检查答案的函数,可忽略
  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_clocksteady_clock 是一个表示稳定、递增的时钟,用于测量时间间隔。它提供了一个相对稳定的时间基准,适用于测量较小时间间隔。
  • std::chrono::steady_clock::now()now()steady_clock 类的成员函数,用于获取当前的时间点。
  • 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;
这一行代码计算 endTimestartTime 之间的时间差,并将结果存储在 elapsedSeconds 变量中。elapsedSeconds 是一个 std::chrono::duration 类型的对象,用于表示持续的时间。通过将 endTime 减去 startTime,我们得到了这段时间的持续时间。

注:std::chrono::duration 是 C++ 标准库中用于表示时间持续的类模板。std::chrono::duration 提供了一系列成员函数和运算符,用于对时间持续进行操作和计算。一些常用的成员函数和运算符包括:

  • count():返回持续时间的内部表示值(类型为 Rep)。
  • operator+、operator-:用于对两个持续时间进行加法和减法运算。
  • operator*、operator/:用于将持续时间乘以或除以一个标量值。
  • operator==、operator!=、operator<、operator>:用于比较两个持续时间的大小关系。

2.int elapsedMinutes = static_cast<int>(elapsedSeconds.count() / 60);
这一行代码将持续时间转换为以分钟为单位的整数值。elapsedSeconds.count() 返回持续时间的秒数,除以 60 可以得到分钟数。使用 static_cast<int> 进行强制类型转换,将浮点数结果转换为整数。

注:static_cast 是 C++ 中的一种类型转换操作符,用于进行静态类型转换(static_cast)。

静态类型转换是一种在编译时进行的类型转换,它允许将一个类型转换为另一个相关类型,前提是这两个类型之间存在某种类型转换的关系。

static_cast 可以用于以下几种转换:

  • 隐式类型转换:static_cast 可以将一种算术类型转换为另一种算术类型,如将 int 转换为 double、将 float 转换为 int 等。
  • 类层次转换:static_cast 可以在类层次结构中进行向上转型(upcast)和向下转型(downcast),但在向下转型时需要注意安全性,因为 static_cast 不提供运行时类型检查。如果向下转型是不安全的,应该使用 dynamic_cast 进行动态类型转换。
  • 指针类型转换:static_cast 可以在指针类型之间进行转换,包括将派生类指针转换为基类指针(向上转型)和将基类指针转换为派生类指针(向下转型)。在指针转换时,编译器不会进行运行时类型检查,因此需要确保转换是安全的。

引用类型转换:static_cast 可以在引用类型之间进行转换,类似于指针类型转换。转换时需要注意类型的兼容性和安全性。

3.int elapsedSecondsRemainder = static_cast<int>(elapsedSeconds.count()) % 60;
这一行代码计算以秒为单位的剩余时间。elapsedSeconds.count() 返回持续时间的秒数,使用 static_cast<int> 将其转换为整数。然后,通过取模运算符 % 将其对 60 取余,得到不足一分钟的剩余秒数。 

到此这篇关于C/C++时间库chrono的使用总结的文章就介绍到这了,更多相关C++时间库chrono内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入const int *p与int * const p的区别详解(常量指针与指向常量的指针)

    深入const int *p与int * const p的区别详解(常量指针与指向常量的指针)

    本篇文章是对const int *p与int * const p的区别进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • 浅析C++中类模板的用法

    浅析C++中类模板的用法

    C++类模板是一种用于创建通用类的工具,它允许我们定义一个通用类,支持多种类型。本文就来简单讲讲它的具体使用吧,感兴趣的可以了解一下
    2023-04-04
  • c++中 isupper()和islower()函数详解

    c++中 isupper()和islower()函数详解

    在C++中,islower()和isupper()是C++标准库中提供的两个字符判断函数,这两个函数用于判断一个字符是否为小写字母或大写字母,这篇文章主要介绍了c++ isupper() islower()的相关资料,需要的朋友可以参考下
    2024-05-05
  • 基于MFC实现单个文档的文件读写

    基于MFC实现单个文档的文件读写

    这篇文章主要为大家详细介绍了如何基于MFC实现单个文档的文件读写功能,文中的示例代码讲解详细,对我们学习有一定帮助,感兴趣的可以了解一下
    2022-07-07
  • C++用read()和write()读写二进制文件的超详细教程

    C++用read()和write()读写二进制文件的超详细教程

    二进制的文件肉眼我们是读不懂的,如果通过二进制的读写操作就可以读懂,下面这篇文章主要给大家介绍了关于C++用read()和write()读写二进制文件的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • 详解Bucket Sort桶排序算法及C++代码实现示例

    详解Bucket Sort桶排序算法及C++代码实现示例

    桶排序是一种线性排序算法,这里我们来详解Bucket Sort桶排序算法及C++代码实现示例,需要的朋友可以参考下
    2016-07-07
  • 一文弄懂c语言赋值截断

    一文弄懂c语言赋值截断

    截断是指将一个较宽范围的整型赋值给一个较窄范围的整型时,超出目标类型表示范围的部分被丢弃,只保留目标类型能够表示的部分,本文主要介绍了c语言赋值截断,具有一定的参考价值,感兴趣的可以了解一下
    2025-03-03
  • c语言中if语句是怎么变成汇编代码的详解

    c语言中if语句是怎么变成汇编代码的详解

    if语句是指编程语言,包括c语言、C#、VB、java、汇编语言等,下面这篇文章主要给大家介绍了关于c语言中if语句是怎么变成汇编代码的相关资料,需要的朋友可以参考下
    2021-11-11
  • 使用UDP协议实现单词翻译服务器

    使用UDP协议实现单词翻译服务器

    这篇文章主要为大家详细介绍了如何使用UDP协议实现英文单词翻译服务器,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解下
    2023-08-08
  • 数据结构 数组顺序存储详细介绍

    数据结构 数组顺序存储详细介绍

    这篇文章主要介绍了数据结构 数组顺序存储详细介绍的相关资料,需要的朋友可以参考下
    2017-05-05

最新评论