On Mon, 16 May 2011 15:12:17 -0400, Timon Gehr <timon.g...@gmx.ch> wrote:
As an example, let's say I define:
void removeAt(T)(ref T[] arr, size_t index)
{
foreach (i, ref item; arr[index .. $ - 1])
item = arr[i + 1];
arr = arr[0 .. $ - 1];
}
and then I have:
auto arr = [1, 2, 3];
arr.removeAt(0);
arr ~= 4;
The last statement ***WILL*** cause a reallocation, so that doesn't
help.
You need to do arr.assumeSafeAppend(); Otherwise, the runtime is not
aware of your invalidation of the last element.
What about:
void removeAt(T)(ref T[] arr, size_t index)
{
foreach (i, ref item; arr[1 .. index+1])
item = arr[i - 1];
arr = arr[1 .. $]; //note how no valid data is beyond the end of the
array
}
I did not test it but in theory this should give you the amortized
constant
guarantee for ~=.
Yes, this should solve the problem, depending on the situation.
Essentially, as long as you are not keeping other references to the array
you expect to be updated properly (this solution "moves" the original
pointer to the right each time), it should work.
-Steve