On Sun, 30 Oct 2011 06:38:30 -0400, Max Wolter <awishform...@gmail.com> 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?

I offer an alternative collection library to std.container which has a simpler (IMO) interface and features.

There is specifically a feature for removal during iteration. It would look like this:

foreach(ref doRemove, cell; &organism.purge)
{
doRemove = cell.x == x && cell.y == y; // flag indicating the current element should be removed
   // note, not necessary to break here
   if(doRemove)
      break;
}

Note two things, removal during iteration is directly supported, meaning it does not derail the iteration; and removal during iteration is a quick operation (O(lg(n)) or better) in terms of the individual removal.

If you have a linked list, you can also do it the "range" way:

organism.remove(find!((a){return a.x == x && a.y == y;})(organism[]).begin);

begin is an accessor for a dcollections range that returns a reference (cursor) to the first element in the range.

Note also that dcollections' linked list is doubly-linked, so removal is O(1).

-Steve

Reply via email to