Перейти к основному содержанию

15. Векторы (Vector)

Вектор – нефиксированный по длине набор однотипных значений. Вы можете изменять длину вектора (количество элементов). Значения элементов вектора могут быть изменены и удалены.

Вектор похож на массив, но с вышеперечисленными особенностями.

Вектор создается при помощи макроса vec! Тип данных вектора указывается внутри Vec<>. Для примера возьмем тот же список покупок:

fn main() {
	let shopping: Vec<&str> = vec!["bread", "milk", "cheese", "apple", "noodles"];
	println!("{:?}", shopping);
}
Результат такой же, как и при использовании массива: ["bread", "milk", "cheese", "apple", "noodles"]

Общий синтаксис создания заполненного вектора:

let vector_name: Vec<Type> = vec! [value1, value2, value3];

или пустого:

let mut vector_name: Vec<Type> = Vec::new()

Сразу используем mut, ведь мы планируем этот вектор заполнять значениями (изменять).

Получение значений элементов вектора

Любое значение из вектора можно получить по его индексу указанному в квадратных скобках, начиная с нуля:

fn main() {
	let shopping= vec!["bread", "milk", "cheese", "apple", "noodles"];
	println!("{}", shopping[2]);
}
Результат: cheese
Внимание. Нельзя использовать индекс выходящий за пределы вектора!

Перебор значений в цикле

Вектор является итерируемым объектом, поэтому можно использовать его напрямую в цикле.

fn main() {
	let shopping = vec!["bread", "milk", "cheese", "apple", "noodles"];
	for p in shopping {
	print!("{} ", p); 
}
Результат: bread milk cheese apple noodles

Можно использовать цикл для прохождения вектора по индексу, но для этого нужно узнать длину вектора (количество его значений) с помощью метода .len().

fn main() {
	let shopping = vec!["bread", "milk", "cheese", "apple", "noodles"];
	print!("Длина вектора: {}", shopping.len());
}
Результат: Длина вектора: 5

Для использования в цикле метода .enumerate() необходимо предварительно использовать метод .iter().

Методы вектора

Мы уже знаем метод .len(). Но есть ещё ряд полезных методов:

.push(value) – добавляет ещё одно значение в вектор

.pop() – забирает последнее значение. Это значение удаляется из вектора.

.remove(index) – удаляет значение по указанному индексу.

Пример:

fn main() {
    let mut shopping = vec!["bread", "milk", "cheese", "apple", "noodles"];
    shopping[0] = "banana";         // Заменили хлеб на банан
    shopping.push("cabbage");       // Добавили капусту
    shopping.push("salt");          // Добавили соль
    let a = shopping.pop();         // Забрали последнее значение (соль)
    shopping.remove(2);             // Удалили сыр
    println!("{:?}", shopping);
}
Результат: ["banana", "milk", "apple", "noodles", "cabbage"]
Обратите внимание, что переменная a не просто принимает значение находящееся в векторе, а является типом Option, который будете изучать в другом курсе. Если вы на 100% уверены, что значение не будет пустым, то можете применить метод .unwrap(). Пока не вникайте, просто используйте на практическом занятии конструкцию let a = shopping.pop().unwrap();.

.contains(value) - проверяет содержится ли это значение в векторе, возвращая true или false:

fn main() {
	let shopping = vec!["bread", "milk", "cheese", "apple", "noodles"];
	println!("{}", shopping.contains(&"orange"));
}
Результат: false
Пока можете не обращать внимание на знак & в contains(&"orange"). это указывает на ссылочный характер данных. Рассмотрим это в следующем курсе.

Если вектор так хорош, возникает вопрос, зачем тогда использовать массивы? Массив проще и поэтому более эффективен при хранении и доступе к данным.

Для просмотра заданий и решений, а также публикации своих решений необходимо зарегистрироваться на сайте.

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

© Клют И. А., 2022. Копирование контента возможно только с письменного разрешения автора.