Template Function thrust::gather_if(InputIterator1, InputIterator1, InputIterator2, RandomAccessIterator, OutputIterator, Predicate)¶
Function Documentation¶
-
template<typename
InputIterator1
, typenameInputIterator2
, typenameRandomAccessIterator
, typenameOutputIterator
, typenamePredicate
>
OutputIteratorthrust
::
gather_if
(InputIterator1 map_first, InputIterator1 map_last, InputIterator2 stencil, RandomAccessIterator input_first, OutputIterator result, Predicate pred) gather_if
conditionally copies elements from a source array into a destination range according to a map. For each input iteratori
in the range[map_first, map_last)
such that the value ofpred(*(stencil + (i - map_first)))
istrue
, the valueinput_first[*i]
is assigned to*(result + (i - map_first))
.RandomAccessIterator
must permit random access.The following code snippet demonstrates how to use
gather_if
to gather selected values from an input range based on an arbitrary selection function.- Pre
The range
[map_first, map_last)
shall not overlap the range[result, result + (map_last - map_first))
.- Pre
The range
[stencil, stencil + (map_last - map_first))
shall not overlap the range[result, result + (map_last - map_first))
.- Remark
gather_if
is the inverse ofscatter_if
.- Parameters
map_first
: Beginning of the range of gather locations.map_last
: End of the range of gather locations.stencil
: Beginning of the range of predicate values.input_first
: Beginning of the source range.result
: Beginning of the destination range.pred
: Predicate to apply to the stencil values.
- Template Parameters
InputIterator1
: must be a model of Input Iterator andInputIterator1's
value_type
must be convertible toRandomAccessIterator's
difference_type
.InputIterator2
: must be a model of Input Iterator andInputIterator2's
value_type
must be convertible toPredicate's
argument_type
.RandomAccessIterator
: must be a model of Random Access iterator andRandomAccessIterator's
value_type
must be convertible toOutputIterator's
value_type
.OutputIterator
: must be a model of Output Iterator.Predicate
: must be a model of Predicate.
#include <thrust/gather.h> #include <thrust/device_vector.h> struct is_even { __host__ __device__ bool operator()(const int x) { return (x % 2) == 0; } }; ... int values[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; thrust::device_vector<int> d_values(values, values + 10); // we will select an element when our stencil is even int stencil[10] = {0, 3, 4, 1, 4, 1, 2, 7, 8, 9}; thrust::device_vector<int> d_stencil(stencil, stencil + 10); // map all even indices into the first half of the range // and odd indices to the last half of the range int map[10] = {0, 2, 4, 6, 8, 1, 3, 5, 7, 9}; thrust::device_vector<int> d_map(map, map + 10); thrust::device_vector<int> d_output(10, 7); thrust::gather_if(d_map.begin(), d_map.end(), d_stencil.begin(), d_values.begin(), d_output.begin(), is_even()); // d_output is now {0, 7, 4, 7, 8, 7, 3, 7, 7, 7}