Removing elements from dynamic arrays?

Steven Schveighoffer schveiguy at gmail.com
Wed Apr 6 16:54:26 UTC 2022


On 4/5/22 11:47 PM, Salih Dincer wrote:
> On Tuesday, 5 April 2022 at 14:10:44 UTC, Steven Schveighoffer wrote:
>> [...]
>> I'd implement it probably like this (for D2):
>>
>> ```d
>> auto drop(T)(ref T[] arr, T which)
>> {
>>    import std.algorithm, std.range;
>>    auto f = arr.find(which);
>>    debug if(f.empty) throw ...;
>>    auto result = arr.front;
>>    arr = arr.remove(&f[0] - &arr[0]); // god I hate this
>>    return result;
>> }
>> ```
> 
> First, you're neglecting the loop.

oops, yes, that should have been `auto result = f.front`

>  Second, the returned value is the 
> first element of the array. It should be as follows:
> 
> ```d
> auto drop2(T)(ref T[] arr, T which)
> {
>    //auto f = arr.find(which);
>    auto f = arr.find!(a => a == which);

This is almost equivalent, but it requires a lambda and an allocation. 
So I'm not sure what thing you are trying to do here.

> 
>    //debug if(f.empty) throw ...;
>    auto result = f.front; // arr.front;

Yep, that's a bug on my part.

> 
>    //arr = arr.remove(&f[0] - &arr[0]);
>    arr = remove!(a => a == which)(arr);

This runs through the array again, instead of just removing the one 
index that you already know. And also, the original code only removed 
one element, even if there were multiple matches. Yours removes them all.

> 
>    return result;
> }
> ```
> We do not know the wishes of the programmer who made the development. 
> But it is certain that he scanned until the end of the array.  So it 
> doesn't make sense for the resulting output to be equal to the 
> ```which```. In summary, one line is enough:
> 
> ```d
> return remove!(a => a == which)(arr);
> ```

The return is the element that was removed, not the array after removing 
the element. And even though it might feel equivalent to return the 
input, we don't know how the elements compare, so the array element 
might be different than the incoming parameter.

-Steve


More information about the Digitalmars-d-learn mailing list