Fastest way to "ignore" elements from array without removal
z
z at z.com
Tue Feb 16 10:15:36 UTC 2021
On Tuesday, 16 February 2021 at 06:03:50 UTC, H. S. Teoh wrote:
> It depends on what your goal is. Do you want to permanently
> remove the items from the array? Or only skip over some items
> while iterating over it? For the latter, see
> std.algorithm.iteration.filter.
The array itself is read only, so it'll have to be an array of
pointers/indexes.
> For the former, you can use the read-head/write-head algorithm:
> keep two indices as you iterate over the array, say i and j: i
> is for reading (incremented every iteration) and j is for
> writing (not incremented if array[i] is to be deleted). Each
> iteration, if j < i, copy array[i] to array[j]. At the end of
> the loop, assign the value of j to the length of the array.
>
> Example:
>
> int[] array = ...;
> size_t i=0, j=0;
> while (i < array.length)
> {
> doSomething(array[i]);
> if (!shouldDelete(array[i]))
> j++;
> if (j < i)
> array[j] = array[i];
> i++;
> }
> array.length = j;
>
> Basically, the loop moves elements up from the back of the
> array on top of elements to be deleted. This is done in tandem
> with processing each element, so it requires only traversing
> array elements once, and copies array elements at most once for
> the entire loop. Array elements are also read / copied
> sequentially, to maximize CPU cache-friendliness.
>
>
> T
This is most likely ideal for what i'm trying to
do.(resizes/removes will probably have to propagate to other
arrays)
The only problem is that it does not work with the first element
but i could always just handle the special case on my own.[1]
I'll probably use .filter or an equivalent for an initial first
pass and this algorithm for the rest, thank you both!
[1] https://run.dlang.io/is/f9p29A (the first element is still
there, and the last element is missing. both occur if the first
element didn't pass the check.)
More information about the Digitalmars-d-learn
mailing list