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();