【问题标题】:How can I assign to an uninitialised vector without dropping the previous value?如何在不删除先前值的情况下分配给未初始化的向量?
【发布时间】:2021-05-20 17:10:32
【问题描述】:

我有一种情况,我知道如何初始化一个向量,但我不知道这些元素的确切顺序。

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) };

问题是当我稍后分配值时,我丢弃了前一个元素(这是未初始化的垃圾)并恐慌:

vector[index] = element;

如何在不触发默认放置行为的情况下将元素分配给向量?

【问题讨论】:

    标签: vector rust buffer unsafe raw


    【解决方案1】:

    您可以使用pointer::writeptr::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

    另见:

    【讨论】:

    猜你喜欢
    • 2019-01-28
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多