函數(shù)式編程中的 map、reduce、filter,它們都是一種控制。而參數(shù) lambda 是邏輯(我們要解決的問題),它們一起組成了一個(gè)算法。最后,我再把數(shù)據(jù)放在數(shù)據(jù)結(jié)構(gòu)里進(jìn)行處理,最終就成為了我們的程序。
概念
出自Google的論文《MapReduce: simplified data processing on large clusters》,MapReduce是一種編程模型,用于大規(guī)模數(shù)據(jù)集(大于1TB)的并行運(yùn)算。概念"Map(映射)"和"Reduce(歸約)",是它們的主要思想,都是從函數(shù)式編程語言里借來的,還有從矢量編程語言里借來的特性。它極大地方便了編程人員在不會(huì)分布式并行編程的情況下,將自己的程序運(yùn)行在分布式系統(tǒng)上。
- 程序 = 算法 + 數(shù)據(jù)結(jié)構(gòu)
- 算法 = 控制 + 邏輯
- 程序復(fù)雜度 = 控制復(fù)雜度(可降低) + 邏輯復(fù)雜度(理論下限)
- 架構(gòu)或設(shè)計(jì)目的就是分離控制和邏輯
函數(shù)式編程中的 map、reduce、filter,它們都是一種控制。而參數(shù) lambda 是邏輯(我們要解決的問題),它們一起組成了一個(gè)算法。最后,我再把數(shù)據(jù)放在數(shù)據(jù)結(jié)構(gòu)里進(jìn)行處理,最終就成為了我們的程序。

注:vegetarian 素食主義者
| C++ |
map | std::transform |
filter | std::remove_if |
reduce | std::accumulate |
例子
- 過濾出奇數(shù)
- 把上一步計(jì)算結(jié)果分別做平方處理
- 把上一步的結(jié)果進(jìn)行求和
#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;
}

在線測(cè)試
https://wandbox.org/permlink/yqa3d46oSx2GnVoQ