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>());
'🌍 C++ Study > C++ 기초' 카테고리의 다른 글
C++ int 최대값 구하기 numeric_limits<int>::max() (0) | 2024.11.14 |
---|---|
C++ map (0) | 2024.11.14 |
C++ string to int / int to string / stoi, stol, stof (0) | 2024.11.11 |
C++ string 이어 붙이기 (0) | 2024.11.11 |
C++ string replace 문자열 바꾸기 (0) | 2024.11.10 |