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结构化绑定替换。
使用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)