Can you show me an example or removing a number?

I think that is a prime example of why std.container sucks both in documentation and implemantation.

We really need to improve here, sadly development seems to be bottlenecked by Andrei working on on allocator proposal. And Andrei is busy at the moment.

Here is the solution. You actually need 4 different modules from phobos to do this and it is absolutely not obvious how to do it.

import std.algorithm;
import std.range;
import std.container;
import std.array;

void main(string[] args)
{
    SList!int list = [1,2,3,4,5]; // our list
writeln(list.array()); // need to create an array to print nicely auto pos = find(list[], 4); // we need a range, so we search for the number auto pos2 = take(pos, 1); // but find returns a range over the rest, so take one
    list.linearRemove(pos2); // remove it
    writeln(list.array()); // print it
}


I needed to look it up myself and didn't find a solution on first try.

My first error: You can't just do find(list, 4), because an SList is not a range by itself. So you need opSlice (list[]) to get a range over list.

Then I knew already that find gives me not what I want. I somehow need to restrict the range pos to the first element. But how to do it? I wouldn't expect a newcomer to come up with a solution on its own, because pos[0..1] will not work on a forward range. Luckily I knew std.range.takeOne.

But hold! takeOne(pos) does not work, you need take(pos, 1).

That sucks.

None of the above is stated explicitly in the documentation. I knew that the container generally need a range that was extracted from them. How should I know that in this special case a range from std.range will work, too? And not all ranges work, only the one from take.










Reply via email to