Remove element from DList

cal callumenator at gmail.com
Sat Oct 6 20:10:07 PDT 2012


On Sunday, 7 October 2012 at 02:54:44 UTC, Jonathan M Davis wrote:
> On Sunday, October 07, 2012 04:14:58 cal wrote:
>> On Sunday, 7 October 2012 at 01:14:48 UTC, Jonathan M Davis 
>> wrote:
>> > The correct way is to use find combined with take (which is
>> > what you're doing,
>> > except that you're not using find). So, something like this
>> > should work
>> > 
>> > void main()
>> > {
>> > 
>> >     auto list = DList!int([1,2,3,4]);
>> >     list.remove(find(list[], 3).take(1));
>> > 
>> > }
>> > 
>> > 
>> > However, for some reason, this is indeed not working right 
>> > now.
>> > It's a bug.
>> > Please report it.
>> 
>> SList doesn't implement remove, so perhaps DList can only
>> guarantee the required complexity when given the range defined 
>> in
>> DList, and for other types of ranges, it can only guarantee
>> linear complexity?
>
> singly-linked lists and doubly-linked lists are completely 
> different beasts. A
> singly-linked list can't do it sanely, because it has to 
> traverse the list to
> find the previous node so that it adjust the links. A node in a 
> doubly-linked
> list has a link to the previous node in the list instead of 
> just the next
> node, so it doesn't have that problem. You can add and remove 
> elements from
> anywhere in a doubly-linked list in O(1). And if you're dealing 
> with
> iterators, it won't affect any iterators except if they point 
> at the element
> being removed (so it's a stable remove). With ranges, it would 
> affect the
> elements in the range, but unless you're removing an element 
> which is at the
> front or end of a range, it shouldn't invalidate the range at 
> all. And that
> can be gotten around by letting that node continue to exist and 
> point to what
> was the next node in the list (in which case, it would go away 
> once no more
> ranges referred to it - the GC makes doing that fairly easy).
>
> So, I don't see any reason why remove wouldn't be stable or 
> non-linear. It's
> actually kind of hard to make it _un_stable in this case. And 
> actually,
> looking at the code, stableLinearRemove (and linearRemove is an 
> alias for
> stableLinearRemove in this case) calls remove, so overall, this 
> is a bit
> bizarre. Regardless, it's a bug that normal remove doesn't work 
> with the
> result of take.
>
> - Jonathan M Davis

Righto, i'll put in a ticket, thanks for the help.




More information about the Digitalmars-d-learn mailing list