Removing multiple elements from array

bearophile bearophileHUGS at lycos.com
Fri Dec 20 18:51:59 PST 2013


aldanor:

> Is there an efficient method to remove elements with multiple 
> (compile-time-unknown) indices from an array? I currently do 
> something like
>
> 		if (!index.empty)
> 			foreach (i; index.sort.reverse)
> 				a = a.remove(i);
>
> ... which looks a bit awkward.

Do not forget to add the () after the sort, otherwise you call 
the deprecated, buggy and slow built-in sort.

reverse is another deprecated built-in, so use "retro".

The first "if" is not much useful, trying to sort an empty array 
will not wast much time.

foreach (i; index.sort().retro)
     a = a.remove(i);

In alternative you can also invert the sorting cmp (untested):

foreach (i; index.sort!q{a > b})
     a = a.remove(i);

If you have to remove just few items in-place, that's the way to 
do it. In future I hope we'll have a better remove function in 
Phobos (but it's not hard to write).

Another solution is to filter the array a. If you have the 
indexes, you can zip a with the indexes, and then filter, map to 
extract just the items and use copy() to work in place, but it's 
not nice-looking code.

Bye,
bearophile


More information about the Digitalmars-d-learn mailing list