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.