foreach vs. iterators
Sean Kelly
sean at f4.ca
Thu Nov 2 19:39:14 PST 2006
Walter Bright wrote:
> Sean Kelly wrote:
>> I think I agree, but for the sake of argument, how would D handle
>> 'find' operations on sequences that don't support opIndex? At some
>> point, a generalizable bookmark is almost necessary for a faithful
>> implementation of some C++ algorithms. Also, many of these algorithms
>> also require iteration across two sequences simultaneously, which
>> doesn't map very cleanly into foreach. Consider a substring-style
>> find operation (std::search), for example, where both the pattern and
>> target types do not support opIndex or opSlice. I might argue that
>> it's a bit silly or unrealistic to desire such an operation, but the
>> C++ algorithm library does support it.
>
> I think the target types will have to support opIndex or opSlice.
Forgive me for resurrecting a horribly battered equine, but I was
thinking about this a bit tonight and I've decided that foreach,
foreach_reverse, and array operations are not a sufficient general
substitute for C++ iterators.
For example, let's say I want to compute the set union of two sorted
ranges, one of size M, the other of size N. By iterating across the two
ranges simultaneously is is easy to see that the complexity for the
operation will be max(M,N). In C++ this is easily accomplished using
forward iterators, and the ranges can be anything from arrays to SQL
result sets.
In D however, there is no way to iterate across multiple ranges
simultaneously using foreach, so opIndex must be used instead. With
containers that have a constant-time lookup cost this isn't a big deal,
but what if these containers are binary trees? The complexity for such
an operation would be M(log(M)) + N(log(N)).
From this it seems clear that foreach is not sufficiently adaptable to
meet the needs of all sequential algorithms and opIndex is not a
reasonable substitute for all cases where foreach may not be used. What
alternatives do we have? So far, iterator variants are all I've been
able to come up with.
Sean
More information about the Digitalmars-d-announce
mailing list