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ớ:
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).
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
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!.
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
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ó.
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
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.
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ử