thrust

◆ scatter_if() [4/4]

template<typename InputIterator1 , typename InputIterator2 , typename InputIterator3 , typename RandomAccessIterator , typename Predicate >
void thrust::scatter_if ( InputIterator1  first,
InputIterator1  last,
InputIterator2  map,
InputIterator3  stencil,
RandomAccessIterator  output,
Predicate  pred 
)

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 pred(*(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.

Parameters
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.
predPredicate to apply to the stencil values.
Template Parameters
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 Predicate's argument_type.
RandomAccessIteratormust be a model of Random Access iterator.
Predicatemust be a model of Predicate.
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: pred(*(stencil + i)) != false.
#include <thrust/scatter.h>
struct is_even
{
__host__ __device__
bool operator()(int x)
{
return (x % 2) == 0;
}
};
...
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] = {2, 1, 2, 1, 2, 1, 2, 1};
int D[8] = {0, 0, 0, 0, 0, 0, 0, 0};
is_even pred;
thrust::scatter_if(V, V + 8, M, S, D, pred);
// D contains [10, 30, 50, 70, 0, 0, 0, 0];
Note
scatter_if is the inverse of thrust::gather_if.