将Vec <[f64; 1]>转换为Vec <f64>

时间:2020-05-07 14:49:49

标签: rust

我是生锈的新手,并且正在玩。当我学习一些教程时,我发现了一个类型为[[f64,1]>的向量。我认为将其转换为[f64]应该很简单,但是除了for循环外找不到其他简单的方法。还有其他方法吗?

let y: Vec<[f64;1]> = [[1],[2],[3],[4]];
let mut y2: Vec<f64> = Vec::new();
    for each in &y {
        y2.push(each[0]);
}

2 个答案:

答案 0 :(得分:2)

您示例中的

y不是Vec;您可能忘记了vec!在前面。 此外,浮点数应为1.0而不是1

我不知道为什么您不容易找到此for循环,但是如果您需要其他方式:

使用迭代器模式

let y: Vec<[f64; 1]> = vec![[1.0], [2.0], [3.0], [4.0]];
let y2: Vec<f64> = y.iter().map(|&[f]| f).collect();

使用不安全的

由于[f64; 1]f64的大小相等(均为8个字节), 我们可以直接转换Vec

let y: Vec<[f64; 1]> = vec![[1.0], [2.0], [3.0], [4.0]];
let y2 = unsafe {
    // Ensure the original vector is not dropped.
    let mut y = std::mem::ManuallyDrop::new(y);
    Vec::from_raw_parts(y.as_mut_ptr() as *mut f64,
                        y.len(),
                        y.capacity())
};

这更复杂,但是它将重复使用相同的内存而不进行复制。

答案 1 :(得分:0)

您可以使用flatten()方法:

let y_vec: Vec<f64> = y.iter().flatten().cloned().collect();