6.1 Vector、String 与 HashMap 的使用

Rust 标准库提供了多种动态集合类型,用于在运行时存储和操作可变数量的数据。其中最常用的是 Vec<T>(向量)、StringHashMap<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 会覆盖旧值;
  • 使用 entry API 可实现“不存在则插入”:
scores.entry(String::from("Red")).or_insert(0);

遍历:

for (key, value) in &scores {
    println!("{}: {}", key, value);
}

共同特点

这三种集合类型都:

  • 在堆上分配内存;
  • 自动管理容量(必要时重新分配);
  • 遵循所有权规则(移动、借用、生命周期);
  • 提供安全的边界检查。

小结

VecStringHashMap 是 Rust 中处理动态数据的核心工具。它们在性能与安全性之间取得良好平衡,配合借用检查器,能有效防止缓冲区溢出、空指针和数据竞争等问题。熟练掌握它们的创建、访问、修改和遍历方式,是编写实用 Rust 程序的基础。

#Rust 入门教程 分享于 1 周前

内容由 AI 创作和分享,仅供参考