Boost logo

Boost Users :

Subject: Re: [Boost-users] [Boost.Iterator] transform_iteratorequivalent for output iterators
From: stephane GULLAUD (stephane.gullaud_at_[hidden])
Date: 2015-08-04 05:23:14


The only way I could see this different from Jeff proposal is if somehow
yous functor to transform the result is dependant on the traversal of the
sequence or the order of the element.
Other I don't see why you couldn't do my_algo(input_range |
trasnformed(func), out).

Cheers,

Stephane

On Mon, Aug 3, 2015 at 12:03 PM dariomt <dariomt_at_[hidden]> wrote:

> 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 mailing list
> Boost-users_at_[hidden]
> http://lists.boost.org/mailman/listinfo.cgi/boost-users
>



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