thrust::gather_if
Defined in thrust/gather.h
- 
template<typename DerivedPolicy, typename InputIterator1, typename InputIterator2, typename RandomAccessIterator, typename OutputIterator, typename Predicate>
 OutputIterator thrust::gather_if(const thrust::detail::execution_policy_base<DerivedPolicy> &exec, InputIterator1 map_first, InputIterator1 map_last, InputIterator2 stencil, RandomAccessIterator input_first, OutputIterator result, Predicate pred)
- gather_ifconditionally copies elements from a source array into a destination range according to a map. For each input iterator- iin the range- [map_first, map_last)such that the value of- pred(*(stencil + (i - map_first)))is- true, the value- input_first[*i]is assigned to- *(result + (i - map_first)).- RandomAccessIteratormust permit random access.- The algorithm’s execution is parallelized as determined by - exec.- The following code snippet demonstrates how to use - gather_ifto gather selected values from an input range based on an arbitrary selection function using the- thrust::deviceexecution policy for parallelization:- Remark - gather_ifis the inverse of- scatter_if.- #include <thrust/gather.h> #include <thrust/device_vector.h> #include <thrust/execution_policy.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(thrust::device, 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} - Parameters
- exec – The execution policy to use for parallelization. 
- 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
- DerivedPolicy – The name of the derived execution policy. 
- InputIterator1 – must be a model of Input Iterator and - InputIterator1's- value_typemust be convertible to- RandomAccessIterator's- difference_type.
- InputIterator2 – must be a model of Input Iterator and - InputIterator2's- value_typemust be convertible to- Predicate'sargument type.
- RandomAccessIterator – must be a model of Random Access iterator and - RandomAccessIterator's- value_typemust be convertible to- OutputIterator's- value_type.
- OutputIterator – must be a model of Output Iterator. 
- Predicate – must be a model of Predicate. 
 
- 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)).
- Pre
- The input data shall not overlap the range - [result, result + (map_last - map_first)).