บิตรายวัน (e) ของ C++ #68, อัลกอริธึมการแปลงและการลดทั่วไปของ C++17: std::transform_reduce

การลดการแปลงเป็นการดำเนินการทั่วไปในระบบแบบกระจาย C ++ 17 เพิ่มการรองรับสำหรับอัลกอริธึมที่มีชื่อซ้ำซึ่งมีรูปแบบการลดการแปลงสำหรับช่วง

อัลกอริธึมต้องมีการลดการสับเปลี่ยนและการเชื่อมโยง แต่มีตัวแปรช่วงเดียวและสองช่วงและการโอเวอร์โหลดแบบขนาน

#include <numeric>
#include <vector>
#include <execution>

std::vector<double> values{2.3, 9.1, 4.7, 7.1, 1.9, 5.2};
std::vector<double> predictions{1.0, 2.0, 3.0, 4.0, 5.0, 6.0};

// Calculate the mean square error:
auto mse = std::transform_reduce(
    values.begin(), values.end(), // all elements
    predictions.begin(), // first element from second range
    0., // starting value, also dictates the type of accumulator
    std::plus<>{}, // reduction operation
    [](double val, double pred) { // transform operation
        return (val-pred)*(val-pred);
    }) / values.size(); // calculate the mean

// Same, but computed in parallel.
auto mse_par = std::transform_reduce(std::execution::par_unseq,
    values.begin(), values.end(),
    predictions.begin(), 
    0.,
    std::plus<>{},
    [](double val, double pred) {
        return (val-pred)*(val-pred); 
    }) / values.size();

// mse == mse_par == 12.475

std::vector<int> data{1,2,3,4,5};
// Unary (single-range) version is also supported:
int sum_of_squares = std::transform_reduce(data.begin(), data.end(),
    0,
    std::plus<>{},
    [](int v) { return v*v; });
// sum_of_squares == 55

เปิดตัวอย่างใน Compiler Explorer