std.container & ranges
Jonathan M Davis
jmdavisProg at gmx.com
Sun Oct 30 10:45:58 PDT 2011
On Sunday, October 30, 2011 11:38:30 Max Wolter wrote:
> Hello there.
>
> I seem to be having problems wrapping my head around how to use the
> ranges in the context of containers in phobos. Specifically, I can't
> seem to figure out how to remove an element from a linked list.
>
> foreach(cell; organism)
> {
> if(cell.x == x && cell.y == y)
> {
> organism.stableLinearRemove(cell);
> break;
> }
> }
>
> mind.d(123): Error: function
> std.container.SList!(Cell).SList.linearRemove (Range r) is not callable
> using argument types (Cell)
> mind.d(123): Error: cannot implicitly convert expression (cell) of type
> cell.Cell to Take!(Range)
>
> I somehow get the feeling such a basic operation should just...work?
linearRemove (and stableLinearRemove) takes a _range_ not a value. cell is an
element in the list, not a range over the list. The range that it takes must
be either of type SList.Range or Take!(SList.Range). You get that range by
slicing an SList. Take!(SList.Range) is for the case where you want only a
portion of the beginning of a range rather than the whole range. Your example
actually has a really simple solution:
auto found = find!((a){return a.x == x && a.y == y;})(organism[]);
organism.stableLinearRemove(take(found, 1));
It finds the element in the list that you're looking for, and then it passes a
range with that one element to stableLinearRemove so that it'll remove it.
- Jonathan M Davis
More information about the Digitalmars-d-learn
mailing list