◆ transform_if() [4/6]

template<typename InputIterator1 , typename InputIterator2 , typename ForwardIterator , typename UnaryFunction , typename Predicate >
ForwardIterator thrust::transform_if ( InputIterator1  first,
InputIterator1  last,
InputIterator2  stencil,
ForwardIterator  result,
UnaryFunction  op,
Predicate  pred 

This version of transform_if conditionally applies a unary function to each element of an input sequence and stores the result in the corresponding position in an output sequence if the corresponding position in a stencil sequence satisfies a predicate. Otherwise, the corresponding position in the output sequence is not modified.

Specifically, for each iterator i in the range [first, last) the predicate pred(*s) is evaluated, where s is the corresponding input iterator in the range [stencil, stencil + (last - first) ). If this predicate evaluates to true, the result of op(*i) is assigned to *o, where o is the corresponding output iterator in the range [result, result + (last - first) ). Otherwise, op(*i) is not evaluated and no assignment occurs. The input and output sequences may coincide, resulting in an in-place transformation.

firstThe beginning of the input sequence.
lastThe end of the input sequence.
stencilThe beginning of the stencil sequence.
resultThe beginning of the output sequence.
opThe tranformation operation.
predThe predicate operation.
The end of the output sequence.
Template Parameters
InputIterator1is a model of Input Iterator and InputIterator1's value_type is convertible to UnaryFunction's argument_type.
InputIterator2is a model of Input Iterator and InputIterator2's value_type is convertible to Predicate's argument_type.
ForwardIteratoris a model of Forward Iterator.
UnaryFunctionis a model of Unary Function and UnaryFunction's result_type is convertible to OutputIterator's value_type.
Predicateis a model of Predicate.
first may equal result, but the range [first, last) shall not overlap the range [result, result + (last - first)) otherwise.
stencil may equal result, but the range [stencil, stencil + (last - first)) shall not overlap the range [result, result + (last - first)) otherwise.

The following code snippet demonstrates how to use transform_if:

int data[10] = {-5, 0, 2, -3, 2, 4, 0, -1, 2, 8};
int stencil[10] = { 1, 0, 1, 0, 1, 0, 1, 0, 1, 0};
thrust::transform_if(data, data + 10, stencil, data, op, identity); // in-place transformation
// data is now {5, 0, -2, -3, -2, 4, 0, -1, -2, 8};
See also