Думая об ответе Свена Марнаха, я хочу использовать вектор, но мне также нужно вставлять постоянное время без дублирования.Затем я понял, что могу поддерживать как вектор, так и набор, и гарантировать, что у них обоих всегда были одинаковые элементы.Это позволит вставлять как постоянное время с дедупликацией, так и случайное удаление с постоянным временем.
Вот реализация, с которой я закончил:
struct VecSet<T> {
set: HashSet<T>,
vec: Vec<T>,
}
impl<T> VecSet<T>
where
T: Clone + Eq + std::hash::Hash,
{
fn new() -> Self {
Self {
set: HashSet::new(),
vec: Vec::new(),
}
}
fn insert(&mut self, elem: T) {
assert_eq!(self.set.len(), self.vec.len());
let was_new = self.set.insert(elem.clone());
if was_new {
self.vec.push(elem);
}
}
fn remove_random(&mut self) -> T {
assert_eq!(self.set.len(), self.vec.len());
let index = thread_rng().gen_range(0, self.vec.len());
let elem = self.vec.swap_remove(index);
let was_present = self.set.remove(&elem);
assert!(was_present);
elem
}
fn is_empty(&self) -> bool {
assert_eq!(self.set.len(), self.vec.len());
self.vec.is_empty()
}
}