Sorted unique list from Iterator<T: Ord + Hash>?

We have T: Ord + Hash.

Input: I have an Iterator<T>

Output: I want a vec containing in sorted order the elements of the iterator.

I am currently doing something like:

let mut v = it.collect::<HashSet<_>>().iter().collect::<Vec<_>>();
v.sort();
return v;

Question: The above seems a bit hacky. Is there a more elegant approach to this ?

You can skip the HashSet and call v.dedup(); after sorting it

A BTreeSet would also give you order. That might be preferable if there are a lot of duplicates, and you don't want the overhead of storing them before vec sort+dedup.

You can .dedup() the sorted vec to deduplicate elements. If most input elements are unique this can be more performant as it skip the HashSet.

If you're open to using external crates, you could do something like this (untested):

use itertools::Itertools;
let v:Vec<_> = it.sorted().dedup().collect();

.sorted() constructs a intermediate vector which can't be reused on .collect() due to the .dedupe().

Right; it's less efficient due to the extra allocation & copy. That may be an acceptable price to pay for the simpler code, especially in a prototyping stage.