【问题标题】:STL/ranges algorithm to calculate weighted average用于计算加权平均值的 STL/范围算法
【发布时间】:2020-01-02 22:33:15
【问题描述】:

假设我有一个成绩向量,其中成绩为

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

是否有 STL/range-v3 算法/算法可以让我做到这一点?

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

【问题讨论】:

  • 目前正在开发受限数值算法:P1813。他们将启用类似:ranges::inner_product(grades, grades, 0, {}, {}, &Grade::grade, &Grade::ECTS);

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


【解决方案1】:

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。
  • 确实有这种可能。感谢您顺便修复累加器/值顺序;)
【解决方案2】:

range-v3 可能是:

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

Demo

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-10
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多