std.collection - changing the collection while iterating

Jonathan M Davis via Digitalmars-d digitalmars-d at puremagic.com
Sun Jun 21 17:36:34 PDT 2015


On Sunday, 21 June 2015 at 23:58:38 UTC, H. S. Teoh wrote:
> On Sun, Jun 21, 2015 at 04:02:43PM -0700, Andrei Alexandrescu 
> via Digitalmars-d wrote:
>> 3. Allow the removal but throw from the ranges if there's any 
>> attempt to use a range following a remove.
>
> This is also too extreme. If I'm iterating over a linked-list 
> on the 50th element, there is no reason why deleting the first 
> element of the list should cause an exception when I later want 
> to visit the 51st element.

Which is why I would suggest that we consider the issue from the 
perspective of iterator/range invalidation. If the operation that 
you did on the container does not alter the number of elements in 
the range or which elements it refers to, then that range should 
still be considered valid and work exactly as it would have had 
the container operation not taken place. But if it _does_ alter 
the range, then the range should be considered invalidated, and 
it should be a logic error to continue to iterate over that range 
at that point.

That's basically how it's dealt with in C++. It's just that what 
happens when you iterate using an invalidated iterator is 
undefined behavior, and we could choose to throw an Error in that 
case if we wanted to be more user-friendly. That would generally 
result in a slight performance hit, but it would probably be 
minimal enough to be worth the extra gain in bug-catching. But 
programmers need to understand how the containers they're using 
work and what sort of operations make sense when you're iterating 
over them. I don't see how we could reasonably say otherwise.

But I agree that considering all ranges for a container invalid 
just because you removed an element from that container 
regardless of whether that would affect those ranges is 
definitely too extreme.

> Arbitrary container modification and iteration simply don't mix.

Agreed.

- Jonathan M Davis


More information about the Digitalmars-d mailing list