Перейти до основного вмісту
Модуль 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 (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 для зберігання ключів String і значень i32. Вставте оцінку 50 для користувача «Аліса». Безпечно витягніть рахунок за допомогою методу get і unwrap(), щоб надрукувати його.

Завантаження редактора…
Показати підказку

Не забудьте `використовувати 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 спроб