thrust

◆ scatter_if() [1/4]

template<typename DerivedPolicy , typename InputIterator1 , typename InputIterator2 , typename InputIterator3 , typename RandomAccessIterator >
__host__ __device__ void thrust::scatter_if ( const thrust::detail::execution_policy_base< DerivedPolicy > &  exec,
InputIterator1  first,
InputIterator1  last,
InputIterator2  map,
InputIterator3  stencil,
RandomAccessIterator  output 
)

scatter_if conditionally copies elements from a source range into an output array according to a map. For each iterator i in the range [first, last) such that *(stencil + (i - first)) is true, the value *i is assigned to output[*(map + (i - first))]. The output iterator must permit random access. If the same index appears more than once in the range [map, map + (last - first)) the result is undefined.

The algorithm's execution is parallelized as determined by exec.

Parameters
execThe execution policy to use for parallelization.
firstBeginning of the sequence of values to scatter.
lastEnd of the sequence of values to scatter.
mapBeginning of the sequence of output indices.
stencilBeginning of the sequence of predicate values.
outputBeginning of the destination range.
Template Parameters
DerivedPolicyThe name of the derived execution policy.
InputIterator1must be a model of Input Iterator and InputIterator1's value_type must be convertible to RandomAccessIterator's value_type.
InputIterator2must be a model of Input Iterator and InputIterator2's value_type must be convertible to RandomAccessIterator's difference_type.
InputIterator3must be a model of Input Iterator and InputIterator3's value_type must be convertible to bool.
RandomAccessIteratormust be a model of Random Access iterator.
Precondition
The iterator result + i shall not refer to any element referenced by any iterator j in the range [first,last) for all iterators i in the range [map,map + (last - first)).
The iterator result + i shall not refer to any element referenced by any iterator j in the range [map,map + (last - first)) for all iterators i in the range [map,map + (last - first)).
The iterator result + i shall not refer to any element referenced by any iterator j in the range [stencil,stencil + (last - first)) for all iterators i in the range [map,map + (last - first)).
The expression result[*i] shall be valid for all iterators i in the range [map,map + (last - first)) for which the following condition holds: *(stencil + i) != false.
#include <thrust/scatter.h>
...
int V[8] = {10, 20, 30, 40, 50, 60, 70, 80};
int M[8] = {0, 5, 1, 6, 2, 7, 3, 4};
int S[8] = {1, 0, 1, 0, 1, 0, 1, 0};
int D[8] = {0, 0, 0, 0, 0, 0, 0, 0};
thrust::scatter_if(thrust::host, V, V + 8, M, S, D);
// D contains [10, 30, 50, 70, 0, 0, 0, 0];
Note
scatter_if is the inverse of thrust::gather_if.