std::experimental::parallel:: transform_reduce
|
헤더 파일에 정의됨
<experimental/numeric>
|
||
|
template
<
class
InputIt,
class
UnaryOp,
class
T,
class
BinaryOp
>
T transform_reduce
(
InputIt first, InputIt last,
|
(1) | (parallelism TS) |
|
template
<
class
ExecutionPolicy,
class
InputIt,
class
UnaryOp,
class
T,
class
BinaryOp
>
|
(2) | (parallelism TS) |
범위
[
first
,
last
)
내의 각 요소에
unary_op
을 적용하고, 그 결과들을 초기값
init
과 함께
binary_op
을 통해 (지정되지 않은 방식으로 순열 및 집계될 수 있는) 축소 연산을 수행합니다.
binary_op 이 결합 법칙이나 교환 법칙을 따르지 않는 경우, 해당 동작은 비결정적입니다.
unary_op
또는
binary_op
가
[
first
,
last
)
범위 내의 어떤 요소를 수정하거나 어떤 반복자를 무효화하는 경우, 그 동작은 정의되지 않습니다.
목차매개변수
반환값init 와 unary_op ( * first ) , unary_op ( * ( first + 1 ) ) , ... unary_op ( * ( last - 1 ) ) 의 일반화된 합을 binary_op 에 대해 계산하며, 여기서 일반화된 합 GSUM(op, a 1 , ..., a N ) 는 다음과 같이 정의됩니다:
다시 말해, unary_op 의 결과는 임의의 순서로 그룹화되고 배열될 수 있습니다. 복잡도O(last - first) 번의 unary_op 와 binary_op 각각의 적용. 예외
참고 사항unary_op 는 init 에 적용되지 않습니다. 범위가 비어 있으면, init 가 수정되지 않은 상태로 반환됩니다.
예제transform_reduce는 std::inner_product 를 병렬화하는 데 사용할 수 있습니다:
이 코드 실행
#include <boost/iterator/zip_iterator.hpp> #include <boost/tuple.hpp> #include <experimental/execution_policy> #include <experimental/numeric> #include <functional> #include <iostream> #include <iterator> #include <vector> int main() { std::vector<double> xvalues(10007, 1.0), yvalues(10007, 1.0); double result = std::experimental::parallel::transform_reduce( std::experimental::parallel::par, boost::iterators::make_zip_iterator( boost::make_tuple(std::begin(xvalues), std::begin(yvalues))), boost::iterators::make_zip_iterator( boost::make_tuple(std::end(xvalues), std::end(yvalues))), [](auto r) { return boost::get<0>(r) * boost::get<1>(r); } 0.0, std::plus<>() ); std::cout << result << '\n'; } 출력: 10007 같이 보기
| ||||||||||||||||||||||||||||