Введение
В этом лабе мы узнаем о векторах, которые в 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, чтобы улучшить свои навыки.