楼层: 首页/ 软件技术/ Rust 语言基础/ 集合:Vec、String、HashMap
10

集合:Vec、String、HashMap

Collections · Vec · String · HashMap

数组长度固定,变长数据靠标准库集合。最常用三个:Vec<T>(动态数组)、String(可变字符串)、HashMap<K,V>(哈希表)。

Vec<T>:动态数组

fn main() { let mut v: Vec<i32> = Vec::new(); v.push(1); v.push(2); v.push(3); // vec! 宏更常用 let mut v2 = vec![10, 20, 30]; // get 不会 panic,越界返回 None println!("v[1]={:?}, 越界={:?}", v.get(1), v.get(99)); let last = v2.pop(); // 弹出末尾 v2.sort(); println!("弹出 {:?}, 排序后 {:?}", last, v2); }
$ cargo run v[1]=Some(2), 越界=None 弹出 Some(30), 排序后 [10, 20]

其他常用:with_capacity(n) 预分配、retain(|x| ...) 保留满足条件的、dedup() 去重相邻重复、iter()/iter_mut()/into_iter() 三种遍历。

String:UTF-8 可变字符串

fn main() { let mut s = String::new(); s.push_str("你好"); s.push('!' ); let s2 = format!("{} {}", s, "世界"); // 拼字符串 // 遍历:chars() 是字符,bytes() 是字节 for c in s2.chars() { print!("[{}]", c); } println!(); println!("{} 共 {} 字符", s2, s2.chars().count()); }
$ cargo run [你][好][!][ ][世][界] 你好! 世界 共 6 字符
String vs &str:函数参数别用错

String 拥有堆数据、可变;&str 是借用的字符串切片。写函数参数时优先用 &str——它既能接 String 的引用,也能接字面量,最通用。别一上来就 String 参数,白白多拷贝。

HashMap<K, V>:哈希表

use std::collections::HashMap; fn main() { let mut scores = HashMap::new(); scores.insert(String::from("张三"), 90); scores.insert(String::from("李四"), 85); // get 返回 Option println!("张三 {:?}", scores.get("张三")); // entry API:没有就插入,有就不动(避免两次查找) scores.entry(String::from("王五")).or_insert(100); // 遍历 for (name, score) in &scores { println!("{} = {}", name, score); } }
$ cargo run 张三 Some(90) 张三 = 90 李四 = 85 王五 = 100
标准库其他集合速查
集合用途
VecDeque双端队列,头尾都能高效增删
LinkedList链表,实际很少用
HashSet / BTreeSet去重集合(前者无序、后者有序)
BTreeMap按键排序的 Map,要有序遍历用它
BinaryHeap最大堆,优先队列