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