2个版本
0.2.1 | 2022年9月20日 |
---|---|
0.2.0 | 2022年9月16日 |
0.1.1 |
|
0.1.0 |
|
#2118 in 数据结构
在 3 个crate中使用
72KB
1K SLoC
nanovec
: 将数组及其相关类型打包在一个或两个整数中。
是否曾经需要存储几个小整数,但发现 Vec
(甚至 tinyvec)所占用的空间比你想要的更多?
nanovec
提供了固定和可变长度的整数数组,范围有限,全部打包在一个或两个机器字中,您可以轻松携带。
此crate
- 是
no_std
。 - 灵感来源于 tinyvec,包括名称。
- 具有最小的依赖。
提供类型速查表
NanoArray (trait) |
NanoDeque (适配器) |
NanoStack (适配器) |
---|---|---|
NanoArrayBit (实现) |
NanoDequeBit (别名) |
NanoStackBit (别名) |
NanoArrayRadix (实现) |
NanoDequeRadix (别名) |
NanoStackRadix (别名) |
打包数组
提供两种节省空间的策略:位打包和基数打包。两者都支持由 NanoArray
trait 定义的相同集合的操作。
一个宽无符号整数(例如 u64
)可以被当作更窄整数的数组(例如 16 个 4 位或 5 个 12 位)。给定打包整数类型(n
位)和每个元素的位宽(k
位),容量可以通过以下公式确定:floor(n / k)
。这通过 NanoArrayBit
实现。
将位打包方法推广,一个基数为 r
的整数可以被当作范围在 0..r
之间的整数的数组。一个很好的例子是十进制(基数为 10)数字——12345678
可以被当作一个数组 [8, 7, 6, 5, 4, 3, 2, 1]
(最低有效位在前)。这通过 NanoArrayRadix
实现。
位打包通常比基数打包性能更好,因为位操作比乘除模操作便宜。因此,除非你需要在大元素范围不便于位打包时(即当 r
只比 2 的幂大一点,但比下一个 2 的幂小得多)塞入更多元素时,位打包是首选方法。
适配器
在固定长度打包数组的基础上,以下可变长度数据结构被提供
依赖关系
~180KB