algorithm_exclusive_scan

algorithm_exclusive_scan (배타적 누적 합계)

std::exclusive_scan은 범위의 요소들에 대해 배타적(exclusive) 접두 합계를 계산해요. 각 위치의 결과에 자기 자신의 요소를 포함하지 않는 게 특징이에요.

출처: cppreference

본문

std::exclusive_scan<numeric> 헤더에 정의되어 있어요. C++17부터 사용 가능해요.

template< class InputIt, class OutputIt, class T >
OutputIt exclusive_scan( InputIt first, InputIt last,
                         OutputIt d_first, T init );

template< class InputIt, class OutputIt,
          class T, class BinaryOp >
OutputIt exclusive_scan( InputIt first, InputIt last,
                         OutputIt d_first, T init, BinaryOp op );

이진 연산 op를 사용해 배타적 접두 합계를 계산해요. [0, std::distance(first, last))의 각 정수 i에 대해 다음을 순서대로 수행해요:

  1. init 다음에 [first, iter)의 요소들을 순서대로 이어붙인 수열을 만들어요. (여기서 iterfirsti번째 다음 반복자예요.)
  2. 그 수열에 대해 op를 이용한 일반화된 비가환 합(generalized noncommutative sum)을 계산해요.
  3. 그 결과를 *dest에 할당해요. (여기서 destd_firsti번째 다음 반복자예요.)

1번 오버로드exclusive_scan(first, last, d_first, init, std::plus<>())와 동등해요. 병렬 실행 정책을 받는 오버로드도 있어요.

일반화된 비가환 합이란, 수열에 요소가 하나뿐이면 그 값 자체가 합이고, 여러 개면 op로 차례로 결합한 값이에요.

반환값 (Return value)

출력 범위의 끝(past-the-end) 반복자예요.

예제 (Example)

#include <functional>
#include <iostream>
#include <iterator>
#include <numeric>
#include <vector>

int main()
{
    std::vector data {3, 1, 4, 1, 5, 9, 2, 6};

    std::cout << "exclusive sum: ";
    std::exclusive_scan(data.begin(), data.end(),
                        std::ostream_iterator<int>(std::cout, " "),
                        0);
    std::cout << "\ninclusive sum: ";
    std::inclusive_scan(data.begin(), data.end(),
                        std::ostream_iterator<int>(std::cout, " "));

    std::cout << "\nexclusive product: ";
    std::exclusive_scan(data.begin(), data.end(),
                        std::ostream_iterator<int>(std::cout, " "),
                        1, std::multiplies<>{});
}

더 알아보기 (Learn more)

cppreference