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

Урок №2 - Векторы

Posted on:12 февраля 2023 г. at 21:30

Example Dynamic OG Image link Векторы в Rust - это динамический массив, который может увеличиваться или уменьшаться в размерах. Они используются для хранения коллекций значений одного и того же типа. Вот как использовать их в Rust:

Создание вектора

Векторы могут быть созданы с помощью макроса vec!, подобно этому:

let mut v = vec![1, 2, 3, 4];

Вы также можете создать пустой вектор и добавить в него элементы позже:

let mut v = Vec::new();
v.push(1);
v.push(2);
v.push(3);

Указание емкости

Когда вы создаете вектор, вы можете указать емкость, которая представляет собой объем пространства, которое вектор будет предварительно выделять в памяти:

let mut v = Vec::with_capacity(10);
v.push(1);
v.push(2);
v.push(3);
println!("{:?}", v);

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

Резервирование дополнительного пространства

Вы можете зарезервировать дополнительное пространство для вектора, используя метод reserve:

let mut v = vec![1, 2, 3];
v.reserve(10);
println!("capacity: {}", v.capacity());

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

Сокращение пропускной способности

Вы можете уменьшить емкость вектора, чтобы он соответствовал длине, используя метод shrink_to_fit:

let mut v = vec![1, 2, 3];
v.reserve(10);
v.shrink_to_fit();
println!("capacity: {}", v.capacity());

Это уменьшит емкость вектора, чтобы он соответствовал длине, освобождая любую неиспользуемую память.

Клонирование вектора

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

let v = vec![1, 2, 3];
let v_clone = v.clone();
println!("{:?}", v_clone);

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

Доступ к элементам

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

let v = vec![1, 2, 3, 4];
println!("The third element is {}", v[2]);

Обратите внимание, что доступ к индексу за пределами границ приведет к панике, поэтому рекомендуется проверить длину вектора перед доступом к элементам.

Перебор по вектору

Вы можете выполнять итерации по элементам вектора, используя цикл for:

let v = vec![1, 2, 3, 4];
for i in v {
    println!("{}", i);
}

Вы также можете использовать метод iter() для получения итератора, а затем использовать такие методы, как next(), для получения следующего значения:

let v = vec![1, 2, 3, 4];
let mut iterator = v.iter();

loop {
    match iterator.next() {
        Some(x) => println!("{}", x),
        None => break,
    }
}

Использование метода for_each

Метод for_each - это краткий способ перебора вектора и выполнения операции над каждым элементом:

let v = vec![1, 2, 3, 4];
v.iter().for_each(|x| println!("{}", x));

Модифицирование элементов

Вы можете изменять элементы вектора, используя квадратные скобки и индекс, например:

let mut v = vec![1, 2, 3, 4];
v[2] = 42;
println!("{:?}", v);

Срез вектора

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

let v = vec![1, 2, 3, 4, 5];
let slice = &v[1..4];
println!("{:?}", slice);

Это даст вам фрагмент элементов от индекса 1 до индекса 3 (не включая индекс 4).

Добавление векторов

Вы можете объединить два вектора в один, используя метод extend:

let mut v1 = vec![1, 2, 3];
let v2 = vec![4, 5, 6];
v1.extend(v2);
println!("{:?}", v1);

Это даст вам единый вектор, содержащий элементы как из v1, так и из v2.

Нахождение минимального и максимального значений

Вы можете найти минимальное и максимальное значения в векторе, используя методы min и max:

let v = vec![3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5];
let min = v.iter().min().unwrap();
let max = v.iter().max().unwrap();
println!("min: {} max: {}", min, max);

Эти методы возвращают Option, поэтому вам нужно будет использовать unwrap, чтобы получить фактическое значение.

Сортировка вектора

Вы можете отсортировать элементы вектора в порядке возрастания, используя метод сортировки:

let mut v = vec![3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5];
v.sort();
println!("{:?}", v);

Это приведет к сортировке элементов на месте, что означает, что исходный вектор будет изменен.

Удаление вектора

Наконец, важно знать, как удалить вектор, когда вы закончите с ним работать. Это освободит память, которая была выделена для вектора:

let v = vec![1, 2, 3];
drop(v);

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

Итог

Это всего лишь еще несколько примеров того, что вы можете делать с векторами в Rust. Стандартная библиотека предоставляет гораздо больше методов для работы с векторами, поэтому обязательно ознакомьтесь с документацией для получения дополнительной информации.