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에 대해 다음을 순서대로 수행해요:
init다음에[first, iter)의 요소들을 순서대로 이어붙인 수열을 만들어요. (여기서iter는first의i번째 다음 반복자예요.)- 그 수열에 대해
op를 이용한 일반화된 비가환 합(generalized noncommutative sum)을 계산해요. - 그 결과를
*dest에 할당해요. (여기서dest는d_first의i번째 다음 반복자예요.)
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<>{});
}