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