Hi, I propose to add the functions described below to the Boost.Range. I found the use of those very convenient WRT the corresponding use of begin() and end(), and a lot more readable. 1. front() returning the reference to the first element precondition (assert): !empty(rng) return *begin(rng); 2. back() returning the reference to the last element precondition (assert): !empty(rng) For BidirectionalRange return *(--end(rng)); For SinglePassRange it could iterate over the range and return the reference to the last element 3. at() returning the reference to the i-th element of the range precondition (throw std::out_of_range or assert): index < size(rng) For RandomAccessRange return *(begin(rng) + index); For SinglePassRange it could iterate over the range and return the required element For me, non-throwing at() would be more useful however this behavior won't be intuitive. So the following should also be provided: 4. sub(), subscript(), el(), element(), at_index(), at_(), index(), indexed(), access(), operator[], ...? the implementation of indexing operator[] same as 3 but instead of throwing an assert would be used The use of operator[] could be similar to this: { using boost::range::subscript_operator; rng[index]; } So not very convenient. But maybe you have a better idea? Regards, Adam