how to get top N distinct elements from range?

bearophile bearophileHUGS at lycos.com
Fri Mar 8 15:34:23 PST 2013


Andrea Fontana:

> Something goes wrong by the way. I removed "n" template params 
> and "take(n)" (i can do after distinct() call, isn't it the 
> same?).

I think take() is not the cause.

See this program:



import std.stdio, std.range, std.algorithm, std.traits, 
std.random;

auto distinct(Range)(Range r) if (isInputRange!Range) {
     bool[ForeachType!Range] mySet;

     return r.filter!((k) {
         if (k in mySet)
             return false;
         mySet[k] = true;
         return true;
     });
}

void main() {
     5.iota.map!((_) {
         auto x = uniform(0, 10);
         write("*");
         return x;
     }).distinct.writeln;
}


It outputs something like:

*[*2*, *0*, *2**, *1]


You expect that output to contain only 5 stars.

Maybe map() or filter() is the cause of this.

Bye,
bearophile


More information about the Digitalmars-d-learn mailing list