Оба типа представляют множества для хранения уникальных элементов.
Отличия HashSet и BTreeSet
Множество
HashSet
BTreeSet
Сортировка
Случайный порядок
Да
Сложность алгоритма
O(1) в среднем
O(log n)
Потребление памяти
Выше (hash-таблица)
Ниже
Запросы диапазонов значений
Нет
Да
Типажи
T: Hash + Eq
T: Ord
Работа с HashSet
usestd::collections::HashSet;fnmain(){// Создание
letmutcolors=HashSet::new();// Добавление элеметов
colors.insert("red");colors.insert("green");colors.insert("blue");colors.insert("red");// дубликат - не будет добавлен!
println!("HashSet: {:?}",colors);// порядок произвольный
// Проверка существования элемента
ifcolors.contains("green"){println!("Contains green!");}// Итерация (порядок не гарантирован)
forcolorin&colors{println!("Color: {}",color);}// Удаление элемента
colors.remove("blue");// Объединение двух HashSet
letmutwarm_colors=HashSet::new();warm_colors.insert("red");warm_colors.insert("yellow");warm_colors.insert("orange");letall_colors: HashSet<_>=colors.union(&warm_colors).collect();println!("All colors: {:?}",all_colors);}
Работа с BTreeSet
usestd::collections::BTreeSet;fnmain(){// Создание BTreeSet
letmutnumbers=BTreeSet::new();// Вставка элементов (авто-сортировка!)
numbers.insert(5);numbers.insert(2);numbers.insert(8);numbers.insert(1);numbers.insert(5);// дубликат - не будет добавлен!
println!("BTreeSet: {:?}",numbers);// сортировка всегда: {1, 2, 5, 8}
// Проверка существования элемента
ifnumbers.contains(&2){println!("Contains 2!");}// Итерация по порядку
fornumin&numbers{println!("Number: {}",num);// 1, 2, 5, 8
}// Получить первый и последний элементы
ifletSome(first)=numbers.first(){println!("First element: {}",first);// 1
}ifletSome(last)=numbers.last(){println!("Last element: {}",last);// 8
}// Запрос диапазона значений
letrange: Vec<_>=numbers.range(2..=5).collect();println!("Numbers between 2 and 5: {:?}",range);// [2, 5]
// Удаление элемента
numbers.remove(&5);}
HashSet -> Vector
Простой способ:
usestd::collections::HashSet;letset: HashSet<char>=['a','b','c','d'].into_iter().collect();// Перевод в Vec<char> - расстановка элементов произвольная
letvec: Vec<char>=set.into_iter().collect();println!("Vec: {:?}",vec);// Example: ['c', 'a', 'd', 'b']