微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

周期计数功能

如何解决周期计数功能

我是 chrono 库的新手,我正在尝试用它来编写一个函数,该函数返回两次之间有多少 5 分钟的时间段。请注意:1 分钟源和 5 分钟结果周期可能不同,因此解决方案需要灵活(例如 5 分钟源,15 分钟结果周期是一种可能的组合)。

例如,我有以下通用代码

using namespace std::chrono;
using namespace std::chrono_literals;

auto tp_Now = system_clock::Now();  //define 1st tp
auto tp_test = tp_Now - 4min;       //define 2nd tp

duration<int64_t,std::ratio<1,5*60>> five_mins;   //define a duration of 5mins
std::cout << "period_index = " << floor(five_mins(tp_test)).count() << std::endl;  //print out the 
                                                                                   //period 
                                                                                   //duration count

代码无法编译(我不确定为什么),但它希望显示 4 分钟测试周期内有多少 5 分钟周期。显然,4 分钟的测试时间是一个变量,可能会有所不同。下面给出了 4min 变量与相应结果不同的一些示例:

0-4 mins    result = 0
5-9 mins    result = 1
10-14 mins  result = 2
15-19 mins  result = 3
20-24 mins  result = 4

请问我怎样才能做到这一点?

解决方法

five_mins 应该是类型,而不是变量。

此外,std::ratio<1,5*60> 是 1 分之三秒,而不是 5 分钟。

using five_mins = duration<int64_t,std::ratio<5*60>>;

此外,由于可能会发生截断并且时间不是浮点数,因此您不能使用 five_mins 构造函数。您必须使用 std::chrono::duration_cast<>,如下所示:

#include <chrono>
#include <iostream>

int main() {
    using five_mins = std::chrono::duration<int64_t,std::ratio<5*60>>;
    std::cout << std::chrono::duration_cast<five_mins>(std::chrono::seconds(700)).count() << std::endl;
}

您可以在此处查看正式的详细信息:https://en.cppreference.com/w/cpp/chrono/duration/duration,在构造函数 #4 下。

最后,从你原来的问题来看,你仍然需要将你的时间点转换成持续时间才能得到一个完整的程序:

std::cout << "period_index = " << std::chrono::duration_cast<five_mins>(tp_test-tp_now).count() << std::endl
,

您是否有不想写的原因:

std::cout << (/*some duration*/ / minutes(5)) << std::end;

CppReference

例如minutes(14)/minutes(5)的值为2seconds(1000) / minutes(5)的值为3

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。