9 个不稳定版本 (3 个破坏性更新)
0.4.0 | 2022 年 3 月 9 日 |
---|---|
0.3.4 | 2022 年 1 月 11 日 |
0.2.1 | 2022 年 1 月 10 日 |
0.1.4 | 2021 年 11 月 10 日 |
0.1.0 |
|
#225 in 内存管理
每月 43 次下载
用于 2 crates
145KB
2.5K SLoC
generic-vec
可以存储任何位置的向量:在切片、数组或堆中!
GenericVec
与 Vec
完全相同,甚至提供一些仅在 std
的 nightly
中存在的功能(如 GenericVec::drain_filter
),或更宽容的接口,如 GenericVec::retain
。实际上,你可以轻松地将 Vec
转换为 HeapVec
并返回!
此crate与 no_std
兼容,只需关闭所有默认功能。
功能
std
(默认)- 启用您使用分配器,alloc
- 启用您使用分配器,用于堆分配存储(如Vec
)nightly
- 启用您使用基于数组([T; N]
)的存储
基本用法
SliceVec
SliceVec
存储一个未初始化的切片缓冲区,并且它们将所有值存储在该缓冲区中。
use cl_generic_vec::SliceVec;
let mut uninit_buffer = uninit_array::<_, 16>();
let mut slice_vec = SliceVec::new(&mut uninit_buffer);
assert!(slice_vec.is_empty());
slice_vec.push(10);
assert_eq!(slice_vec, [10]);
ArrayVec
ArrayVec
与切片版本类似,但由于它们拥有自己的数据,因此可以自由移动,不受约束。您还可以创建一个新的 ArrayVec
而无需传递现有缓冲区,这与切片版本不同。
use cl_generic_vec::ArrayVec;
let mut array_vec = ArrayVec::<i32, 16>::new();
array_vec.push(10);
array_vec.push(20);
array_vec.push(30);
assert_eq!(array_vec, [10, 20, 30]);
alloc
HeapVec
只是 Vec
,但建立在 GenericVec
之上,这意味着您可以免费获得 GenericVec
的所有功能!但此要求启用 alloc
或 std
功能。
use cl_generic_vec::{HeapVec, gvec};
let mut vec: HeapVec<u32> = gvec![1, 2, 3, 4];
assert_eq!(vec.capacity(), 4);
vec.extend(&[5, 6, 7, 8]);
assert_eq!(vec, [1, 2, 3, 4, 5, 6, 7, 8]);
vec.try_push(5).expect_err("Tried to push past capacity!");
nightly
在 nightly
- 启用了许多优化
- 一些诊断变得更好
关于文档的说明:如果功能存在于 Vec
中,则文档要么与 Vec
完全相同,要么稍作修改以更好地适应 GenericVec
关于实现的说明:实现的大部分内容直接来自 Vec
,所以感谢您提供的惊人的参考 std
!
当前版本:0.1.2
许可证:MIT/Apache-2.0