how to get top N distinct elements from range?

Andrea Fontana nospam at example.com
Sat Mar 9 01:32:39 PST 2013


On Saturday, 9 March 2013 at 09:13:26 UTC, Andrea Fontana wrote:
> On Saturday, 9 March 2013 at 01:36:53 UTC, bearophile wrote:
>>
>> Is it a good idea to replace std.algorithm.filter with 
>> something like that filter2 (plus some missing methods)?
>>
>> Bye,
>> bearophile
>
> Maybe two versions (filter and cachedFilter) or a bool template 
> param?
>
> I was thinking about @pure front() too: but I think it's a 
> wrong assumption. The right assumption would be that front 
> should return the same value until popFront is called again. It 
> can read front value lazily from front() call. It can do a lot 
> of impure things (lol) but it shouldn't change front "randomly" 
> at each call.
>
> I would improve distinct to support an alias pred = "a < b" to 
> build a bst instead of an AA.
>
> Or just a field like distinct!"a.id" (that should work with aa 
> backend)

I almost got it:

auto distinct(alias fun = "a", Range)(Range r)
if (isInputRange!Range) {
	alias unaryFun!fun _fun;

	bool[ReturnType!_fun] mySet;
	
	return r.filter2!((k) {
					  	if (_fun(k) in mySet)
					  		return false;
					  	mySet[_fun(k)] = true;
					  	return true;
					  });
}

ReturnType!_fun doesn't work, if i set to the right type, 
function works as expected


More information about the Digitalmars-d-learn mailing list