On Sat, 09 May 2009 22:10:22 -0400, Rainer Deyke <[email protected]>
wrote:
dsimcha wrote:
== Quote from Rainer Deyke ([email protected])'s article
Although I like ranges, it looks to me like there are a couple of
operations that would difficult to implement without iterators or some
other way to specify a specific position in a range.
Finding and erasing an element:
list.erase(find(list.begin(), list.end(), e));
What's wrong with this? Since list owns its range representation, it
can know the
implementation details. For a linked list, this will probably be just
a pair of
pointers under the hood anyhow. In other words, it's internally still
an
iterator, just prettier looking.
The following is semantically incorrect:
r = find(list, e)
list.erase(r)
'find' advances only the front of the range to the found element.
Therefore 'r' is the range of all elements starting with the found
element, but also including all elements after that.
I would expect 'list.erase(range)' to erase all elements in the range.
However, in this case I only want to erase a single element. This could
still be expressed with ranges, but it would require a different
function. For example:
find(list, e).eraseFront()
Or:
list.eraseFrontOf(find(list, e))
Or:
list.eraseOne(find(list, e))
Or:
list.findAndErase(e)
Or:
list.erase(take(1, find(list, e)))
I think Andrei's plans are for this last one. You can srhink a range, so
use the range primitives to srhink it to a 1-element range, then call
erase.
Splitting a container on a position:
iter = find(list.begin(), list.end(), e);
do_something_with(list.begin(), iter);
do_something_else_with(iter, list.end());
From what I remember from the earlier discussions, Andrei's plan is for
you to be able to subrange a range. So for example, you have 2 ranges
that overlap, return a range that is the intersection or complement.
I don't have huge issues with that solution, but I would point out that
you now are depending on the developer to ensure the ranges do in fact
overlap. Of course, I could be wrong with my assumption (about Andrei's
intent), maybe he has a better solution.
-Steve