Try to simulate common lisp's map/reduce functions in C++11.
Code:
#include <iostream>
#include <list>
#include <sstream>
#include <string>
template <typename F, typename D>
D reduce(F f, std::list<D>& d, D r = 0) {
for (auto& i : d) r = f(r, i);
return r;
}
template <typename F, typename D>
D map(F f, D& d) {
D r;
for (auto& i : d) r.emplace_back(f(i));
return move(r);
}
template <typename D>
std::string lst2str(D&& d) {
std::stringstream ostr;
for (auto& r : d) ostr << r << " ";
return move(ostr.str());
}
int main() {
std::list<int> nums = {1, 3, 5, 9};
std::cout << "Input nums\t: " << lst2str(nums) << std::endl;
std::cout << "Map +2 \t: "
<< lst2str(map([](int& a) { return a + 2; }, nums)) << std::endl;
std::cout << "Reduce +\t: " << reduce([](int& a, int& b) { return a + b; },
nums) << std::endl;
std::cout << "Reduce *\t: " << reduce([](int& a, int& b) { return a * b; },
nums, 1) << std::endl;
return 0;
}
compile:
g++ -std=c++11 mapreduce.cpp && ./a.out
Input nums : 1 3 5 9
Map +2 : 3 5 7 11
Reduce + : 18
Reduce * : 135