Boost logo

Boost Users :

From: Thorsten Ottosen (thorsten.ottosen_at_[hidden])
Date: 2006-11-17 11:31:20


abir basak wrote:
> Hi,
> I am not sure if it is the proper newsgroup to get answers
> related to boost usage.
> I am facing a problem with boost::sub_range for a const container
> which is not allowing me to access the indexed operator.
> Below a short program to demonstrate the problem. Necessary headers
> are included. Boost version 1.33.1
> typedef vector<int> VI;
> VI v(10);
> int data[] = {0,1,2,3,4,5,6,7,8,9};
> copy(data,data+10,v.begin());///inserted a few int to std::vector<int>

Hm... this is not legal.

May I suggest

     v = boost::assign::list_of(0)(1)(2)(3)(4)(5)(6) ... ;

?

> ///prints 0 1 2 3 4 5 6 7 8 9
> copy(v.begin(),v.end(),ostream_iterator<int>(cout," ")); cout<<endl;
> const VI& cv = v; /// a const reference to the container.
> VI::iterator it = v.begin(); ///got an random access iterator
> it[1] = 100; /// index operator allows to change it
> copy(v.begin(),v.end(),ostream_iterator<int>(cout," ")); cout<<endl;
> ///prints 0 100 2 3 4 ...
> VI::const_iterator it1 = v.begin(); ///got a const_iterator
> cout<<it1[1]<<endl; /// returns const_reference, assignment is not
> allowed, access is allowed. prints 100
> boost::sub_range<VI> r(v.begin()+2,v.begin()+8); ///got a sub_range
> ///prints 2 3 4 5 6 7
> copy(r.begin(),r.end(),ostream_iterator<int>(cout," "));
> cout<<endl; r[2] = 400; cout<<r[2]<<endl;/// prints 400
> ///prints 2 3 400 5 6 7
> copy(r.begin(),r.end(),ostream_iterator<int>(cout," "));
> ///so far everything is fine. Here problem starts
> /// a const sub_range ?
> boost::sub_range<const VI> r1(cv.begin()+2,cv.begin()+8);
> ///prints 2 3 400 5 6 7
> copy(r1.begin(),r1.end(),ostream_iterator<int>(cout," "));cout<<endl;
> ///next statement is don't compile
> cout<<r1[2]<<endl; ///=> not allowed
> gives error under Visual Studio 7.1
> cannot convert from 'const std::allocator<_Ty>::value_type' to
> 'boost::iterator_range<IteratorT>::value_type &'
> Why it tried to convert it to value_type& instead of const value_type& ?
> cout<<typeid(r1.begin()).name()<<endl; says r1.begin() is a
> const_iteartor. So the statement cout<<r1[2]<<endl; should return a
> const_reference.
> Am I mis interpreting the const version of sub_range ? If so, what is
> a const counterpart of sub_range, which behaves just like a pair of
> const_iterator ?

This is an error in the range lib that should be fixed in the upcoming
version of boost.

-Thorsten


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