accumulate
accumulate (누적 합계/이진 누적)
범위의 원소와 초기값을 이진 연산으로 차례로 누적하는 알고리즘이에요. 기본적으로 합계를 구하고, 사용자 정의 연산으로 일반화할 수 있어요. <numeric> 헤더에 있어요.
출처: cppreference
본문
accumulate는 주어진 값 init과 범위 [first, last)의 원소들의 합을 계산해요.
template< class InputIt, class T >
T accumulate( InputIt first, InputIt last, T init ); // (1)
template< class InputIt, class T, class BinaryOp >
T accumulate( InputIt first, InputIt last, T init, BinaryOp op ); // (2)
-
- 타입
T의 누산기acc를init으로 초기화하고, 범위의 각 반복자i에 대해acc = acc + *i(C++20부터acc = std::move(acc) + *i)를 적용해요.
- 타입
-
- 덧셈 대신
acc = op(acc, *i)(C++20부터op(std::move(acc), *i))로 계산해요.
- 덧셈 대신
init으로 누산기의 초기 타입(T)을 정하는 게 핵심이에요. 예를 들어 정수 합을 구하려면 init을 0으로, 곱을 구하려면 1로 시작해요.
다음 조건이 성립하면 동작이 미정의예요.
T가 CopyConstructible이 아님.T가 CopyAssignable이 아님.op가[first, last)의 어떤 요소를 수정함.op가[first, last]의 반복자나 하위 범위를 무효화함.
std::vector<int> v{1, 2, 3, 4, 5};
int sum = std::accumulate(v.begin(), v.end(), 0); // 15
int prod = std::accumulate(v.begin(), v.end(), 1, std::multiplies<int>()); // 120
std::accumulate는 왼쪽 폴드예요. 오른쪽 폴드를 하려면 인자 순서를 뒤집고 역방향 반복자를 쓰면 돼요. 또 기본값 0으로 시작하면 정수 타입으로 캐스팅돼 부동소수점 합에서 정밀도가 떨어질 수 있다는 점을 주의해야 해요.