1个不稳定版本
0.1.0 | 2022年12月26日 |
---|
#1218 in 数据结构
54KB
1K SLoC
Vec<T: ?Sized>
一个动态长度的无尺寸元素集合,类似于 std::vec::Vec
。
查看crate级别的文档以获取更多信息。
lib.rs
:
Vec<T: ?Sized>
DynVec
,一个动态长度的无尺寸元素集合,类似于 std::vec::Vec
。
示例
您可以使用 DynVec::new
创建一个向量
let vec: DynVec<dyn Debug> = DynVec::new();
或使用 dyn_vec!
宏
let vec: DynVec<i32> = dyn_vec![1, 2, 3];
// check the docs for `dyn_vec!` for more info on this syntax
let vec_boxed: DynVec<dyn Debug> = dyn_vec![box:
Box::new(1) as _,
Box::new("foo") as _,
Box::new(true) as _
];
let vec_unsized: DynVec<dyn Debug> = dyn_vec![unsized: 1, "foo", true];
let vec_from_elem: DynVec<i32> = dyn_vec![3; 5];
可以使用 DynVec::push
向向量中添加元素
let mut vec: DynVec<i32> = dyn_vec![];
vec.push(1);
vec.push(2);
vec.push(3);
...以及使用 push_box
和 push_unsize
(push_unsize_stable
不带 "unstable"
特性)
let mut vec: DynVec<dyn Debug> = dyn_vec![];
vec.push_box(Box::new(1));
vec.push_box(Box::new("foo"));
vec.push_box(Box::new(true));
// these closures are only needed for the `_stable` versions
vec.push_unsize_stable(2, |v| v as _);
vec.push_unsize_stable("bar", |v| v as _);
vec.push_unsize_stable(false, |v| v as _);
最后,一个向量可以转换成另一个向量(稳定版上的 unsize_stable
)
let vec: DynVec<i32> = dyn_vec![1, 2, 3];
// vec.push_unsize_stable("foo", |v| v as _); // not yet...
let mut vec: DynVec<dyn Debug> = vec.unsize_stable(|v| v as _);
vec.push_unsize_stable("foo", |v| v as _); // now we can!
要使用 _stable
变体,通常可以添加参数 |v| v as _
。
稳定性
此crate当前是稳定的,但缺少一些功能。要启用这些功能,请使用"unstable"
crate功能,它依赖于以下nightly功能
并启用以下功能
此外,"unstable"
功能还启用以下nightly功能,以符合严格的来源
数据布局
DynVec<T>
┌────┬────┬────┬────┐
│ptr │len │cap │end │
└─┬──┴────┴─┬──┴─┬──┘
│ │ │
│ └────┼───────────────────────────────────────────────┐
┌─┘ └───────────────────┐ │
│ │ │
▼ ▼ ▼
┌────┬────┬─────┬──────────┬───┬─────┬───────────────┬───┬───┬───┐
│pad │elem│pad │elem │pad│elem │ │ptr│ptr│ptr│
└────┴────┴─────┴──────────┴───┴─────┴───────────────┴─┬─┴─┬─┴─┬─┘
▲ ▲ ▲ ▲ │ │ │ ▲
│ │ │ └───────────────────────┘ │ │ │
│ │ └──────────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────── aligned to align_of::<*const T>() ──────────────┘