理解C++中的std::transform_reduce及示例


理解 C++ 中的 std::transform_reduce 及示例

std::transform_reduce 是一个强大的 C++17 算法,它结合了 transformreduce(或 accumulate)的功能。它允许你对元素进行转换,然后使用二元操作进行归约,从而写出简洁高效的代码

语法

template<class InputIt1, class InputIt2, class T,
         class BinaryOp1, class BinaryOp2>
T transform_reduce(InputIt1 first1, InputIt1 last1,
                   InputIt2 first2, T init,
                   BinaryOp1 binary_op1,
                   BinaryOp2 binary_op2);

template<class InputIt, class T,
         class BinaryOp1, class UnaryOp>
T transform_reduce(InputIt first, InputIt last,
                   T init,
                   BinaryOp1 binary_op1,
                   UnaryOp unary_op);
  • 它可以对每个元素应用 一元转换(可选)。
  • 然后使用 二元操作对结果进行归约,如求和、求积或自定义组合
  • 在 C++17/20 中支持 并行执行策略

示例 1:求平方和

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

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};

    int sum_of_squares = std::transform_reduce(
        std::execution::seq,   // 顺序执行
        numbers.begin(),
        numbers.end(),
        0,                     // 初始值
        std::plus<>(),    // 二元操作(求和)
        [](int x){ return x*x; } // 一元转换(平方)
    );

    std::cout << "平方和: " << sum_of_squares << std::endl;
    return 0;
}

示例 2:向量点积

#include <iostream>
#include <vector>
#include <numeric>

int main() {
    std::vector<int> a = {1, 2, 3};
    std::vector<int> b = {4, 5, 6};

    int dot_product = std::transform_reduce(
        a.begin(), a.end(),
        b.begin(),
        0  // 初始值
    );

    std::cout << "点积: " << dot_product << std::endl;
    return 0;
}

示例 3:并行 transform_reduce

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

int main() {
    std::vector<double> numbers(1'000'000, 1.5);

    double sum = std::transform_reduce(
        std::execution::par,  // 并行执行
        numbers.begin(),
        numbers.end(),
        0.0
    );

    std::cout << "并行求和: " << sum << std::endl;
    return 0;
}

关键点

  • transform_reduce 避免了为转换后的值创建中间容器
  • 支持 顺序并行执行策略。
  • 有两种主要形式:单个范围带一元转换,或者两个范围进行成对操作(如点积)。
  • 初始值是必须的,以正确处理空范围。

std::transform_reduce 可以让你的代码更简洁、更高效,尤其适合大数据集或并行计算场景。

C/C++编程

英文:Understanding std::transform_reduce in Modern C++

本文一共 308 个汉字, 你数一下对不对.
理解C++中的std::transform_reduce及示例. (AMP 移动加速版本)
上一篇: 事隔两年半, 重新申请了American Express美国运通信用卡
下一篇: 通过了AI-900和DP-900两门微软认证考试! 新时代应该人手一个AI-900证书

扫描二维码,分享本文到微信朋友圈
1098f6744f7c6ba589497beabca30fd6 理解C++中的std::transform_reduce及示例 C++ C++ 学习笔记 程序设计 编程 计算机

评论