【发布时间】:2015-04-16 20:08:41
【问题描述】:
我有一个包含大量数字的标准库容器,如果我将它们加在一起,它们可能会导致溢出。让我们假设它是这个容器:
std::vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
我想使用 std::accumulate 计算这个容器的平均值,但我不能将所有数字加在一起。我将使用v[0]/v.size() + v[1]/v.size() + ... 计算它。所以我设置:
auto lambda = ...;
std::cout << std::accumulate(v.begin(), v.end(), 0, lambda) << std::endl;
这是我迄今为止尝试过的,其中-> 表示输出:
lambda = [&](int a, int b){return (a + b)/v.size();}; -> 1
lambda = [&](int a, int b){return a/v.size() + b/v.size();}; -> 1
lambda = [&](int a, int b){return a/v.size() + b;}; -> 10
我怎样才能产生正确的平均值以使输出为5?
【问题讨论】:
-
5不是正确答案。 -
@BenVoigt 如果您使用整数除法。
-
整数除法不用于计算平均值。结合
std::accumulate,情况更糟——它会毁掉你的部分金额。如果您希望根据整数除法规则对最终结果进行四舍五入,则应在问题中明确说明(然后您找不到均值)。否则,您对整数除法的使用对每个读者来说都是一个错误。
标签: c++ lambda accumulate