4 个版本 (2 个稳定版本)
1.0.1 | 2023年9月14日 |
---|---|
1.0.0 | 2023年9月13日 |
0.1.0 | 2023年9月1日 |
0.0.1 | 2023年8月30日 |
#200 在 数据结构
每月2,866次下载
用于 8 个crate(通过 hashx)
25KB
420 行
FixedCapacityVec
- 类似于 Vec
但在编译时固定容量
FixedCapacityVec
是一种简单的专用数据结构。一个用例是希望逐步构建一个非平凡固定大小表的程序。
与 std
类型之间的关系
以下所有类型仅在堆上存储实际的缓冲区,并且它们可以在不复制数据的情况下进行相互转换。
类型 | 大小和表示(例如在栈上) | 完整? | 可变性 |
---|---|---|---|
Vec |
3个单词:指针、长度、容量 | 也许 | 无限可追加 |
Box<[T]> |
2个单词:指针、长度 = 容量 | 总是 | 在运行时固定长度 |
FixedCapacityVec<T, N> |
2个单词:指针、长度 | 也许 | 可追加,但容量在编译时固定 |
Box<[T; N]> |
1个单词:指针 | 总是 | 长度在编译时固定 |
Vec<T> HEAP Box<[T]> HEAP
+----------+ +------------+ +----------+ +----------+
| pointer -----> | T | | pointer -----> | T |
| length | | T ... | | length | | T ... |
| capacity | +--length----+ +----------+ +--length--+
+----------+ | (spare) |
+--capacity--+
FixedCapacityVec<T, N> HEAP Box<[T; N]> HEAP
+----------+ +-------------+ +----------+ +---------+
| pointer -----> | T | | pointer -----> | T |
| length | | T ... | +----------+ | T ... |
+----------+ |--length-----| +--N------+
| (spare) |
+--N----------|
与其他crate的vec-like类型之间的关系
FixedCapacityVec
的用途与 ArrayVec
和 SmallVec
不同。
FixedCapacityVec
的数据始终位于堆上。
与 Vec
相比,FixedCapacityVec
的优点是它本身的大小很小,容量不需要表示或查找。它可以非常便宜地转换为boxed数组,或者转换为boxed切片或切片,而不需要复制。
ArrayVec
也是一个具有固定容量的类似 vec 的结构。但是 ArrayVec
的数据紧邻元数据。因此,要将完整的 ArrayVec
转换为封装数组,数据必须被复制。即使它是完整的 Box<ArrayVec<..>>
,至少,它的分配空间需要缩小。其中 ArrayVec
的一个使用案例是它能够增量构建(通常是短)数组而无需堆分配。
SmallVec
的好处是可以将少量数据存储在栈上,而不是说 SmallVec
本身特别小;事实上,ArrayVec
和 SmallVec
都足够存储 N
项 T
。
ArrayVec<T, N> SmallVec<[T; N]> SmallVec<[T; N]>
+-----------+ +--------------+ +---------------+ HEAP
| T | | length <= N | | capacity > N | +------------+
| T ... | +--0-----------+ | pointer ----------> | T |
+--length---+ | T | OR | length | | T ... |
| (uninit) | | T ... | +---------------+ +--length----+
+--N--------+ |--length------| | (unused) | | (uninit) |
| length | | (spare) | | | +--capacity--+
+-----------+ +--N-----------+ +---------------+