2024
11.13

 


C# 에서 Enumerable.Aggregate 를 사용해서 누적 합을 구했듯이

 

C++ 에서 연속된 수열을 처리하기 위한 함수로 

<numeric>헤더에서 std::accumulate 함수가 제공된다.

 

cplusplus : accumulate
https://cplusplus.com/reference/numeric/accumulate/?kw=accumulate
std::accumulate(InputIterator first, InputIterator last, T init, BinaryOperation op);

 

수열의 누적 합 구하기

포인터의 시작, 포인터의 끝, 시작 값을 넣어주면 된다.

덧셈의 항등원이 0이라서 0을 넣어준 것.

#include <iostream>
#include <numeric>
#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3, 4};
    
    // 누적 합 계산
    int sum = std::accumulate(vec.begin(), vec.end(), 0);
    std::cout << "Sum: " << sum << std::endl;  // 출력: Sum: 10

    return 0;
}

 

수열의 누적 곱 구하기

역시 동일한데, 네 번째 인자로 인자 두 개, 반환 int의 델리게이트를 받는다.

곱셈의 항등원이 1이라서 1을 넣어준 것.

int product = std::accumulate(vec.begin(), vec.end(), 1, std::multiplies<int>());

 

임의의 함수 사용하기

네 번째 인자의 델리게이트를 람다를 사용하면 된다.

int max_value = std::accumulate(vec.begin(), vec.end(), vec[0],
                                    [](int a, int b) { return std::max(a, b); });

 

 

Reduce 함수 (C++ 17)

cppreference : reduce
https://en.cppreference.com/w/cpp/algorithm/reduce

 

C++ 17에 병렬 처리를 함수들이 들어왔는데, 그중 한 개로 accumulate의 병렬 버전인 Reduce 함수가 제공된다.

헤더는 동일하게 <numeric>을 사용한다.

std::reduce(ExecutionPolicy policy, InputIterator first, InputIterator last, T init, BinaryOperation op);

인자는 거의 유사한데, 여러버전으로 오버로딩 되어있으며 맨 처음의 policy 가 있는 버전도 있다.

 

병렬정책에 다음과 같은 정책을 넣을 수 있다.

- std::execution::seq (순차 실행)

- std::execution::par (병렬 실행)

- std::execution::par_unseq (병렬 및 비순차 실행)

 

당연히 병렬처리는 극한의 성능을 가져올 수 있지만

순서가 보장되지 않아서 결합법칙이 성립하지 않는 연산(뺄셈, 나눗셈)은 주의해야 한다.

 

누적합 구하기

int sum = std::reduce(vec.begin(), vec.end(), 0);

 

누적곱 구하기

int product = std::reduce(vec.begin(), vec.end(), 1, std::multiplies<int>());

 

 

COMMENT