Boost logo

Boost Users :

Subject: Re: [Boost-users] [Boost.Iterator] transform_iteratorequivalent for output iterators
From: dariomt (dariomt_at_[hidden])
Date: 2015-08-03 06:02:01


Jeff Flinn <jeffrey.flinn <at> gmail.com> writes:

>
> On 7/31/15 8:40 AM, dariomt wrote:
> > Edward Diener <eldiener <at> tropicsoft.com> writes:
> >
> >>
> >> On 7/30/2015 7:06 AM, dariomt <at> gmail.com wrote:
> >>> Here is my problem: for any given algorithm that writes its output
> > into
> >>> an output iterator, I'd like to apply a transformation *before*
> > writing
> >>> to the output iterator.
> >>>
> >>> e.g. inside the algorithm the output iterator is dereferenced and
> >>> incremented to write each result, typically like this:
> >>>
> >>> *output++ = ith_result;
> >>>
> >>> I'd like to wrap the output iterator with a unary function func
such
> >>> that the effect is equivalent to:
> >>>
> >>> *output++ = func( ith_result );
> >>>
> >>> I'm looking at the adaptors in Boost.Iterator but I cannot find a
> >>> suitable one.
> >>>
> >>> Am I missing anything?
> >>> Is there a better approach?
> >>
> >> Can you not use the function_output_iterator to accomplish what you
> > want
> >> to do ?
> >>
> >
> > IIUC the function_output_iterator "fakes" an output iterator with a
> > function object that gets called for each element written to the
> > iterator.
> >
> > I need to wrap *both* an actual output iterator and a function
object,
> > and I need to apply the function *before* writing to the actual
output
> > iterator.
> >
> > Given that the output iterator is written by dereference and
assignment,
> > I think I would need some kind of proxy reference, that when assigned
to
> > applies the function before doing the actual assignment.
> >
> > That looks ugly, so I'm asking here for a more elegant solution :)
>
> how is what you want to do different from:
>
> boost::copy( myrange | transformed(func), outputitr );
>
> Jeff
>

What if myrange is the output of an algorithm, but I don't want to copy
it into an intermediate range?

e.g.
template <typename InputIter, typename OutputIter>
void my_algo(InputIter first, InputIter last, OutputIter out)
{
  // complex loop traversing input sequence
  ...
  // some complicated code to compute each result
  ...
  // write each result to output iterator
  *out++ = ith_result;
}

I know I could do it easily in two steps storing the intermediate
results.

intermediate_storage tmp;
my_algo(input.begin(), input.end(), back_inserter(tmp));
transform(tmp.begin(), tmp.end(), output);

But how to do it in one go, without requiring storage for intermediate
results?


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net