How to best translate this C++ algorithm into D? - refill with range
Nick Treleaven via Digitalmars-d
digitalmars-d at puremagic.com
Wed Jun 11 06:45:58 PDT 2014
On 07/06/2014 16:39, monarch_dodra wrote:
> Then, you are using the code:
> .partition!(forest_invalid).sort.uniq.array;
>
> The "advantage" of "partition" over "filter" is that "partition" is a
> greedy inplace algorithm. But then, you go on to use "uniq", which is
> lazy, and requires "array". I implemented a (very) simplistic in-place
> "removeDuplicates":
More generally, perhaps we could have a function to apply a lazy range
to an existing random-access range:
import std.range;
/** Copy up to r.length elements of src to r. */
auto refill(R, Input)(ref R r, Input src)
if (isRandomAccessRange!R && isInputRange!Input)
{
foreach (i, ref e; r)
{
if (src.empty)
{
r.length = i;
return r;
}
e = src.front;
src.popFront;
}
// ignore leftover elements in src
return r;
}
import std.algorithm : uniq;
/// eager wrapper for uniq
auto dedup(T)(ref T v){return v.refill(v.uniq);}
//alias dedup = (ref v) => v.refill(v.uniq);
void main()
{
auto a = [5,5,5,5,4,3,3,3,1];
a.dedup;
assert(a == [5, 4, 3, 1]);
}
More information about the Digitalmars-d
mailing list