std::experimental::parallel:: transform_reduce
|
Definiert im Header
<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) |
Wendet
unary_op
auf jedes Element im Bereich
[
first
,
last
)
an und reduziert die Ergebnisse (möglicherweise umgeordnet und auf nicht spezifizierte Weise aggregiert) zusammen mit dem Initialwert
init
über
binary_op
.
Das Verhalten ist nicht deterministisch, wenn binary_op nicht assoziativ oder nicht kommutativ ist.
Das Verhalten ist undefiniert, falls
unary_op
oder
binary_op
irgendein Element modifiziert oder irgendeinen Iterator im Bereich
[
first
,
last
)
ungültig macht.
InhaltsverzeichnisParameter
RückgabewertVerallgemeinerte Summe von init und unary_op ( * first ) , unary_op ( * ( first + 1 ) ) , ... unary_op ( * ( last - 1 ) ) über binary_op , wobei die verallgemeinerte Summe GSUM(op, a 1 , ..., a N ) wie folgt definiert ist:
mit anderen Worten, die Ergebnisse von unary_op können in beliebiger Reihenfolge gruppiert und angeordnet werden. KomplexitätO(last - first) Anwendungen jeweils von unary_op und binary_op . Ausnahmen
Hinweiseunary_op wird nicht auf init angewendet. Wenn der Bereich leer ist, init wird unverändert zurückgegeben.
Beispieltransform_reduce kann verwendet werden, um std::inner_product zu parallelisieren:
Diesen Code ausführen
#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'; } Ausgabe: 10007 Siehe auch
| ||||||||||||||||||||||||||||