Help with Ranges
Steven Schveighoffer
schveiguy at gmail.com
Mon Jul 27 18:15:26 UTC 2020
On 7/27/20 1:10 PM, Charles wrote:
> Still, I'm confused since, as
> far as I know, map wraps its source, i.e. the array in this case, which
> is sortable. It seems to me the only reason I can't sort MapResult is
> because it doesn't have the proper interface.
Let's talk about a concrete example, so you can see why:
int[] arr = [21, 83, 45, 60];
auto m = arr.map!(a => a % 10);
Sort is going to look at m as a random-access range of integers. But the
integer you get from m[2] for instance is going to be 5. So you can
compare e.g. m[2] and m[3] (5 and 0), but how do you *WRITE* back to the
original array? All you have as an interface is non-writable 5 and 0,
not the original array members 45 and 60. In other words, if you swapped
5 and 0, map can't do the inverse transform here (and even if it could,
0 and 5 map to millions of possible original values).
What it seems like you are possibly interested in doing is to sort the
original array based on a transformation. But in your original post you
said "doSomething is some predicate that does a lot of processing on
each element", so I assumed, e.g. something like this is not valid for
your use case:
arr.sort!((a, b) => doSomething(a) < doSomething(b))
as it would be very expensive assuming doSomething is expensive.
You can use H.S. Teoh's suggestion and use schwartzSort (in fact, it
does something almost exactly the same as what I wrote, except it sorts
the original elements).
However, for something like a % 10, I'd much rather just do it without
allocating another array.
So it really depends on what your requirements are, which you haven't
fully identified.
-Steve
More information about the Digitalmars-d-learn
mailing list