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) |
Применяет
unary_op
к каждому элементу в диапазоне
[
first
,
last
)
и редуцирует результаты (возможно переставленные и агрегированные неопределённым образом) вместе с начальным значением
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 См. также
| ||||||||||||||||||||||||||||