Removing elements from dynamic arrays?
Bill Baxter
dnewsgroup at billbaxter.com
Mon Oct 30 18:20:58 PST 2006
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;
> }
> }
>
>
> 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).
Otherwise std::vector starts to look handy compared to D arrays, and you
don't want that! ;-) Built-in arrays are supposed to be easier to use
than library code, after all.
// Erases the element at position pos.
iterator std::vector::erase(iterator pos)
//Erases the range [first, last)
iterator std::vector::erase(iterator first, iterator last)
Other than that, it looks like arrays support a sane syntax for
everything std::vector has, except maybe
std::vector::reserve()/std::vector::capacity()
which has also been discussed recently.
--bb
More information about the Digitalmars-d-learn
mailing list