假设我有一个成绩向量,其中的成绩是
struct Grade{
const int grade;
const int ECTS; // weight
};
有没有STL/range-v3算法/算法可以让我做到这一点?
我知道我可以使用std::accumulate
,并使用一些复杂的类型作为累加器(记住权重总和),但如果存在更简单的替代方法,我正在寻找它。
假设我有一个成绩向量,其中的成绩是
struct Grade{
const int grade;
const int ECTS; // weight
};
有没有STL/range-v3算法/算法可以让我做到这一点?
我知道我可以使用std::accumulate
,并使用一些复杂的类型作为累加器(记住权重总和),但如果存在更简单的替代方法,我正在寻找它。
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替换。
auto average_grade = double(grade_sum) / ects
。 - Jarod42
ranges::inner_product(grades, grades, 0, {}, {}, &Grade::grade, &Grade::ECTS);
- metalfox