reduce

reduce (병렬 가능 접두 합계)

범위에 누적 연산을 적용해 단일 값을 얻는 알고리즘이에요. accumulate와 달리 원소 순서·결합 순서가 미지정이라 병렬 실행에 적합해요. <numeric> 헤더, C++17부터.

출처: cppreference

본문

reduce[first, last)의 원소를 이진 연산으로 결합해 하나의 값을 얻어요.

template< class InputIt >
typename std::iterator_traits<InputIt>::value_type
    reduce( InputIt first, InputIt last );   // (1)

template< class InputIt, class T >
T reduce( InputIt first, InputIt last, T init );   // (2)
    1. init은 빈 태그 값으로, 2) init을 주고 시작해요.
  • 기본 연산은 덧셈이에요. 실행 정책 버전과 이진 연산 binary_op 버전이 있어요.

중요: std::accumulate는 왼쪽부터 순서대로 결합하는 반면, reduce는 결합 순서가 미지정이에요. 그래서 binary_op결합법칙이 성립해야 해요(그리고 병렬 실행 시 교환법칙도). 부동소수점 덧셈 같은 비결합 연산은 결과가 매번 달라질 수 있어요.

std::vector<int> v{1, 2, 3, 4, 5};
int sum = std::reduce(v.begin(), v.end(), 0);   // 15

// 병렬 실행
int psum = std::reduce(std::execution::par, v.begin(), v.end(), 0);

연산 순서를 보장해야 하는 코드라면 accumulate, 최대 성능이 필요하고 결합법칙이 성립하는 연산이라면 reduce를 써요.

더 알아보기 (Learn more)

cppreference