跳转到主要内容
模块 7 · 第 1 课(共 2)课程中的13/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 类型的值的映射。它通过哈希函数进行操作,该函数确定如何将这些键和值放置在内存中。当您不想通过数字索引而是通过键(例如名称或 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."),
    }
}

自己尝试一下

练习 1:Vec 的基本运算

锻炼#rust.m7.l1.e1
尝试:0加载中...

使用 Vec::new() 声明一个名为 v 的可变整数向量。使用push方法依次添加元素10、20、30。最后,使用 println! 打印向量的第一个元素(索引 0)。

正在加载编辑器...
显示提示

使用 let mut v = Vec::new(); 初始化向量,使用 v.push(value) 插入元素并使用 v[0] 访问。

3 次尝试后可用的解决方案

练习 2:使用 HashMap 进行用户评分

锻炼#rust.m7.l1.e2
尝试:0加载中...

导入 std::collections::HashMap。在main函数中,声明一个名为scores的可变HashMap来存储String键和i32值。为用户“Alice”插入 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] 的引用,并返回一个包含相同元素乘以 2 的新 Vec<i32>。

正在加载编辑器...
显示提示

该函数应该迭代切片的元素,并将它们乘以 2 插入到要返回的新向量中。

3 次尝试后可用的解决方案