Chuyển đến nội dung chính
Mô-đun 7 · Bài học 1 trong tổng số 213/14 trong khóa học~12 min
Bài học theo mô-đun (1/2)

Bộ sưu tập và HashMap

Bộ sưu tập là cấu trúc dữ liệu có khả năng chứa nhiều giá trị. Không giống như các kiểu mảng và bộ dữ liệu nguyên thủy, dữ liệu mà các bộ sưu tập này tham chiếu được lưu trữ trên heap, có nghĩa là không cần biết lượng dữ liệu tại thời điểm biên dịch và có thể tăng hoặc thu nhỏ linh hoạt trong quá trình thực thi chương trình.

Hai bộ sưu tập được sử dụng phổ biến nhất trong Rust là vectơ (Vec<T>) và bản đồ khóa-giá trị (HashMap<K, V>).


Vectơ (Vec<T>)

Các vectơ cho phép bạn lưu trữ nhiều giá trị cùng loại trong một cấu trúc dữ liệu duy nhất đặt tất cả các giá trị cạnh nhau trong bộ nhớ:

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>)

Bộ sưu tập HashMap<K, V> lưu trữ ánh xạ các khóa thuộc loại K với các giá trị thuộc loại V. Nó hoạt động thông qua chức năng băm, xác định cách đặt các khóa và giá trị này trong bộ nhớ. Nó cực kỳ hữu ích khi bạn muốn tra cứu dữ liệu không phải bằng chỉ mục số mà bằng khóa (chẳng hạn như tên hoặc ID).

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."),
    }
}

Hãy tự mình thử

Bài 1: Các thao tác cơ bản trên Vec

tập thể dục#rust.m7.l1.e1
Nỗ lực: 0Đang tải…

Khai báo một vectơ số nguyên có thể thay đổi có tên v bằng cách sử dụng Vec::new(). Thêm các phần tử 10, 20 và 30 theo thứ tự bằng phương pháp đẩy. Cuối cùng, in phần tử đầu tiên của vectơ (chỉ số 0) bằng println!.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Sử dụng `let mut v = Vec::new();` để khởi tạo vectơ, chèn các phần tử bằng `v.push(value)` và truy cập bằng `v[0]`.

Giải pháp khả dụng sau 3 lần thử

Bài tập 2: Điểm người dùng với HashMap

tập thể dục#rust.m7.l1.e2
Nỗ lực: 0Đang tải…

Nhập std::collections::HashMap. Trong hàm chính, khai báo các điểm có tên HashMap có thể thay đổi để lưu trữ các khóa Chuỗi và giá trị i32. Chèn số điểm 50 cho người dùng 'Alice'. Trích xuất điểm một cách an toàn bằng phương thức get và unwrap() để in nó.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Đừng quên `use std::collections::HashMap;`. Chèn bằng `scores.insert(String::from("Alice"), 50);`và tìm nạp giá trị bằng`.get("Alice").unwrap()`.

Giải pháp khả dụng sau 3 lần thử

Bài tập 3: Nhân đôi giá trị của một Vector

tập thể dục#rust.m7.l1.e3
Nỗ lực: 0Đang tải…

Xác định hàm có tên double_values ​​chấp nhận tham chiếu đến một lát số nguyên &[i32] và trả về một Vec<i32> mới chứa các phần tử giống nhau nhân với 2.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Hàm sẽ lặp lại các phần tử của lát cắt và chèn chúng nhân với 2 vào vectơ mới sẽ được trả về.

Giải pháp khả dụng sau 3 lần thử