创建一个大小为 n 的空向量,并且不填充任何内容

spl*_*eez 5 rust

我需要初始化一个向量以用作缓冲区。在将内容放入其中之前,我不关心它包含什么值,因此我不希望程序浪费时间用零填充它。我知道with_capacity,但它需要我push()元素,这很不方便,因为我需要不断检查我之前是否已将某些内容推送到索引。

基本上,我正在寻找与此 C++ 数组等效的数组:

int* arr = new int[size];
arr[2]; // random garbage
Run Code Online (Sandbox Code Playgroud)

Cha*_*man 7

如果出于性能原因无法填充向量(但请进行基准测试!),则需要使用不安全的代码。例如,您可以使用Vec::spare_capacity_mut()(或 nightly Vec::split_at_spare_mut())来访问元素,然后Vec::set_len(). 例如:

let mut v = Vec::with_capacity(N);
for (i, item) in v.spare_capacity_mut().iter_mut().enumerate() {
    item.write(i);
}
// SAFETY: All elements were initialized.
unsafe {
    v.set_len(N);
}
Run Code Online (Sandbox Code Playgroud)

游乐场

或者您可以手动管理指针as_mut_ptr()(不太推荐,但如果某些元素已经初始化可能会更好):

let mut v = Vec::<i32>::with_capacity(N);
// SFAETY: There are enough elements (even if uninitialized).
let all_elements = unsafe {
    std::slice::from_raw_parts_mut(v.as_mut_ptr().cast::<std::mem::MaybeUninit<_>>(), N)
};
for (i, item) in all_elements.iter_mut().enumerate() {
    item.write(i);
}
// SAFETY: All elements were initialized.
unsafe {
    v.set_len(N);
}
Run Code Online (Sandbox Code Playgroud)

游乐场