Boost logo

Boost Users :

Subject: Re: [Boost-users] [range] What's the best way to initialize a new container from a range?
From: Martin B. (0xCDCDCDCD_at_[hidden])
Date: 2011-08-29 08:15:13


On 26.08.2011 20:21, Ovanes Markarian wrote:
> On Fri, Aug 26, 2011 at 2:30 PM, Martin B. <0xCDCDCDCD_at_[hidden]
> <mailto:0xCDCDCDCD_at_[hidden]>> wrote:
>
> Hi!
>
> Say I have a range R and I want to construct a new container from
> the range R. Will I always have to repeat the expression yielding
> the range, or is there a shorter way?
>
> Example:
>
> std::vector<int> numbers(
> boost::irange(7, 42).begin(),
> boost::irange(7, 42).end()
> );
>
> Note that it's just an example.
>
> Is it possible to create a container C from a range expression R in
> one step? Any helper function for this?
>
>
> What about that:
> ...
> integer_range<int> ir=irange(7,42);
> vector<int> numbers(ir.begin(), ir.end());
>

For this to work I need the exact type of the range, which can be quite
annoying as far as I could tell. (Plus, I *don't want* to care what type
of the range is.)

Really, if I had C++11/auto, I wouldn't mind so much, i.e.

     auto xr = get_some_range(...);
     vector<int> numbers(xr.begin(), xr.end());

but I don't have an `auto` capable compiler, so spelling out the range
type for this is really crappy.

Writing a make_container function seems fiddly wrt. to the C++03
reference type of the passed range, but maybe someone can help:

     template<typename C, typename R>
     C make_container(R /*value? ref? const-ref?*/ range) {
       return C(range.begin(), range.end());
     }

and it would still be very ugly to call:

     const vector<int> numbers =
       make_container< vector<int> >(irange(7,42));

(Note: I did not compile/test this code!)

any ideas?

cheers,
Martin


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