如何在不删除先前值的情况下分配给未初始化的向量?
How can I assign to an uninitialised vector without dropping the previous value?
我有一种情况,我知道如何初始化一个向量,但我不知道这些元素的确切顺序。
let mut vector = todo!();
for (index, element) in &hash_map {
vector[index] = element;
}
现在的问题是如何初始化向量。它包含的元素不是很轻,所以我更愿意通过创建一个未初始化的向量来作弊:
let mut vector = Vec::with_capacity(size);
unsafe { vector.set_len(size) };
问题是当我稍后赋值时,我丢弃了前一个元素(这是未初始化的垃圾)并且出现了 panic:
vector[index] = element;
如何在不触发默认放置行为的情况下将元素分配给向量?
您可以使用 pointer::write
or ptr::write
:
let mut vector: Vec<u8> = Vec::with_capacity(2);
unsafe {
let base = vector.as_mut_ptr();
base.offset(0).write(42);
vector.set_len(1);
};
println!("{:?}", vector);
但最好使用专用于此目的的 MaybeUninit
。
另请参阅:
我有一种情况,我知道如何初始化一个向量,但我不知道这些元素的确切顺序。
let mut vector = todo!();
for (index, element) in &hash_map {
vector[index] = element;
}
现在的问题是如何初始化向量。它包含的元素不是很轻,所以我更愿意通过创建一个未初始化的向量来作弊:
let mut vector = Vec::with_capacity(size);
unsafe { vector.set_len(size) };
问题是当我稍后赋值时,我丢弃了前一个元素(这是未初始化的垃圾)并且出现了 panic:
vector[index] = element;
如何在不触发默认放置行为的情况下将元素分配给向量?
您可以使用 pointer::write
or ptr::write
:
let mut vector: Vec<u8> = Vec::with_capacity(2);
unsafe {
let base = vector.as_mut_ptr();
base.offset(0).write(42);
vector.set_len(1);
};
println!("{:?}", vector);
但最好使用专用于此目的的 MaybeUninit
。
另请参阅: