C++ / Why Iterators Got It All Wrong

Mark via Digitalmars-d digitalmars-d at puremagic.com
Mon Sep 4 10:34:00 PDT 2017


On Sunday, 3 September 2017 at 12:46:05 UTC, Moritz Maxeiner 
wrote:
> I agree, though I was talking about what the abstract data type 
> of a "series" is, i.e. what operations is exposes. From my 
> observation:
> A D input range exposes via empty/front/popFront.
> A classic iterator exposes via begin/end.
> A Rebol series seems to be a safer form of iterator, as it 
> doesn't expose begin/end directly, but exposes restricted 
> operations that are defined as manipulating begin/end.

They are all pretty low-level abstractions. C++ has posited that 
iterators should be the bridge connecting generic data structures 
and generic algorithms. But they are pretty awful at that. They 
make it incredibly easy to destroy one of your structure's 
invariants, or to use it in a way that ignores some of its 
invariants (leading to inferior performance and sometimes 
unnecessarily bulky code). Ironically iterators are frequently 
used in OO code even though they clearly violate the "Tell, don't 
ask" principle, as do D ranges (and presumably also Rebol series, 
though I only skimmed over the documentation).


More information about the Digitalmars-d mailing list