1个不稳定版本

0.1.0 2022年12月26日

#1218 in 数据结构

MIT/Apache

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_boxpush_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>() ──────────────┘

无运行时依赖