![](/img/trans.png)
[英]Difference between two nanosecond chrono::time_points, but in seconds?
[英]How to get the average of several chrono::time_points
獲得幾個數字的平均值的公式當然是眾所周知的:
這個公式可以很容易地用來獲得chrono::duration
s的平均值:
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...) / sizeof...(d);
}
但是chrono::time_point
s不能互相添加。 我怎樣才能平均time_point
?
它有助於開始假設您可以添加time_point
,然后操縱公式以消除這些添加:
首先從總和中分出t 1 :
接下來加上和減去t 1 :
因素和重新排列:
然后,由於你在求和時減去t 1的次數相同,你可以將它包含在總和中:
現在你總結duration
s 而不是 time_point
s! 由於我們已經有一個總和duration
s的函數,平均time_point
可以很容易地建立在:
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)
{
return t0 + sum((t - t0)...) / (1 + sizeof...(t));
}
平均單個time_point
是一種特殊情況,因為duration
s的sum
不處理零duration
s的總和(單位是什么?)。 因此,很容易添加該案例的重載:
template <class Clock, class Duration0>
auto
avg(const std::chrono::time_point<Clock, Duration0>& t0)
{
return t0;
}
這是用C ++ 14編寫的。 它可以使用尾隨返回類型聲明語法在C ++ 11中編碼,該語法更詳細,但完全可行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.