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

标签 rust

我是使用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]);
}

最佳答案

您的示例中的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())
};

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

关于rust - 将Vec <[f64; 1]>转换为Vec <f64>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61660794/

相关文章:

rust - 返回捕获引用的高级闭包

asynchronous - 在oneshot channel : object safety error中使用 `DeserializedOwned`特征

types - 在 Rust 中重新定义类型并调用它们的函数

rust - 为什么 Rust borrow checker 会忽略函数参数中的可变指针?

rust - rust : the trait `std::future::Future` is not implemented for `()` 中新线程上的异步循环

rust - 为什么错误 "the trait ` Handler<_, _ >` is not implemented for ` ( )`"如果我只返回一个 fn ?

rust - Rust稳定的标准库是否使用不稳定的功能?

parallel-processing - 将 crossbeam 作用域线程与向量 block 结合使用

windows - 在 Windows 上将 Rust 代码链接到 boringssl 时未解析的外部符号 AES_set_encrypt_key

rust - 如何检查大于 2 ^ 54 的 u64 数是否可以被 f64 整除且精度损失最小?