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.

Reply via email to