Safe to remove AA elements while iterating over it via .byKeyValue?

Anonymouse zorael at gmail.com
Sun Sep 27 13:45:15 UTC 2020


On Sunday, 27 September 2020 at 13:02:04 UTC, Per Nordlöw wrote:
> Is it safe to remove AA-elements from an `aa` I'm iterating 
> over via aa.byKeyValue?
>
> I'm currently doing this:
>
>     foreach (ref kv; aa.byKeyValue)
>     {
>         if (pred(kv.key))
>             aa.remove(kv.key); // ok?
>     }
>     if (aa.length == 0)
>         aa = null;
>
> Is there a better way?

The boring way is to store an array of the spent keys and remove 
afterwards.

KeyType!(typeof(aa))[] garbage;
garbage.reserve(aa.length);

foreach (ref kv; aa.byKeyValue)
{
     if (pred(kv.key))
         garbage ~= kv.key;
}

foreach (const key; garbage)
{
     aa.remove(key);
}

This works with normal arrays too (and 
std.algorithm.mutation.remove), if you foreach_reverse the 
garbage array.


More information about the Digitalmars-d-learn mailing list