This version of copy_if
copies elements from the range [first,last)
to a range beginning at result
, except that any element which causes pred
to false
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 that 0 <= n < last-first
, copy_if
performs the assignment *result = *(first+n)
and result
is advanced one position if pred(*(first+n))
. Otherwise, no assignment occurs and result
is not advanced.
- 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) . |
- Returns
result + n
, where n
is equal to the number of times pred
evaluated to true
in the range [first, last)
.
- Template Parameters
-
InputIterator | is a model of Input Iterator, and InputIterator's value_type is convertible to Predicate's argument_type . |
OutputIterator | is a model of Output Iterator. |
Predicate | is a model of Predicate. |
- Precondition
- The ranges
[first, last)
and [result, result + (last - first))
shall not overlap.
The following code snippet demonstrates how to use copy_if
to perform stream compaction to copy even numbers to an output range.
...
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];
- See also
remove_copy_if