小赖子的英国生活和资讯

理解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);

示例 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;
}

关键点

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

C/C++编程

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

强烈推荐

微信公众号: 小赖子的英国生活和资讯 JustYYUK

阅读 桌面完整版
Exit mobile version