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

NoS*_*tAl 13 c++ stl weighted-average range-v3

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

struct Grade{
   const int grade;
   const int ECTS; // weight
};
Run Code Online (Sandbox Code Playgroud)

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

我知道我可以std:: accumulate用一些花哨的类型作为累加器(记住重量的总和)来做到这一点,但是我正在寻找一个更简单的替代方法(如果存在)。

Tom*_*Tom 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;
Run Code Online (Sandbox Code Playgroud)

std::tie如果需要,可以用C ++ 17结构化绑定替换。


Jar*_*d42 6

使用range-v3,可能是:

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

演示版