3 个版本
0.0.2-alpha.11 | 2024 年 6 月 10 日 |
---|---|
0.0.2-alpha.10 | 2023 年 12 月 20 日 |
0.0.2-alpha.9 | 2023 年 11 月 24 日 |
0.0.2-alpha.7 |
|
0.0.2-alpha.4 |
|
在 数据结构 中排名第 331
每月下载量 1,215
235KB
4K SLoC
unsized-vec
告别 Vec<Box<dyn Any>>
!减少堆分配。 UnsizedVec<T>
类似于 Vec<T>
,但 T
可以是 ?Sized
。
特性
- 熟悉的
Vec
API。 - 主要操作(索引、推送、弹出、插入、删除)与
alloc::vec::Vec
相同的时间复杂度。- 当
T
的对齐方式在编译时未知(例如,T
是一个 trait 对象)时,此规则有一个例外,请在 crate 文档中查阅。
- 当
- 对于
T: Sized
,UnsizedVec<T>
编译为一个围绕alloc::vec::Vec
的新类型,并且可以轻松地转换为它。 - 对于无尺寸的
T
,有两个堆分配:一个用于元素,一个用于指针元数据。 #[no_std]
(但需要alloc
)。
缺点
T
的不可变。- 实验性的,仅在 nightly 中可用。
示例
#![feature(unsized_fn_params)]
use core::fmt::Debug;
use emplacable::box_new_with;
use unsized_vec::{unsize_vec, UnsizedVec};
fn main() {
let mut vec: UnsizedVec<dyn Debug> = unsize_vec![27.53_f32, "oh the places we'll go", Some(())];
for traitobj in &vec {
dbg!(traitobj);
};
assert_eq!(vec.len(), 3);
let maybe_popped: Option<Box<dyn Debug>> = vec.pop_into().map(box_new_with);
let popped = maybe_popped.unwrap();
dbg!(&*popped);
assert_eq!(vec.len(), 2);
}
许可证
unsized-vec
根据 MIT 许可证和 Apache 许可证(版本 2.0)的条款分发。
请参阅LICENSE-APACHE和LICENSE-MIT获取详细信息。
依赖项
~170KB