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 2022 年 3 月 9 日

#225 in 内存管理

每月 43 次下载
用于 2 crates

MIT/Apache

145KB
2.5K SLoC

Crates.io Docs.rs Workflow Status Maintenance

generic-vec

可以存储任何位置的向量:在切片、数组或堆中!

GenericVecVec 完全相同,甚至提供一些仅在 stdnightly 中存在的功能(如 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 的所有功能!但此要求启用 allocstd 功能。

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

无运行时依赖