<li><ahref="#ParallelTransformsInclude">Include the Header</a></li>
<li><ahref="#ParallelTransformsOverARange">Create a Unary Parallel-Transform Task</a></li>
<li><ahref="#ParallelBinaryTransformsOverARange">Create a Binary Parallel-Transform Task</a></li>
</ul>
</nav>
<p>Taskflow provides template functions for constructing tasks to perform parallel transforms over ranges of items.</p><sectionid="ParallelTransformsInclude"><h2><ahref="#ParallelTransformsInclude">Include the Header</a></h2><p>You need to include the header file, <code>taskflow/algorithm/transform.hpp</code>, for creating a parallel-transform task.</p><preclass="m-code"><spanclass="cp">#include</span><spanclass="w"></span><spanclass="cpf"><taskflow/algorithm/transform.hpp></span><spanclass="cp"></span></pre></section><sectionid="ParallelTransformsOverARange"><h2><ahref="#ParallelTransformsOverARange">Create a Unary Parallel-Transform Task</a></h2><p>Parallel-transform transforms a range of items, possibly with a different type for the transformed data, and stores the result in another range. The task created by <ahref="classtf_1_1FlowBuilder.html#abd813bd7afcbd8e6f56dc67883917d1a" class="m-doc">tf::<wbr/>Taskflow::<wbr/>transform(B first1, E last1, O d_first, C c)</a> is equivalent to a parallel execution of the following loop:</p><preclass="m-code"><spanclass="k">while</span><spanclass="w"></span><spanclass="p">(</span><spanclass="n">first1</span><spanclass="w"></span><spanclass="o">!=</span><spanclass="w"></span><spanclass="n">last1</span><spanclass="p">)</span><spanclass="w"></span><spanclass="p">{</span><spanclass="w"></span>
<spanclass="p">}</span><spanclass="w"></span></pre><p>By default, <ahref="classtf_1_1FlowBuilder.html#abd813bd7afcbd8e6f56dc67883917d1a" class="m-doc">tf::<wbr/>Taskflow::<wbr/>transform(B first1, E last1, O d_first, C c)</a> creates a task to spawn a subflow (see <ahref="DynamicTasking.html" class="m-doc">Dynamic Tasking</a>) that simultaneously applies the callable <code>c</code> to the object obtained by dereferencing every iterator in the range <code>[first1, last1)</code> and stores the result in another range beginning at <code>d_first</code>. It is user's responsibility for ensuring the range is valid within the execution of the parallel-transform task. <ahref="classtf_1_1Taskflow.html" class="m-doc">Taskflow</a>'s parallel-transform tasks work on all iterable STL containers.</p><preclass="m-code"><spanclass="n">std</span><spanclass="o">::</span><spanclass="n">vector</span><spanclass="o"><</span><spanclass="kt">int</span><spanclass="o">></span><spanclass="w"></span><spanclass="n">src</span><spanclass="w"></span><spanclass="o">=</span><spanclass="w"></span><spanclass="p">{</span><spanclass="mi">1</span><spanclass="p">,</span><spanclass="w"></span><spanclass="mi">2</span><spanclass="p">,</span><spanclass="w"></span><spanclass="mi">3</span><spanclass="p">,</span><spanclass="w"></span><spanclass="mi">4</span><spanclass="p">,</span><spanclass="w"></span><spanclass="mi">5</span><spanclass="p">};</span><spanclass="w"></span>
<spanclass="w"></span><spanclass="n">std</span><spanclass="o">::</span><spanclass="n">cout</span><spanclass="w"></span><spanclass="o"><<</span><spanclass="w"></span><spanclass="s">"transforming item "</span><spanclass="w"></span><spanclass="o"><<</span><spanclass="w"></span><spanclass="n">i</span><spanclass="w"></span><spanclass="o"><<</span><spanclass="w"></span><spanclass="s">" to "</span><spanclass="w"></span><spanclass="o"><<</span><spanclass="w"></span><spanclass="n">i</span><spanclass="w"></span><spanclass="o">+</span><spanclass="w"></span><spanclass="mi">1</span><spanclass="w"></span><spanclass="o"><<</span><spanclass="w"></span><spanclass="sc">'\n'</span><spanclass="p">;</span><spanclass="w"></span>
<spanclass="p">});</span><spanclass="w"></span></pre><p>You can enable stateful iterators by creating a reference wrapper and pass the wrapped iterator to the argument of <ahref="classtf_1_1FlowBuilder.html#abd813bd7afcbd8e6f56dc67883917d1a" class="m-doc">tf::<wbr/>Taskflow::<wbr/>transform</a>. This is especially useful when the range is not known at the time of creating a parallel-transform task, but through another task.</p><preclass="m-code"><spanclass="n">std</span><spanclass="o">::</span><spanclass="n">vector</span><spanclass="o"><</span><spanclass="kt">int</span><spanclass="o">></span><spanclass="w"></span><spanclass="n">src</span><spanclass="p">,</span><spanclass="w"></span><spanclass="n">tgt</span><spanclass="p">;</span><spanclass="w"></span>
<spanclass="w"></span><spanclass="n">std</span><spanclass="o">::</span><spanclass="n">cout</span><spanclass="w"></span><spanclass="o"><<</span><spanclass="w"></span><spanclass="s">"transforming item "</span><spanclass="w"></span><spanclass="o"><<</span><spanclass="w"></span><spanclass="n">i</span><spanclass="w"></span><spanclass="o"><<</span><spanclass="w"></span><spanclass="s">" to "</span><spanclass="w"></span><spanclass="o"><<</span><spanclass="w"></span><spanclass="n">i</span><spanclass="w"></span><spanclass="o">+</span><spanclass="w"></span><spanclass="mi">1</span><spanclass="w"></span><spanclass="o"><<</span><spanclass="w"></span><spanclass="sc">'\n'</span><spanclass="p">;</span><spanclass="w"></span>
<spanclass="n">init</span><spanclass="p">.</span><spanclass="n">precede</span><spanclass="p">(</span><spanclass="n">transform</span><spanclass="p">);</span><spanclass="w"></span></pre><p>When <code>init</code> finishes, the parallel-transform task <code>transform</code> will see <code>first</code> pointing to the beginning of <code>src</code> and <code>last</code> pointing to the end of <code>src</code>. Then, it simultaneously transforms these 1000 items by adding one to each element and stores the result in another range starting at <code>d_first</code>.</p></section><sectionid="ParallelBinaryTransformsOverARange"><h2><ahref="#ParallelBinaryTransformsOverARange">Create a Binary Parallel-Transform Task</a></h2><p>You can use the overload, <ahref="classtf_1_1FlowBuilder.html#aa0b3271b34317710a1e32053a9abc3cf" class="m-doc">tf::<wbr/>Taskflow::<wbr/>transform(B1 first1, E1 last1, B2 first2, O d_first, C c)</a>, to perform parallel transforms on two source ranges pointed by <code>first1</code> and <code>first2</code> using the binary operator <code>c</code> and store the result in another range pointed by <code>d_first</code>. This method is equivalent to the parallel execution of the following loop:</p><preclass="m-code"><spanclass="k">while</span><spanclass="w"></span><spanclass="p">(</span><spanclass="n">first1</span><spanclass="w"></span><spanclass="o">!=</span><spanclass="w"></span><spanclass="n">last1</span><spanclass="p">)</span><spanclass="w"></span><spanclass="p">{</span><spanclass="w"></span>
<spanclass="p">}</span><spanclass="w"></span></pre><p>The following example creates a parallel-transform task that adds two ranges of elements one by one and stores the result in a target range:</p><preclass="m-code"><spanclass="n">std</span><spanclass="o">::</span><spanclass="n">vector</span><spanclass="o"><</span><spanclass="kt">int</span><spanclass="o">></span><spanclass="w"></span><spanclass="n">src1</span><spanclass="w"></span><spanclass="o">=</span><spanclass="w"></span><spanclass="p">{</span><spanclass="mi">1</span><spanclass="p">,</span><spanclass="w"></span><spanclass="mi">2</span><spanclass="p">,</span><spanclass="w"></span><spanclass="mi">3</span><spanclass="p">,</span><spanclass="w"></span><spanclass="mi">4</span><spanclass="p">,</span><spanclass="w"></span><spanclass="mi">5</span><spanclass="p">};</span><spanclass="w"></span>