to invalidate a range

Steven Schveighoffer schveiguy at yahoo.com
Mon Aug 15 06:55:17 PDT 2011


On Fri, 12 Aug 2011 16:58:15 -0400, Ellery Newcomer  
<ellery-newcomer at utulsa.edu> wrote:

> On 08/12/2011 03:29 PM, Steven Schveighoffer wrote:
>> On Fri, 12 Aug 2011 15:54:53 -0400, Ellery Newcomer
>> <ellery-newcomer at utulsa.edu> wrote:
>>
>>> in std.container, the stable* container functions advocate that they
>>> do not invalidate the ranges of their containers. What does it mean to
>>> invalidate a range?
>>
>> Say for example, you are iterating a red black tree, and your current
>> "front" points at a certain node. Then that node is removed from the
>> tree. That range is now invalid, because the node it points to is not
>> valid.
>
> Then there is no way to implement a stable remove from a node based  
> container?

Not one that guarantees stability.  However, you can implement a remove  
that can be proven to be stable for certain cases (basically, as long as  
you don't remove one of the endpoints).

>> Another example of an invalidated range, let's say you have a hash map.
>> The range has a start and a finish, with the finish being iterated after
>> the start. If you add a node, it could cause a rehash, which could
>> potentially put the finish *before* the start!
>
> Then the invalidation is that the range failed to produce an element of  
> the container?

No, it may crash the program, for example if empty does:

return this.beginNode is this.endNode;

If beginNode is sequentially after endNode, this condition will never be  
true.

But there are other definitions of "invalid", I'd call any of these cases  
invalidated ranges:

  * it fails to iterate valid nodes that were in the range before the  
operation, and are still valid after the operation.
  * it iterates a node more than once (for example, iterates a node before  
the operation, then iterates it again after the operation)
  * it iterates invalid nodes (nodes that have been removed).

-Steve


More information about the Digitalmars-d-learn mailing list