我一直无法找到一种从C++中的整数向量中获取平均值的方法.
我不可能开始添加所有值,因为我可以超过最大整数接受值.
如何有效,快速地计算出来?C++语言中是否有标准库可以做到这一点?
Bar*_*rry 25
首选方法只是用足够宽的整数类型求和std::accumulate:
double avg1(std::vector<int> const& v) {
return 1.0 * std::accumulate(v.begin(), v.end(), 0LL) / v.size();
}
Run Code Online (Sandbox Code Playgroud)
如果这个总和溢出(2300万英镑,平均值必须至少4.01x10 11 - 也就是说,它不会溢出,因为它甚至不适合int32_t...所以你很好,但是如果你得到几个数量级的数字,或者有更宽的int类型),那么你可以使用常见的"在线"算法来计算平均值:
double avg2(std::vector<int> const& v) {
int n = 0;
double mean = 0.0;
for (auto x : v) {
double delta = x - mean;
mean += delta/++n;
}
return mean;
}
Run Code Online (Sandbox Code Playgroud)
这不会溢出,不是很容易失去精度,但由于重复的额外划分可能会更昂贵.
| 归档时间: |
|
| 查看次数: |
11013 次 |
| 最近记录: |