nprogram’s blog

気ままに、プログラミングのトピックについて書いていきます

templateクラスを用いて、C++で抽出・変換・集計処理を行います

はじめに

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);
}