| |
 | Posted by Jonathan M Davis in reply to Pete Padil | Permalink Reply |
|
Jonathan M Davis 
Posted in reply to Pete Padil
| On Tuesday, May 6, 2025 3:19:29 PM Mountain Daylight Time Pete Padil via Digitalmars-d-learn wrote:
> I compiled and ran the following test program:
> ```d
> import std.stdio, std.algorithm;
>
> void main()
> {
> long[] a = [1, 2, 3, 15, 4];
> auto b = a[].strip(15);
> writeln(a);
> writeln(b);
> }
> ```
> I get:
> [1, 2, 3, 15, 4]
> [1, 2, 3, 15, 4]
> It did not remove 15, it does work if 15 is at the beginning or
> end.
> Is this a bug or am I misunderstading the docs?
>
> version: 1.41.0-beta1 (DMD v2.111.0, LLVM 19.1.7)
>
> thanks
strip removes the requested elements from the ends (whereas stripLeft does it from the front of the range, and stripRight does it from the back of the range). It's a generalization of the strip function which strips whitespace from both ends (what some languages call trim).
If you want to remove an element from the middle, then std.algorithm.iteration.filter will return a lazy range which filters elements based on the predicate - e.g.
auto result = range.filter!(a=> a != 15)();
and if you want an array instead of a lazy range, you can allocate a new one with std.array.array, e.g.
auto result = range.filter!(a=> a != 15)().array();
Alternatively, std.algorithm.mutation.remove can be used to remove an element at a specific index (shifting all of the other elements after it in the array), but then you'll need to use a function such as std.algorithm.searching.find or std.algorithm.countUntil to get the element's offset to pass to remove.
- Jonathan M Davis
|