Removing elements from dynamic arrays?

David Medlock noone at nowhere.com
Wed Nov 1 04:10:52 PST 2006


Bill Baxter wrote:
> Bill Baxter wrote:
> 
>> David Medlock wrote:
>>
>>> For giggles I posted the conditional version(also public domain):
>>>
>>> // remove items based on a predicate. returns number of items removed
>>> template drop_if(T)
>>> {
>>>   int drop_if( T[] arr, bool delegate(T)pred )
>>>   {
>>>     int count = 0, dest=0;
>>>     foreach( int index, T val ; arr )
>>>     {
>>>       if ( pred(val) ) { count++; continue; }
>>>       if ( dest !=index ) arr[index] = dest;
>>>       dest++;
>>>     }
>>>     return count;
>>>   }
>>> }
>>>
>>
> 
> And here's a better range-dropping version:
> 
> // Remove a range of elements from an array in place.
> // It is not an error for the range to be empty or for start to be
> // greater than end. If so, the array is not modified.
> // Out of bounds checks performed only in debug mode.
> // Returns: the array for convenience (but it is modified in-place).
> // Note: This is an O(n) operation.
> template drop_range(T)
> {
>   T[] drop_range( inout T[] arr, int start, int end )
>   {
>     debug if ( start>=arr.length || end > arr.length || start<0 || end<0)
>         throw new Exception(format("Attempt to drop range %s,%s from 
> size %s",start,end,arr.length));
>     if (start>=end) return arr;
>     size_t len = end-start;
>     size_t max = arr.length-len;
>     for (; start < max; start++ ) arr[start]=arr[start+len];
>     arr.length= max;
>     return arr;
>   }
> }
> 
> --bb

Lets combine all these with what Oskar has and get them into Phobos!

Since arrays are built into the language, these should come with the 
standard library.

-DavidM



More information about the Digitalmars-d-learn mailing list