Rust Векторы: Основы изменяемых по размеру массивов

RustRustBeginner
Практиковаться сейчас

This tutorial is from open-source community. Access the source code

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом лабе мы узнаем о векторах, которые в Rust представляют собой изменяемые по размеру массивы, которые могут расти или уменьшаться в любое время. Вектор представляется с использованием трех параметров: указатель на данные, длина и емкость. Емкость показывает, сколько памяти зарезервировано для вектора, и когда длина превышает емкость, вектор перераспределяется с большей емкостью. Мы можем собирать итераторы в векторы с использованием метода collect, инициализировать векторы с использованием макроса vec!, вставлять новые элементы в конец с использованием метода push и получать количество элементов с использованием метода len. Мы также можем получать доступ к элементам с использованием индексации, удалять последний элемент с использованием метода pop и итерироваться по вектору с использованием методов iter или iter_mut. Кроме того, в модуле std::vec доступно больше методов для векторов.

Примечание: Если в лабе не указано имя файла, вы можете использовать любое имя файла, которое хотите. Например, вы можете использовать main.rs, скомпилировать и запустить его с помощью rustc main.rs &&./main.

Векторы

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

  • указатель на данные
  • длина
  • емкость

Емкость показывает, сколько памяти зарезервировано для вектора. Вектор может расти, пока длина меньше емкости. Когда этот порог нужно превысить, вектор перераспределяется с большей емкостью.

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);
    // FIXME ^ Закомментируйте эту строку

    // Метод `len` возвращает количество элементов, текущихly хранящихся в векторе
    println!("Длина вектора: {}", xs.len());

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

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

    // Индексация за пределами границ вызывает панику
    println!("Четвёртый элемент: {}", xs[3]);
    // FIXME ^ Закомментируйте эту строку

    // `Векторы` можно легко итерировать
    println!("Содержимое xs:");
    for x in xs.iter() {
        println!("> {}", x);
    }

    // `Вектор` также можно итерировать, когда счётчик итерации
    // перечисляется в отдельной переменной (`i`)
    for (i, x) in xs.iter().enumerate() {
        println!("В позиции {} мы имеем значение {}", i, x);
    }

    // Благодаря `iter_mut`, изменяемые `Векторы` также можно итерировать
    // таким образом, чтобы можно было изменить каждое значение
    for x in xs.iter_mut() {
        *x *= 3;
    }
    println!("Обновлённый вектор: {:?}", xs);
}

Больше методов Vec можно найти в модуле std::vec

Резюме

Поздравляем! Вы завершили лабу по Векторам. Вы можете практиковаться в более лабах в LabEx, чтобы улучшить свои навыки.