我有一个大数量的标准库容器,如果它们加在一起,它们可能会导致溢出.我们假装是这个容器:
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; }