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