GSoC-2011 project:: Containers
Steven Schveighoffer
schveiguy at yahoo.com
Wed Mar 30 12:06:29 PDT 2011
On Wed, 30 Mar 2011 14:28:49 -0400, KennyTM~ <kennytm at gmail.com> wrote:
> On Mar 30, 11 23:01, Steven Schveighoffer wrote:
>> And yes, you can, if you have a pointer to the element right before the
>> insertion/removal point.
>
> That what I've said in the previous post. The point is linearRemove's
> interface does not take that pointer.
>
> /// Removes a range from the list in linear time.
> Range linearRemove(Range r);
>
> Perhaps SList could provide an O(1) .removeAfter method, like:
>
> /// Remove elements in the range [r.front+1 .. $)
> Range removeAfter(Range r) {
> // add checking yourself.
> r._head._next = null;
> return Range(null);
> }
>
> or an O(1) .removeOneAfter which may be more useful than chopping the
> whole tail:
>
> /// Remove one element in at r.front+1
> /// and return the range [r.front+2 .. $)
> Range removeOneAfter(Range r) {
> // add checking yourself.
> r._head._next = r._head._next._next;
> r.popFront();
> return r;
> }
So I have an SList!int, and I want to remove a certain element in linear
time. How can I do this with SList, even with your primitives? Answer:
the really convoluted difficult way:
void removeSpecificElement(SList!int mylist, int elem)
{
if(!mylist.empty && mylist.front() == elem)
mylist.removeFront();
else
{
auto r1 = slist[];
auto r2 = r1;
r1.popFront();
while(!r1.empty && r1.front != elem)
{
r2 = r1;
r1.popFront();
}
if(!r1.empty)
mylist.removeOneAfter(r2);
}
}
Whereas, I'd rather have:
mylist.remove(take(find(mylist, elem), 1));
BTW, I realized while reading the docs that this only applies to removal,
insertion does have an insertAfter function (though with the range
properly implemented, insert becomes possible).
-Steve
More information about the Digitalmars-d
mailing list