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)
    1. 타입 T의 누산기 accinit으로 초기화하고, 범위의 각 반복자 i에 대해 acc = acc + *i(C++20부터 acc = std::move(acc) + *i)를 적용해요.
    1. 덧셈 대신 acc = op(acc, *i)(C++20부터 op(std::move(acc), *i))로 계산해요.

init으로 누산기의 초기 타입(T)을 정하는 게 핵심이에요. 예를 들어 정수 합을 구하려면 init0으로, 곱을 구하려면 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으로 시작하면 정수 타입으로 캐스팅돼 부동소수점 합에서 정밀도가 떨어질 수 있다는 점을 주의해야 해요.

더 알아보기 (Learn more)

cppreference