#array #radix #vec #array-vec #compact #bit-pack

无std nanovec

将小整数数组打包在一个或两个整数中

2个版本

0.2.1 2022年9月20日
0.2.0 2022年9月16日
0.1.1 2022年9月15日
0.1.0 2022年9月15日

#2118 in 数据结构


3 个crate中使用

MIT 许可证

72KB
1K SLoC

nanovec: 将数组及其相关类型打包在一个或两个整数中。

Crates.io docs.rs

是否曾经需要存储几个小整数,但发现 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 的幂小得多)塞入更多元素时,位打包是首选方法。

适配器

在固定长度打包数组的基础上,以下可变长度数据结构被提供

  • NanoDeque 实现了一个双端队列,作为 NanoArray + 长度。这是最通用的,因为它支持两端推送/弹出,以及在任何索引处获取/设置。唯一的缺点是需要额外的空间和填充来存储长度。

  • NanoStack 实现了一个由 NanoArray 支持的零终止栈,但其元素必须非零(例如,考虑以 '\0' 结尾的 C 风格字符串)。这支持在一端推送/弹出,以及在任意索引处获取。

依赖关系

~180KB