별의 공부 블로그 🧑🏻‍💻
728x90
728x170

맵(Map)과 리듀스(Reduce)

  • 맵과 리듀스라는 용어는 Lisp와 같은 함수형 프로그래밍 언어에서 기원함.

 

맵(Map)

  • 컨테이너 C를 입력으로 받아, 컨테이너의 모든 원소에 함수 f(x)를 적용하는 연산
    • 예) f(x) = x² 함수를 사용할 경우에 대한 맵 연산

 

리듀스(Reduce)

  • 컨테이너 C의 모든 원소 x에 함수 f(acc, x)를 적용하여 하나의 값으로 축약하는 연산
    • 예) f(acc, x) = acc + x 함수를 사용할 경우에 대한 리듀스 연산

 

코드

#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
#include <cmath>

void transform_test(std::vector<int> S) {
    std::vector<int> Tr;
    std::cout << "[맵 테스트]" << std::endl;
    std::cout << "입력 배열, S: ";
    for (auto i : S) {
        std::cout << i << " ";
    }
    std::cout << std::endl;

    // std::transform() 함수 사용
    std::transform(S.begin(), S.end(), std::back_inserter(Tr), [](int x) { return std::pow(x, 2.0); });

    std::cout << "std::transform(), Tr: ";
    for (auto i : Tr) {
        std::cout << i << " ";
    }
    std::cout << std::endl;

    // std::for_each() 함수 사용
    std::for_each(S.begin(), S.end(), [](int& x) { x = std::pow(x, 2.0); });

    std::cout << "std::for_each(), S: ";
    for (auto i : S) {
        std::cout << i << " ";
    }
    std::cout << std::endl;
}

void reduce_test(std::vector<int> S) {
    std::cout << std::endl << "[리듀스 테스트]" << std::endl;
    std::cout << "입력 배열, S: ";
    for (auto i : S) {
        std::cout << i << " ";
    }
    std::cout << std::endl;

    // std::accumulate() 함수 사용
    auto ans = std::accumulate(S.begin(), S.end(), 0, [](int acc, int x) { return acc + x; });
    std::cout << "std::accumulate(), ans: " << ans << std::endl;
}

int main() {
    std::vector<int> S {1, 10, 4, 7, 3, 5, 6, 9, 8, 2};

    transform_test(S);
    reduce_test(S);

    return 0;
}

 

결과

[맵 테스트]
입력 배열, S: 1 10 4 7 3 5 6 9 8 2
std::transform(), Tr: 1 99 16 49 9 24 36 81 64 4 
std::for_each(), S: 1 99 16 49 9 24 36 81 64 4   

[리듀스 테스트]
입력 배열, S: 1 10 4 7 3 5 6 9 8 2
std::accumulate(), ans: 55
728x90
그리드형(광고전용)
⚠️AdBlock이 감지되었습니다. 원할한 페이지 표시를 위해 AdBlock을 꺼주세요.⚠️
starrykss
starrykss
별의 공부 블로그 🧑🏻‍💻


📖 Contents 📖