|
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