6.1 Vector、String 与 HashMap 的使用
听
Rust 标准库提供了多种动态集合类型,用于在运行时存储和操作可变数量的数据。其中最常用的是 Vec<T>(向量)、String 和 HashMap<K, V>。它们都基于所有权系统构建,在提供灵活性的同时保证内存安全。
Vec<T>:可变长数组
Vec<T> 是一个动态增长的数组,支持在堆上存储任意数量的同类型元素。
创建向量的常见方式:
let v: Vec<i32> = Vec::new(); // 空向量
let mut v2 = vec![1, 2, 3]; // 宏初始化
添加元素使用 push:
v2.push(4); // v2 现在是 [1, 2, 3, 4]
访问元素可通过索引(v[0])或 get 方法:
let third = &v2[2]; // 借用第三个元素
let third_safe = v2.get(2); // 返回 Option<&T>,避免 panic
索引访问越界会导致程序 panic,而 get 在越界时返回 None,更安全。
遍历向量使用 for 循环:
for i in &v2 {
println!("{}", i);
}
注意:遍历时默认借用元素;若需修改,可使用 for i in &mut v2 并对 i 解引用赋值。
String:UTF-8 字符串
Rust 中的 String 是堆分配的、可变的、UTF-8 编码的字符串类型,与字符串切片 &str 配合使用。
创建和修改:
let mut s = String::from("hello");
s.push_str(", world!"); // 追加字符串切片
s.push('!'); // 追加单个字符
拼接字符串:
let s1 = String::from("Hello");
let s2 = String::from("World");
let s3 = format!("{} {}", s1, s2); // 不获取所有权,仅借用
注意:+ 操作符会获取左侧字符串的所有权,通常推荐使用 format! 宏以获得更清晰的语义。
HashMap<K, V>:键值映射
HashMap 存储键值对,通过哈希表实现快速查找。
需要先引入:
use std::collections::HashMap;
创建和插入:
let mut scores = HashMap::new();
scores.insert(String::from("Blue"), 10);
scores.insert(String::from("Yellow"), 50);
访问值:
let team_name = String::from("Blue");
let score = scores.get(&team_name); // 返回 Option<&V>
更新策略灵活:
- 直接
insert会覆盖旧值; - 使用
entryAPI 可实现“不存在则插入”:
scores.entry(String::from("Red")).or_insert(0);
遍历:
for (key, value) in &scores {
println!("{}: {}", key, value);
}
共同特点
这三种集合类型都:
- 在堆上分配内存;
- 自动管理容量(必要时重新分配);
- 遵循所有权规则(移动、借用、生命周期);
- 提供安全的边界检查。
小结
Vec、String 和 HashMap 是 Rust 中处理动态数据的核心工具。它们在性能与安全性之间取得良好平衡,配合借用检查器,能有效防止缓冲区溢出、空指针和数据竞争等问题。熟练掌握它们的创建、访问、修改和遍历方式,是编写实用 Rust 程序的基础。
#Rust 入门教程
分享于 1 周前
上一篇:第六章:集合类型与泛型
下一篇:6.2 泛型语法与泛型函数/结构体