본문 바로가기

프로그래밍 언어 노트/C++ | Modern C++

[Modern C++] C++ 의 map, reduce, filter

    std::vector<int> nums{ 1,2,3,4 };
    std::vector<int> map_example;
    std::vector<int> filter_example;

    std::transform(nums.begin(), nums.end(), std::back_inserter(map_example), [](const auto& x) {return x * x; });
    std::copy_if(nums.begin(), nums.end(), std::back_inserter(filter_example), [](const auto& x) {return x % 2 == 0; });
    auto reduce_example = std::accumulate(nums.begin(), nums.end(), 1, [](const auto& x,const auto& y) {return x * y; });


    for (auto& i : map_example)
    {
        cout << i << "\t";
    }
    cout << endl;
    for (auto& i : filter_example)
    {
        cout << i << "\t";
    }
    cout << endl;
    cout << reduce_example;
    cout << endl;

 

 

좀 불편하긴한데;; 아무튼 쓸수있다.

map: std::transform // #include <algorithm> 필요

filter: std::copy_if // #include <algorithm> 필요

reduce: std::reduce // #include <numeric> 필요...하다는데 vs2019에서 추가해도 사용이 안되는듯하다.. -> 쓸수있다.. 내가 엄한데서 C++ 버전 설정을 하고있었던거..

reduce: std::accumulate // reduce 와 비슷하다 그러나 reduce는 execution을 정해주어 병렬 처리가 가능

 

accutmulate의 경우 3번째가 초기값, 4번째가 펑션이고, 4번째를 비워두면 자동으로 + 로 되는듯, 여기서는 곱으로 해서 초기값을 1로 해주었다 (0으로 곱하면 무조건 0이므로..)

 

모던C++ 에 파이프가 없는건 아니지만 적용하기가 좀 힘들어보여서 변수를 만들어줘야한다.

transform 같은경우는 3번째 인자에 다른 이터레이터를 주어 map2 처럼 사용할수도 있다.

back_inserter 같은경우는 해당 파라미터에 push_back 하는걸 OOP 형식이 아닌 함수형태로 쓰는법이다. 저렇개 해줘야 파라미터로 받은 벡터에 들어간다.

front_inserter 도 당연히 존재하는데 이는 push_front 인터페이스 가 있어야지만 사용가능하므로 벡터에서는 못쓰고 iterator 헤더를 인클루드 해줘야한다. back_inserter 는 VS 기준으로 걍 쓸수있다

 

그 밖에도 다양한 함수들이 미친듯이 추가되고있다.

추가되는건 좋은데 안그래도 어려운 C++ 공부를 더 어렵게 하고있다ㅜ 그리고 왜 이름을 FP 에서 쓰는 느낌으로 안 만드냐고 ㅜ

 

 

 

728x90