Rust中的集合Collection

集合(Collections)是存储多个值的数据结构,主要存放在标准库std::collections模块中。集合的大小可以动态变化,且数据通常存储在堆上。

Rust标准库中主要集合类型有:

类型名称说明
Vec<T>动态数组元素有序、可变长、随机访问高效
VecDeque<T>双端队列支持两端高效插入/删除
LinkedList<T>双向链表插入删除快,随机访问慢
HashMap<K,V>哈希表基于哈希的键值存储,无序
BTreeMap<K,V>平衡树映射基于排序的键值存储,有序
HashSet<T>哈希集合不重复元素,无序
BTreeSet<T>有序集合不重复元素,有序
BinaryHeap<T>堆结构可用于优先队列(最大堆)

动态数组Vec

Vec<T>是 Rust 中最常用的集合,本质是动态数组,支持在末尾高效插入 / 删除元素,且可通过索引随机访问。

创建方式:

let v1 = Vec::new(); // 空 vector
let v2 = vec![1, 2, 3]; // 宏创建
let mut v3 = Vec::with_capacity(10); // 预分配容量

常用方法:

方法说明返回值
new()创建空向量Vec<T>
with_capacity(n)预分配容量Vec<T>
push(value)末尾添加元素()
pop()移除最后一个元素Option<T>
insert(index, value)在指定位置插入()
remove(index)移除指定位置T
clear()清空所有元素()
len()返回长度usize
capacity()返回容量usize
reserve(n)扩容()
shrink_to_fit()收缩容量()
get(i)安全访问元素Option<&T>
get_mut(i)可变访问元素Option<&mut T>
first() / last()获取首/尾元素Option<&T>
iter() / iter_mut()遍历元素迭代器
sort() / sort_by()排序()

双端队列VecDeque

VecDeque<T>(Double-ended Queue)是双端队列,底层使用环形缓冲区实现。支持在首尾两端高效插入 / 删除元素,内部基于环形缓冲区实现。

use std::collections::VecDeque;
let mut deque = VecDeque::new();
deque.push_back(2);
deque.push_front(1);
deque.pop_front(); // 移除首元素

常用方法:

方法说明返回值
new()创建空队列VecDeque<T>
with_capacity(n)预分配容量VecDeque<T>
push_back(value)末尾入队()
push_front(value)头部入队()
pop_back()从尾部出队Option<T>
pop_front()从头部出队Option<T>
front() / back()查看首尾元素Option<&T>
len() / is_empty()长度/是否空usize / bool
get(i)安全索引访问Option<&T>
iter() / iter_mut()遍历迭代器
rotate_left(k) / rotate_right(k)循环旋转()

双向链表LinkedList

LinkedList<T>是双向链表,元素通过指针连接,不连续存储。

  • 实际性能较差:因元素不连续,缓存友好性低,随机访问效率低(O (n))。
  • 极少使用(除非明确需要链表的理论特性,否则优先用VecVecDeque)。
use std::collections::LinkedList;

let mut list = LinkedList::new();
list.push_back(1);     // 尾部添加:[1]
list.push_front(0);    // 头部添加:[0, 1]
list.pop_back();       // 尾部移除:返回Some(1)
list.pop_front();      // 头部移除:返回Some(0)

常用方法:

方法说明返回值
new()创建空链表LinkedList<T>
push_back(value)尾部插入()
push_front(value)头部插入()
pop_back() / pop_front()移除首/尾Option<T>
front() / back()获取首尾引用Option<&T>
len() / is_empty()获取长度 / 是否为空usize / bool
clear()清空链表()
append(&mut other)拼接另一个链表()
iter() / iter_mut()遍历迭代器

哈希表HashMap<K,V>

HashMap<K, V>基于哈希表实现,通过哈希函数将键映射到存储位置,查询和插入的平均时间复杂度为 O (1):

  • 无序存储(键的顺序不固定)。
  • K需实现HashEq trait(用于哈希计算和相等性比较)。
  • 性能依赖哈希函数的质量(避免哈希冲突)。
use std::collections::HashMap;

// 1. 基本创建
let mut scores = HashMap::new();
scores.insert(String::from("Alice"), 90);
scores.insert(String::from("Bob"), 85);

// 2. 从迭代器创建
let teams = vec![String::from("Blue"), String::from("Red")];
let initial_scores = vec![10, 50];
let scores: HashMap<_, _> = teams.into_iter().zip(initial_scores.into_iter()).collect();

常用方法:

方法说明返回值
new()创建空映射HashMap<K,V>
with_capacity(n)预分配容量HashMap<K,V>
insert(key, val)插入或更新键值Option<V>(旧值)
remove(key)删除键Option<V>
get(key)获取值引用Option<&V>
get_mut(key)可变引用Option<&mut V>
contains_key(key)是否存在bool
entry(key)获取或创建 entryEntry<K,V>
len() / is_empty()长度 / 是否空usize / bool
keys() / values()
/ iter()
迭代键、值、键值对迭代器
clear()清空()

有序映射BTreeMap<K,V>

BTreeMap<K, V>基于 B 树实现,键值对按键的排序顺序存储,查询时间复杂度为 O (log n)。

  • 键值对按键的自然顺序(或自定义排序)有序存储。
  • K需实现Ord trait(用于排序)。
  • 支持范围查询(如获取 “大于 x 且小于 y” 的键值对)。
use std::collections::BTreeMap;

let mut map = BTreeMap::new();
map.insert(3, "c");
map.insert(1, "a");
map.insert(2, "b");

// 遍历:按键的升序输出 (1,"a"), (2,"b"), (3,"c")
for (k, v) in &map {
    println!("{}: {}", k, v);
}

// 范围查询:获取键 >1 且 <=3 的键值对
let range = map.range(1..=3);  // 包含1和3

常用方法:

方法说明返回值
new()创建空映射BTreeMap<K,V>
insert(key, val)插入或替换Option<V>
remove(key)删除键Option<V>
get(key)获取引用Option<&V>
contains_key(key)检查存在bool
len() / is_empty()长度 / 空usize / bool
iter()遍历有序键值迭代器
range(range)范围遍历迭代器
first_key_value()
/ last_key_value()
最小/最大键Option<(&K,&V)>
clear()清空()

哈希集合HashSet

HashSet<T>基于HashMap<T, ()>实现,存储唯一元素,无序。

  • 元素唯一(插入重复元素会被忽略)。
  • 元素T需实现HashEq trait。
  • 插入、查询、删除的平均时间复杂度为 O (1)。
use std::collections::HashSet;

let mut set = HashSet::new();
set.insert(1);
set.insert(2);
set.insert(1);  // 重复元素,插入失败

// 常用方法
let has_one = set.contains(&1);  // true
let removed = set.remove(&1);    // true,移除1
let len = set.len();             // 1(剩余元素2)

常用方法:

方法说明返回值
new()创建空集合HashSet<T>
insert(value)插入bool(是否新插入)
remove(value)删除bool
contains(value)是否存在bool
len() / is_empty()长度 / 空usize / bool
clear()清空()
iter()遍历迭代器
union(&other)并集迭代器
intersection(&other)交集迭代器
difference(&other)差集迭代器
symmetric_difference(&other)对称差迭代器

有序集合BTreeSet

BTreeSet<T>基于BTreeMap<T, ()>实现,存储唯一元素,且按元素顺序排序。

  • 元素唯一且有序(按Ord trait 排序)。
  • 元素T需实现Ord trait。
  • 支持范围查询,查询时间复杂度为 O (log n)。
use std::collections::BTreeSet;

let mut set = BTreeSet::new();
set.insert(3);
set.insert(1);
set.insert(2);

// 遍历:按顺序输出 1, 2, 3
for num in &set {
    println!("{}", num);
}

// 范围查询:获取 >1 且 <=3 的元素
let range = set.range(1..=3);  // 包含1和3

常用方法:

方法说明返回值
new()创建空集合BTreeSet<T>
insert(value)插入bool
remove(value)删除bool
contains(value)是否存在bool
len() / is_empty()长度 / 空usize / bool
iter()遍历有序元素迭代器
range(range)范围遍历迭代器
first() / last()最小 / 最大元素Option<&T>
union(&other)
/ intersection(&other)
集合操作迭代器

二叉堆BinaryHeap

实现优先队列功能 :

  • 默认是 最大堆;
  • 可通过 Reverse() 包装改为最小堆。
use std::cmp::Reverse;
let mut min_heap = BinaryHeap::new();
min_heap.push(Reverse(10));
min_heap.push(Reverse(5));

println!("{}", min_heap.pop().unwrap().0); // 5

常用方法:

方法说明返回值
new()创建空堆BinaryHeap<T>
from(vec)从 Vec 构建堆BinaryHeap<T>
push(value)插入元素()
pop()弹出最大元素Option<T>
peek()查看最大元素Option<&T>
len() / is_empty()长度 / 空usize / bool
clear()清空()
into_sorted_vec()升序取出所有元素Vec<T>
drain_sorted()按排序迭代出元素迭代器
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值