transform_reduce
transform_reduce (변환·축소)
범위(또는 두 범위)의 각 요소에 함수를 적용한 결과를 이진 연산으로 병렬 가능하게 축소해 단일 값을 얻는 알고리즘이에요. <numeric> 헤더, C++17부터.
출처: cppreference
본문
transform_reduce는 병렬 축소(reduce)와 변환(transform)을 결합한 알고리즘이에요.
template< class InputIt1, class InputIt2, class T >
T transform_reduce( InputIt1 first1, InputIt1 last1,
InputIt2 first2, T init ); // (1) 내적
template< class InputIt, class T,
class BinaryOp, class UnaryOp >
T transform_reduce( InputIt first, InputIt last, T init,
BinaryOp reduce_op, UnaryOp transform_op ); // (2) 단항+축소
-
- 두 범위의 대응 요소를 곱해 합(내적)처럼 축소해요.
-
- 각 요소를
transform_op로 변환한 뒤reduce_op로 축소해요.
- 각 요소를
std::accumulate/inner_product와 달리 결합 순서가 미지정이어서 병렬 실행이 가능해요. 따라서 reduce_op는 결합법칙(그리고 병렬 시 교환법칙)이 성립해야 해요.
std::vector<int> v{1, 2, 3, 4};
int sum_sq = std::transform_reduce(v.begin(), v.end(), 0,
std::plus<>(), [](int x){ return x * x; });
// 1+4+9+16 = 30
병렬 처리를 이용해 변환 후 축소를 고속화할 때 쓰는 최신 알고리즘이에요.