Vec

Vec — стандартний буфер із змінним розміром, виділений у купі:

fn main() {
    let mut v1 = Vec::new();
    v1.push(42);
    println!("v1: len = {}, capacity = {}", v1.len(), v1.capacity());

    let mut v2 = Vec::with_capacity(v1.len() + 1);
    v2.extend(v1.iter());
    v2.push(9999);
    println!("v2: len = {}, capacity = {}", v2.len(), v2.capacity());

    // Канонічний макрос для ініціалізації вектора з елементами.
    let mut v3 = vec![0, 0, 1, 2, 3, 4];

    // Зберігаємо тільки парні елементи.
    v3.retain(|x| x % 2 == 0);
    println!("{v3:?}");

    // Видаляємо дублікати, що йдуть підряд.
    v3.dedup();
    println!("{v3:?}");
}

Vec реалізує Deref<Target = [T]>, який означає, що ви можете викликати методи зрізу на Vec.

This slide should take about 5 minutes.
  • Vec — це тип колекції разом із String і HashMap. Дані, які він містить, зберігаються в купі. Це означає, що кількість даних не потрібно знати під час компіляції. Він може рости або зменшуватися під час виконання.
  • Зверніть увагу, що Vec<T> також є узагальненим типом, але вам не потрібно вказувати T явно. Як завжди з визначенням типу Rust, T було встановлено під час першого виклику push.
  • vec![...] — це канонічний макрос для використання замість Vec::new(), який підтримує додавання початкових елементів до вектора.
  • Щоб індексувати вектор, ви використовуєте [ ], але вони панікують, якщо вийдуть за межі. Крім того, використання get поверне Option. Функція pop видалить останній елемент.
  • Зрізи розглядаються на 3-й день. Наразі студентам потрібно лише знати, що значення типу Vec дає доступ до всіх задокументованих методів зрізів.