#include "tbb/iterators.h"
template <typename UnaryFunc, typename Iter> class transform_iterator { public: typedef typename std::iterator_traits<Iter>::value_type value_type; typedef typename std::iterator_traits<Iter>::difference_type difference_type; #if __cplusplus >= 201703L typedef typename std::invoke_result<UnaryFunc, typename std::iterator_traits<Iter>::reference>::type reference; #else typedef typename std::result_of<UnaryFunc(typename std::iterator_traits<Iter>::reference)>::type reference; #endif typedef typename std::iterator_traits<Iter>::pointer pointer; typedef typename std::random_access_iterator_tag iterator_category; transform_iterator(Iter it, UnaryFunc unary_func); transform_iterator(const transform_iterator& input); transform_iterator& operator=(const transform_iterator& input); reference operator*() const; reference operator[](difference_type i) const; transform_iterator& operator++(); transform_iterator& operator--(); transform_iterator operator++(int); transform_iterator operator--(int); transform_iterator operator+(difference_type forward) const; transform_iterator operator-(difference_type backward) const; transform_iterator& operator+=(difference_type forward); transform_iterator& operator-=(difference_type backward); friend transform_iterator operator+(difference_type forward, const transform_iterator& it); difference_type operator-(const transform_iterator& it) const; bool operator==(const transform_iterator& it) const; bool operator!=(const transform_iterator& it) const; bool operator<(const transform_iterator& it) const; bool operator>(const transform_iterator& it) const; bool operator<=(const transform_iterator& it) const; bool operator>=(const transform_iterator& it) const; Iter base() const; }; template<typename UnaryFunc, typename Iter> transform_iterator<UnaryFunc, Iter> make_transform_iterator(Iter it, UnaryFunc unary_func);
A transform_iterator is a random-access iterator that applies a transformation to a sequence. The transformation, a given function, is applied upon dereferencing of the iterator itself to the dereferenced value of an underlying iterator. Expressing a pattern this way can be efficient since the transformed sequence can be consumed for example by an algorithm without storing temporary values in memory. Function make_transform_iterator returns a transform_iterator object with underlying iterator and custom functor set.
The following example illustrates calculations performed by getting data from an array a, and performing a reduction by summing up the squares.
#include <vector> #include <numeric> #include <tbb/iterators.h> int main() { const int N = 10; std::vector<float> a(N); std::iota(a.begin(), a.end(), 0); auto fun = [](const auto &x){ return x * x; }; int sum = std::reduce(tbb::make_transform_iterator(a.begin(), fun), tbb::make_transform_iterator(a.end(), fun)); return 0; }