我需要初始化一个向量以用作缓冲区。在将内容放入其中之前,我不关心它包含什么值,因此我不希望程序浪费时间用零填充它。我知道with_capacity,但它需要我push()元素,这很不方便,因为我需要不断检查我之前是否已将某些内容推送到索引。
基本上,我正在寻找与此 C++ 数组等效的数组:
int* arr = new int[size];
arr[2]; // random garbage
Run Code Online (Sandbox Code Playgroud)
如果出于性能原因无法填充向量(但请进行基准测试!),则需要使用不安全的代码。例如,您可以使用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)
游乐场。