はじめに
templateクラスを用いて、C++で抽出・変換・集計処理を行います。
#include <iostream> #include <algorithm> //copy_if, for_each, transform #include <vector> #include <array> #include <numeric> //iota, accumulate #include <cassert> using namespace std; void print_num(int num){ std::cout<< num << std::endl; } //int filter_map_fold(const std::vector<int>& nums) //以下のように宣言を変えるとnumsはvectorでもarrayでも良くなる template <class T> auto filter_map_fold(const T& nums) { std::vector<int> odds; // filter(抽出)(奇数を抽出) std::copy_if(nums.begin(), nums.end(), std::back_inserter(odds), [](int num){ return num % 2;}); // 表示内容を確認 std::for_each(odds.begin(), odds.end(), [](int n){ std::cout << n << std::endl; }); // Map(変換)(2倍する) std::vector<int> doubles; std::transform(odds.begin(), odds.end(), std::back_inserter(doubles), [](int num){ return num * 2; } ); // 表示内容を確認 std::for_each(doubles.begin(), doubles.end(), [](int n){ std::cout << n << std::endl; }); // fold(集計)(統計する) int result = std::accumulate(doubles.begin(), doubles.end(), 0, [](int acc, int n) { return acc + n;}); return result; } int main(void){ // 指定された値から始まる整数列を生成する std::array<int, 10> nums; std::iota(nums.begin(), nums.end(), 1); constexpr auto ANSWER = 50; const int result = filter_map_fold(nums); std::cout << "result : " << result << std::endl; assert(result == ANSWER); }