6 个版本
0.3.3 | 2023 年 6 月 12 日 |
---|---|
0.3.2 | 2023 年 6 月 10 日 |
0.2.7 | 2023 年 6 月 2 日 |
1729 在 数据结构 中
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