gpt4 book ai didi

c++ - 如何获得几个 chrono::time_points 的平均值

转载 作者:IT老高 更新时间:2023-10-28 23:14:33 25 4
gpt4 key购买 nike

求几个数的平均值的公式当然是众所周知的:

而且这个公式可以很容易地用来得到 chrono::durations:

的平均值
template <class Rep0, class Period0>
auto
sum(const std::chrono::duration<Rep0, Period0>& d0)
{
return d0;
}

template <class Rep0, class Period0, class ...Rep, class ...Period>
auto
sum(const std::chrono::duration<Rep0, Period0>& d0,
const std::chrono::duration<Rep, Period>& ...d)
{
return d0 + sum(d...);
}

template <class ...Rep, class ...Period>
auto
avg(const std::chrono::duration<Rep, Period>& ...d)
{
return sum(d...) / static_cast<std::common_type_t<Rep...>>(sizeof...(d));
}

但是 chrono::time_point 不能相互添加。如何平均 time_points?

最佳答案

从您可以添加 time_point 的假设开始会有所帮助。 s,然后操纵公式以消除这些添加:

首先从总和中分离出t1:

接下来都加t1:

因素和重新排列:

然后,由于您减去 t1 的次数与求和的次数相同,因此您可以将其包含在总和中:

现在你在求和 duration s 而不是 time_point !因为我们已经有一个函数来求和 duration s,平均 time_point s 可以轻松地以此为基础:

template <class Clock, class Duration0, class ...Duration>
auto
avg(const std::chrono::time_point<Clock, Duration0>& t0,
const std::chrono::time_point<Clock, Duration>& ...t)
{
constexpr auto N =
static_cast<std::common_type_t<typename Duration0::rep,
typename Duration::rep...>>(1 + sizeof...(t));
return t0 + sum((t - t0)...) / N;
}

平均单个 time_point是一个特殊情况,因为 durationsum s 不处理求和零 duration s(单位是什么?)。因此很容易添加这种情况的重载:

template <class Clock, class Duration0>
auto
avg(const std::chrono::time_point<Clock, Duration0>& t0)
{
return t0;
}

这是用 C++14 编写的。它可以用 C++11 编码,使用 trailing return type declaration语法,更冗长,但完全可行。

关于c++ - 如何获得几个 chrono::time_points 的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48213002/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com