A slice consisting of non-consecutive elements of an array?
vit
vit at vit.vit
Wed Jan 12 07:03:18 UTC 2022
On Wednesday, 12 January 2022 at 06:58:47 UTC, vit wrote:
> On Wednesday, 12 January 2022 at 06:43:40 UTC, forkit wrote:
>> On Wednesday, 12 January 2022 at 06:16:49 UTC, vit wrote:
>>>
>>> Yes std.algorithm : filter.
>>>
>>> ```d
>>> import std.stdio : writeln;
>>> import std.algorithm : filter;
>>>
>>> void main()@safe{
>>> auto a = ["one", "one", "two", "one", "two", "one",
>>> "one", "two"];
>>>
>>> writeln(a);
>>> writeln(a.filter!(x => x == "one"));
>>> }
>>> ```
>>
>> Interesting. I looked it up.. it says "returns a new range..."
>>
>> Does that mean what I think it means (i.e. a new allocation
>> takes place) ?
>
> No, it is only view to old slice:
> ```d
> void main()@safe{
> auto a = ["one", "one", "two", "one", "two", "one", "one",
> "two"];
>
> auto b = (()@nogc => a.filter!(x => x == "one"))();
> writeln(a);
> writeln(b);
> }
> ```
filter is implemented like this (but more generic):
```d
import std.stdio : writeln;
auto filter(alias fn, T)(T[] slice){
//InputRange:
static struct Filter{
T[] slice;
bool empty()const{return slice.length == 0;}
T front(){return slice[0];}
void popFront(){
do{
slice = slice[1 .. $];
}while(slice.length && !fn(slice[0]));
}
}
return Filter(slice);
}
void main()@safe{
auto a = ["one", "one", "two", "one", "two", "one", "one",
"two"];
writeln(a);
writeln(a.filter!(x => x == "one"));
}
```
More information about the Digitalmars-d-learn
mailing list