当前位置: 首页 > news >正文

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()按排序迭代出元素迭代器
http://www.dtcms.com/a/617816.html

相关文章:

  • Git 配置实践
  • 学习笔记十:多分类学习
  • 【实战案例】基于dino-4scale_r50_8xb2-36e_coco的棉田叶片病害识别与分类项目详解
  • opencv学习笔记9:基于CNN的mnist分类任务
  • 分布式系统中MPSC队列的内存回收策略适配避坑
  • Git笔记---分支相关操作
  • 基于YOLOv8的汽车目标检测系统实现与优化_含多种车型识别与自动驾驶应用场景
  • 广东省建设工程协会网站如何查看一个网站是不是用h5做的
  • 开发STM32日记1:安装软件、配置软件(芯片为STM32F103C8T6 )
  • 【Git】处理报错原因
  • 基于Bboss框架的ElasticSearch并发更新版本冲突问题解决
  • Highcharts常见问题解析(5):如何将多个图表导出到同一张图片或 PDF?
  • 什么是中间件?必须要有中间件吗?有哪些国产中间件厂商?
  • 第七章深度解析:从零构建智能体框架——模块化设计与全流程落地指南
  • 机器视觉3D无序抓取如何确保抓取精度,需要从以下五个核心方面入手,形成一个闭环的控制系统
  • Git Bisect - Git Commit 故障排查利器使用详解
  • 青岛科技街网站建设不懂外贸做外贸网站好做吗
  • 2511C++,CTAD简化回调
  • 【ros2】ROS2 C++参数设置指南(含跨节点修改方法)
  • STM32通信接口----USART
  • 解决Web游戏Canvas内容在服务器部署时的显示问题
  • 我爱学算法之—— 哈希
  • Linux字符设备驱动模型
  • C++ List 容器详解:迭代器失效、排序与高效操作
  • 婚纱网站wordpress微商模板
  • GPT问答:泛型、哈希表与缓存、命名参数。251116
  • 免费学软件的自学网站保健品网站建设流程
  • 网络访问流程:HTTPS + TCP + IP
  • 智能体AI、技术浪潮与冲浪哲学
  • 基于 PyTorch + BERT 意图识别与模型微调