Template Function thrust::copy_if(InputIterator1, InputIterator1, InputIterator2, OutputIterator, Predicate)¶
Function Documentation¶
-
template<typename
InputIterator1
, typenameInputIterator2
, typenameOutputIterator
, typenamePredicate
>
OutputIteratorthrust
::
copy_if
(InputIterator1 first, InputIterator1 last, InputIterator2 stencil, OutputIterator result, Predicate pred) This version of
copy_if
copies elements from the range[first,last)
to a range beginning atresult
, except that any element whose corresponding stencil element causespred
to befalse
is not copied.copy_if
is stable, meaning that the relative order of elements that are copied is unchanged.More precisely, for every integer
n
such that0 <= n < last-first
,copy_if
performs the assignment*result = *(first+n)
andresult
is advanced one position ifpred(*(stencil+n))
. Otherwise, no assignment occurs andresult
is not advanced.The following code snippet demonstrates how to use
copy_if
to perform stream compaction to copy numbers to an output range when corresponding stencil elements are even:- Return
result + n
, wheren
is equal to the number of timespred
evaluated totrue
in the range[stencil, stencil + (last-first))
.- Pre
The ranges
[first, last)
and[result, result + (last - first))
shall not overlap.- Pre
The ranges
[stencil, stencil + (last - first))
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.stencil
: The beginning of the stencil sequence.result
: The beginning of the sequence into which to copy.pred
: The predicate to test on every value of the range[stencil, stencil + (last-first))
.
- Template Parameters
InputIterator1
: is a model of Input Iterator.InputIterator2
: is a model of Input Iterator, andInputIterator2's
value_type
is convertible toPredicate's
argument_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; } }; ... int N = 6; int data[N] = { 0, 1, 2, 3, 4, 5}; int stencil[N] = {-2, 0, -1, 0, 1, 2}; int result[4]; thrust::copy_if(data, data + N, stencil, result, is_even()); // data remains = { 0, 1, 2, 3, 4, 5}; // stencil remains = {-2, 0, -1, 0, 1, 2}; // result is now { 0, 1, 3, 5}
- See
remove_copy_if