On Wednesday, 9 April 2014 at 23:18:27 UTC, dnspies wrote:
I know that D slices are set up so you can successively append to them and it only has to re-allocate infrequently, but what about with prepending?

ie, does D have a way to handle

int[] x;
for(int i=0; i < 1000; i++) {
  x = [i] ~ x;
}

efficiently, or is it better to avoid this sort of thing?

Yeah, that's going to re-allocate every time. At the very least, use std.array.insertInPlace, which will do what it can to avoid re-allocating, as well as calling un-needed postblits (when applicable):

int[] x;
for(int i=0; i < 1000; i++)
    insertInPlace(x, 0, i);

But even then, insertInPlace has a complexity of O(N), so while this is "better", it is still far from optimal.

You should try to avoid prepending in a loop altogether if you can. Try to prefer a solution where:
- you foreach_reverse and you always append.
- you foreach, but assign to the final location (requires setting length first). - you foreach, but append, and then std.algorithm.reverse once done.
Just some ideas.

Reply via email to