Removing elements from dynamic arrays?
Chris Nicholson-Sauls
ibisbasenji at gmail.com
Tue Oct 31 12:34:29 PST 2006
Bill Baxter wrote:
> David Medlock wrote:
>
>> Bill Baxter wrote:
>>
>>> How do I remove an element from a dynamic array?
>>>
>>> int[] a = [1,2,3,4,5];
>>>
>>> I tried every syntax I could think of:
>>>
>>> a[3] = void;
>>> a[3..4] = void;
>>> a[3..4] = a[3..3];
>>> a[3] = [];
>>> a[3..4] = [];
>>> delete a[3];
>>> delete a[3..4];
>>>
>>> The last one compiles, but fills a[0] with garbage.
>>>
>>> I hope the answer isn't:
>>>
>>> a = a[0..3] ~ a[4..length];
>>>
>>> Thanks!
>>> --bb
>>
>>
>>
>> From my personal tools library...
>>
>> // remove an item from an array
>> template drop(T)
>> {
>> T drop( inout T[] arr, int which )
>> {
>> debug if ( which>=arr.length)
>> throw new Exception(str.format("Attempt to drop position %s
>> from size %s",which,arr.length));
>> T result = arr[which];
>> int max = arr.length-1;
>> for (; which < max; which++ ) arr[which]=arr[which+1];
>> arr.length= max;
>> return result;
>> }
>> }
Something you might find interesting/indicative -- I wrote a little test program to time
your function versus that found in Cashew, and with the slicing expression above. Output:
# Array length: 10000
# Iterations removing middle element: 5000
# ---------- Slice syntax: a[0 .. mid] ~ [mid + 1 .. a.length]
# <Benchmark array removals> Baseline 3.460000
# ---------- CashewUtils: a.removeIndex(mid)
# <Benchmark array removals> Time 2.970000 & 1.164983 versus baseline
# ---------- Drop: version 1
# <Benchmark array removals> Time 0.270000 & 12.814815 versus baseline
# ---------- Drop: version 2
# <Benchmark array removals> Time 0.390000 & 8.871795 versus baseline
Drop v2 was an attempt of mine at rewriting your .drop() that, obviously, falls a little
short of the original in performance. I also find it odd that Cashew's .removeIndex() is
actually timing a little master than the slice expression, because that's actually it is:
a wrapper around that very same expression. *confused* Anyhow, clearly your .drop() is
running very fast! I actually expected the opposite, and am surprised/impressed.
Maybe you should release it into Cashew? ;) And maybe I should put more into
benchmarking the entire Cashew array module. There might be a few more placed it could be
sped up.
>>
>> Even though it returns the array, it modifies it in place.
>>
>> -DavidM
>
>
> Thanks David, this seems like the best answer in terms of efficiency,
> although I suppose the
> a = a[0..3] ~ a[4..length];
> could theoretically be pretty similar depending how the compiler
> implements it.
>
>
> There really should be syntax in the language or at least functions like
> the above in the standard library for this (and for removing slices).
# import cashew.utils.array;
#
# int[] foo = ... ;
# foo.remove(3U);
# foo.removeRange(2U, 7U);
# foo.removeSub(foo[1 .. 5]);
etc.
That's why I maintain those. Hopefully, eventually, it does spawn a standard library
module. (I'm always looking for ways to further optimize them, but I do want to keep them
fairly simple.)
-- Chris Nicholson-Sauls
More information about the Digitalmars-d-learn
mailing list