Template Function thrust::copy_if(InputIterator, InputIterator, OutputIterator, Predicate)¶
Function Documentation¶
-
template<typename
InputIterator, typenameOutputIterator, typenamePredicate>
OutputIteratorthrust::copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred) This version of
copy_ifcopies elements from the range[first,last)to a range beginning atresult, except that any element which causespredtofalseis not copied.copy_ifis stable, meaning that the relative order of elements that are copied is unchanged.More precisely, for every integer
nsuch that0 <= n < last-first,copy_ifperforms the assignment*result = *(first+n)andresultis advanced one position ifpred(*(first+n)). Otherwise, no assignment occurs andresultis not advanced.The following code snippet demonstrates how to use
copy_ifto perform stream compaction to copy even numbers to an output range.- Return
result + n, wherenis equal to the number of timespredevaluated totruein the range[first, last).- Pre
The ranges
[first, last)and[result, result + (last - first))shall not overlap.- Parameters
first: The beginning of the sequence from which to copy.last: The end of the sequence from which to copy.result: The beginning of the sequence into which to copy.pred: The predicate to test on every value of the range[first, last).
- Template Parameters
InputIterator: is a model of Input Iterator, andInputIterator'svalue_typeis convertible toPredicate'sargument_type.OutputIterator: is a model of Output Iterator.Predicate: is a model of Predicate.
#include <thrust/copy.h> ... struct is_even { __host__ __device__ bool operator()(const int x) { return (x % 2) == 0; } }; ... const int N = 6; int V[N] = {-2, 0, -1, 0, 1, 2}; int result[4]; thrust::copy_if(V, V + N, result, is_even()); // V remains {-2, 0, -1, 0, 1, 2} // result is now {-2, 0, 0, 2}
- See
remove_copy_if