深圳幻海软件技术有限公司 欢迎您!

C++代码赏析:Map、Filter、Reduce

2023-02-28

概念出自Google的论文《MapReduce:simplifieddataprocessingonlargeclusters》,MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。概念"Map(映射)"和"Reduce(归约)",是它们的主要思想,都是从函数式编程语言里借来

概念

出自Google的论文《MapReduce: simplified data processing on large clusters》,MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。概念"Map(映射)"和"Reduce(归约)",是它们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性。它极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。

  • 程序 = 算法 + 数据结构
  • 算法 = 控制 + 逻辑
  • 程序复杂度 = 控制复杂度(可降低) + 逻辑复杂度(理论下限)
  • 架构或设计目的就是分离控制和逻辑

函数式编程中的 map、reduce、filter,它们都是一种控制。而参数 lambda 是逻辑(我们要解决的问题),它们一起组成了一个算法。最后,我再把数据放在数据结构里进行处理,最终就成为了我们的程序。

注:vegetarian 素食主义者


C++

map

std::transform

filter

std::remove_if

reduce

std::accumulate

例子

  1. 过滤出奇数
  2. 把上一步计算结果分别做平方处理
  3. 把上一步的结果进行求和
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>

using namespace std;

int main(){
    std::vector<int> nums{ 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    std::vector<int> cache (nums.size());

    // filter
    auto it = std::copy_if (nums.begin(),
                         nums.end(),
                         cache.begin(),
                         [](int n){return n % 2 == 1;});
    // shrink container to new size
    cache.resize(std::distance(cache.begin(),it));

    // map
    std::transform(cache.begin(),
                   cache.end(),
                   cache.begin(),
                   [](int n) -> int {return n * n; });

    auto result = std::accumulate(cache.begin(),
                               cache.end(),
                               0,
                               [] (int carry, int n){ return carry + n;});

    std::cout << result << std::endl;

    return 0;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.

在线测试

https://wandbox.org/permlink/yqa3d46oSx2GnVoQ
  • 1.