我有一个标准库的容器存储大数值,它们非常大以至于如果将它们相加可能会导致溢出。假设这个容器是这样的:
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
?
std::accumulate
一起使用,情况会更糟——它会破坏你的部分总和。如果您希望最终结果按整数除法规则四舍五入,请在问题中明确说明(那么您就不是在求平均值)。否则,每个读者都会认为您使用整数除法是一个 bug。 - Ben Voigt