#slice #chunk #vector

sliced

用于迭代切片的段向量

6 个版本

0.3.3 2023 年 6 月 12 日
0.3.2 2023 年 6 月 10 日
0.2.7 2023 年 6 月 2 日

1729数据结构

MIT 许可证

270KB
728

sliced

sliced 库是一个围绕 Vec 的薄包装器,它返回内部存储的切片而不是单个元素。在需要存储和重复操作大量相对较短的数据序列,且运行时确定序列长度而不是编译时的情况下,它非常有用。使用 Vec<Vec<T>> 意味着每次插入和删除都会为内部 Vec 分配和释放堆存储,而 sliced 存储将使用单个可增长缓冲区。

对于可变长度的切片,VarSlicedVec 使用压缩稀疏布局将序列存储在一个单独的 Vec 中,并使用它们的范围。

use sliced::*;
let mut vv = VarSlicedVec::new();
vv.push(&[1, 2, 3]);
vv.push(&[4, 5]);
vv.push(&[6]);
assert_eq!(vv.remove(1), [4, 5]);
assert_eq!(vv.pop(), Some(vec![6]));
assert_eq!(vv[0], [1, 2, 3]);

对于在运行时设置等长字符串,SlicedVec 允许在不进行额外分配的情况下以常数时间插入和删除,前提是有足够的额外存储容量。

use sliced::*;
let mut sv = SlicedVec::new(3);
sv.push(&[1, 2, 3]);
sv.push(&[4, 5, 6]);
sv.push(&[7, 8, 9]);
assert_eq!(sv.swap_remove(1), [4, 5, 6]);
assert_eq!(sv.pop(), Some(vec![7, 8, 9]));
assert_eq!(sv[0], [1, 2, 3]);

还提供了 SlicedSlab 以使用键访问段。

use sliced::*;
let mut ss = SlicedSlab::from_vec(3, (1..=9).collect());
assert_eq!(ss.get_keys(), vec![0, 1, 2]);
assert_eq!(ss[1], [4, 5, 6]);
ss.release(1);
assert_eq!(ss.insert(&[6, 5, 4]), 1);
assert_eq!(ss[1], [6, 5, 4]);

许可证:MIT

无运行时依赖