Перейти к основному содержимому
Модуль 7 · Урок 1 из 213/14 в курсе~12 min
Уроки модуля (1/2)

Коллекции и HashMap

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

Двумя наиболее часто используемыми коллекциями в Rust являются векторы (Vec<T>) и карты значений ключа (HashMap<K, V>).


Векторы (Vec<T>)

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

Rust
fn main() {
    // Creating an empty mutable vector
    let mut v: Vec<i32> = Vec::new();

    // Or using the vec! macro
    let mut v2 = vec![1, 2, 3];

    // Appending elements
    v.push(5);
    v.push(6);

    // Accessing elements by index
    let third = v2[2];
    println!("The third element is: {}", third);
}

ХэшМап (HashMap<K, V>)

В коллекции HashMap<K, V> хранится сопоставление ключей типа K со значениями типа V. Он работает через функцию хеширования, которая определяет, как эти ключи и значения размещаются в памяти. Это чрезвычайно полезно, когда вы хотите искать данные не по числовому индексу, а по ключу (например, имени или идентификатору).

Rust
use std::collections::HashMap;

fn main() {
    let mut scores = HashMap::new();

    // Inserting key-value pair
    scores.insert(String::from("Blue"), 10);
    scores.insert(String::from("Yellow"), 50);

    // Reading a value (returns an Option<&V>)
    let team_name = String::from("Blue");
    let score = scores.get(&team_name);

    match score {
        Some(val) => println!("Score: {}", val),
        None => println!("No score found."),
    }
}

Попробуйте сами

Упражнение 1. Основные операции с Vec

Упражнение#rust.m7.l1.e1
Попыток: 0Загрузка…

Объявите изменяемый целочисленный вектор с именем v с помощью Vec::new(). Добавьте элементы 10, 20 и 30 последовательно, используя метод push. Наконец, напечатайте первый элемент вектора (индекс 0), используя println!.

Загрузка редактора…
Показать подсказку

Используйте `let mut v = Vec::new();` для инициализации вектора, вставьте элементы с помощью `v.push(value)` и получите доступ к `v[0]`.

Решение доступно после 3 попыток

Упражнение 2. Оценки пользователей с помощью HashMap

Упражнение#rust.m7.l1.e2
Попыток: 0Загрузка…

Импортируйте std::collections::HashMap. В основной функции объявите изменяемый HashMap с именем «scores» для хранения строковых ключей и значений i32. Введите оценку 50 для пользователя «Алиса». Безопасно извлеките оценку с помощью метода get и unwrap(), чтобы распечатать ее.

Загрузка редактора…
Показать подсказку

Не забудьте `use std::collections::HashMap;`. Вставьте с помощью `scores.insert(String::from("Alice"), 50);`и получите значение с помощью`.get("Alice").unwrap()`.

Решение доступно после 3 попыток

Упражнение 3. Удвоение значений в векторе

Упражнение#rust.m7.l1.e3
Попыток: 0Загрузка…

Определите функцию с именем double_values, которая принимает ссылку на срез целых чисел &[i32] и возвращает новый Vec<i32>, содержащий те же элементы, умноженные на 2.

Загрузка редактора…
Показать подсказку

Функция должна перебирать элементы среза и вставлять их, умноженные на 2, в новый возвращаемый вектор.

Решение доступно после 3 попыток