Phobos function to remove all occurances from dynamic array?

Steven Schveighoffer schveiguy at gmail.com
Wed May 1 15:18:03 UTC 2024


On Wednesday, 1 May 2024 at 01:09:33 UTC, Liam McGillivray wrote:
> This is presumably such a common task that I'm surprised it 
> isn't easy to find the answer by searching;
>
> Is there a standard library function that removes all elements 
> from a dynamic array that matches an input argument?
>
> In `std.array` there's the `replace` function which is supposed 
> to replace all occurrences that match an input with another. It 
> seems to work as described on strings, but I get compiler 
> errors when using it on other array types. I've tried using it 
> to replace occurrences of a certain object in an array with 
> `[]` in order to remove all occurrences, but it's not allowed.
>
> Is there a Phobos function that does what I want? It would be 
> crazy if there isn't.

`remove`

https://dlang.org/phobos/std_algorithm_mutation.html#remove

```d
arr = arr.remove!(v => shouldBeRemoved(v));
```

Why the reassignment? Because `remove` removes elements *in 
place*, and does not change the range extents. It returns the 
portion of the range that contains the unremoved elements.

So to give an example:

```d
auto arr = [1, 2, 3, 4, 5];
auto result = arr.remove!(i => i % 2 == 1); // remove odd elements
assert(result == [2, 4]);

// first 2 are the slice that is stored in result
// the last three are leftovers.
assert(arr == [2, 4, 3, 4, 5]);
```

-Steve


More information about the Digitalmars-d-learn mailing list