Rust на примерах

17.2 Вектора

Вектора — это массивы с изменяемым размером. Как и у срезов, их размер не известен при компиляции, но он может увеличиваться и уменьшаться в любое время. Вектор определяется тремя словами: указатель на данные, длина вектора и его ёмкость. Ёмкость определяет, сколько памяти резервируется для вектора. Вектор может увеличиваться, пока его длина меньше его ёмкости. При необходимости превысить заданное значение объёма, вектору повторно выделяется память большего объёма.

fn main() {
    // Итераторы можно собрать в вектора
    let collected_iterator: Vec<i32> = (0..10).collect();
    println!("Собираем (0..10) в: {:?}", collected_iterator);

    // Для инициализации вектора можно использовать макрос `vec!`
    let mut xs = vec![1i32, 2, 3];
    println!("Начальный вектор: {:?}", xs);

    // Вставляет новый элемент в конце вектора
    println!("Добавляем 4 элементы в вектор");
    xs.push(4);
    println!("Вектор: {:?}", xs);

    // Ошибка! Неизменяемые вектора не могут увеличиваться
    collected_iterator.push(0);
    // ИСПРАВЬТЕ ^ Закомментируйте эту строку

    // Метод `len` возвращает текущий размер вектора
    println!("Размер вектора: {}", xs.len());

    // Обращение к элементам вектора записывается с помощью квадратных скобок
    // (нумерация элементов начинается с 0)
    println!("Второй элемент: {}", xs[1]);

    // `pop` удаляет последний элемент из вектора и возвращает его
    println!("Удаляем последний элемент: {:?}", xs.pop());

    // Обращение к элементу за пределами вектора вызывает ошибку
    println!("Четвёртый элемент: {}", xs[3]);
}

Подробную информацию о методах объекта Vec можно почитать в разделе модуля std::vec