加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 05:22:15 所属栏目:百科 来源:网络整理
导读:我有一个大数量的标准库容器,如果它们加在一起,它们可能会导致溢出.我们假装是这个容器: std::vectorint v = {1,2,3,4,5,6,7,8,9,10}; 我想使用std :: accumulate来计算这个容器的平均值,但是我不能将所有的数字加在一起.我会用v [0] /v.size()v [1] /v.siz
我有一个大数量的标准库容器,如果它们加在一起,它们可能会导致溢出.我们假装是这个容器:
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;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读