c – 如何使用std :: accumulate和lambda来计算平均值?

前端之家收集整理的这篇文章主要介绍了c – 如何使用std :: accumulate和lambda来计算平均值?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个大数量的标准库容器,如果它们加在一起,它们可能会导致溢出.我们假装是这个容器:
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(),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?

解决方法

您不应该使用整数来存储结果:

返回类型传递给函数accumulate
T累加(InputIt first,InputIt last,T init,BinaryOperation op);取决于第三个参数类型:(T init),所以你必须放在那里:0.0得到结果为double.

#include <vector>
#include <algorithm>
#include <iostream>
#include <numeric>
using namespace std;
std::vector<int> v = { 1,10 };

int main()
{
    auto lambda = [&](double a,double b){return a + b / v.size(); };
    std::cout << std::accumulate(v.begin(),0.0,lambda) << std::endl;
}
原文链接:/c/114854.html

猜你在找的C&C++相关文章