STL /范围算法计算加权平均值

时间:2019-08-29 15:47:30

标签: c++ stl weighted-average range-v3

假设我有一个等级向量,其中等级是

struct Grade{
   const int grade;
   const int ECTS; // weight
};

是否有STL / range-v3算法/算法使我能够做到这一点?

我知道我可以用std:: accumulate做一些花式的累加器(记住权重之和),但是我正在寻找一个更简单的替代方法(如果存在)。

2 个答案:

答案 0 :(得分:15)

Grade类型本身花哨的程度足以充当累加器类型。

auto [grade_sum, ects] = std::accumulate(
    grages.begin(), grades.end(), Grade {0,0}, 
    [] (Grade acc, Grade g) -> Grade {
        return { g.grade*g.ECTS + acc.grade,
                 g.ECTS         + acc.ECTS  };
});
// auto average_grade = grade_sum/ects;
如有必要,

C ++ 17结构化绑定可以用std::tie代替。

答案 1 :(得分:6)

对于range-v3,可能是:

auto average = ranges::inner_product(grades, grades, 0, {}, {}, &Grade::grade, &Grade::ECTS)
        / double(ranges::accumulate(grades, 0, {}, &Grade::ECTS));

Demo