Removing an element from a list or array
Patrick via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Wed Aug 6 14:14:39 PDT 2014
Thank you, that is a great sample.
On Wednesday, 6 August 2014 at 19:41:50 UTC, Jonathan M Davis
wrote:
> On Wednesday, 6 August 2014 at 19:01:26 UTC, Patrick wrote:
>> I feel dumb. I've been searching for how to do this, and each
>> page or forum entry I read makes me more confused.
>>
>> Let's say I have a list of values (Monday, Tuesday, Wednesday,
>> Thursday, Friday). I can store this list in an Slist, Dlist,
>> Array etc -- any collection is fine.
>>
>> I decide I want to remove Thursday from the list.
>>
>> How? I see that linearRemove is meant to do this, but that
>> takes a range. How do I get a range of 'Thursday'?
>
> Slicing a container gives you a range for that container, and
> it's that type that needs to be used to remove elements (either
> that, or that type wrapped with std.range.Take), since
> otherwise, the container wouldn't know which elements you were
> trying to remove - just their values.
>
> You need to use std.algorithm.find to find the element that you
> want to remove, in which case, you have a range starting at
> that element (but it contains everything after it too). So, you
> used std.range.take to take the number of elements that you
> want from the range, and then you pass that result to
> linearRemove. e.g.
>
> import std.algorithm;
> import std.container;
> import std.range;
>
> void main()
> {
> auto arr = Array!string("Monday", "Tuesday", "Wednesday",
> "Thursday", "Friday");
> auto range = arr[];
> assert(equal(range, ["Monday", "Tuesday", "Wednesday",
> "Thursday", "Friday"]));
> auto found = range.find("Thursday");
> assert(equal(found, ["Thursday", "Friday"]));
> arr.linearRemove(found.take(1));
> assert(equal(arr[], ["Monday", "Tuesday", "Wednesday",
> "Friday"]));
> }
>
> C++ does it basically the same way that D does, but it's
> actually one place where iterators are cleaner, because you can
> just pass the iterator to erase, whereas with a range, that
> would remove all of the elements after that element, which is
> why you need take, which makes it that much more complicated.
>
> Using opSlice like that along with range-based functions like
> find which don't return a new range type will always be what
> you'll need to do in the general case, but it would definitely
> be nice if we added functions like removeFirst to remove
> elements which matched a specific value so that the simple use
> cases didn't require using find.
>
> - Jonathan M Davis
More information about the Digitalmars-d-learn
mailing list