On Saturday, 6 October 2018 at 13:34:44 UTC, Adam D. Ruppe wrote:
On Saturday, 6 October 2018 at 13:17:22 UTC, bauss wrote:
My first thought was "uniq", but it can't really do it like
that, but it doesn't work.
uniq needs it to be sorted first, it only compares side-by-side
(to avoid allocating space to remember what it has already seen)
Is there another function in Phobos that perhaps would work?
If the set is small enough and it is at least a forward range,
you could do a O(n^2) search with like filter with !canFind
(making sure the one it finds is not the one you are currently
looking at).
But I think you are better off doing your own thing. I like to
just stick them all in an associative array, then loop over
that. The duplicate keys will naturally be filtered that way.
Of course, it allocates memory for that but that's often
preferable to running the expensive search anyway.
It "can" be a big set, but it's probably the most straightforward
way for now thought.
On Saturday, 6 October 2018 at 13:38:34 UTC, Nicholas Wilson
wrote:
On Saturday, 6 October 2018 at 13:17:22 UTC, bauss wrote:
Let's say you have a range with struct, but some of the struct
are duplicates of each other.
Is there a standard function in Phobos to remove duplicates?
My first thought was "uniq", but it can't really do it like
that, but it doesn't work.
See: https://run.dlang.io/is/IcFEtw
Is there another function in Phobos that perhaps would work?
I can of course write my own function, but if there is a
standard function that can do it, then I'd rather use that.
range
.array.sort // make equal elements be adjacent
.chunks!"a==b" // get a range over those equal elements
.map(e => e.front); // get the first one
should work, possibly not the most efficient way to do it
though.
I don't know off the top of mu head if there are any to
preserve the order or the original range.
That doesn't work tbh. won't even compile.