The transform iterator adaptor augments an iterator by applying some function object to the result of dereferencing the iterator. Another words, the operator* of the transform iterator first dereferences the base iterator, passes the result of this to the function object, and then returns the result. The following pseudo-code shows the basic idea:
value_type transform_iterator::operator*() const {
return f(*this->base_iterator);
}
All of the other operators of the transform iterator behave in the
same fashion as the base iterator.
namespace boost {
template <class AdaptableUnaryFunction, class BaseIterator>
class transform_iterator_generator;
template <class AdaptableUnaryFunction, class BaseIterator>
typename transform_iterator_generator<AdaptableUnaryFunction,Iterator>::type
make_transform_iterator(BaseIterator base, const AdaptableUnaryFunction& f = AdaptableUnaryFunction());
}
template <class AdaptableUnaryFunction, class Iterator>
class transform_iterator_generator
{
public:
typedef iterator_adaptor<...> type;
};
The following is an example of how to use the transform_iterator_generator class to iterate through a range of numbers, multiplying each of them by 2 when they are dereferenced.
#include <functional>
#include <iostream>
#include <boost/iterator_adaptors.hpp>
int
main(int, char*[])
{
int x[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
typedef std::binder1st< std::multiplies<int> > Function;
typedef boost::transform_iterator_generator<Function, int*>::type doubling_iterator;
doubling_iterator i(x, std::bind1st(std::multiplies<int>(), 2)),
i_end(x + sizeof(x)/sizeof(int), std::bind1st(std::multiplies<int>(), 2));
std::cout << "multiplying the array by 2:" << std::endl;
while (i != i_end)
std::cout << *i++ << " ";
std::cout << std::endl;
// to be continued...
The output from this part is:
2 4 6 8 10 12 14 16
| Parameter | Description |
|---|---|
| AdaptableUnaryFunction | The function object that transforms each element in the iterator range. |
| BaseIterator | The iterator type being wrapped. This type must at least be a model of the InputIterator concept. |
transform_iterator_generator::type(const BaseIterator& it, const AdaptableUnaryFunction& f = AdaptableUnaryFunction())
template <class AdaptableUnaryFunction, class BaseIterator> typename transform_iterator_generator<AdaptableUnaryFunction,BaseIterator>::type make_transform_iterator(BaseIterator base, const AdaptableUnaryFunction& f = AdaptableUnaryFunction());This function provides a convenient way to create transform iterators.
std::cout << "adding 4 to each element in the array:" << std::endl; std::copy(boost::make_transform_iterator(x, std::bind1st(std::plusThe output from this part is:(), 4)), boost::make_transform_iterator(x + N, std::bind1st(std::plus (), 4)), std::ostream_iterator (std::cout, " ")); std::cout << std::endl; return 0; }
5 6 7 8 9 10 11 12