Преобразовать Ve c <[f64; 1]> в Ve c - PullRequest
1 голос
/ 07 мая 2020

Я новичок в ржавчине и играю с ней. Когда я читал какой-то учебник, я нашел вектор типа <[f64,1]>. Я думал, что это должно быть просто преобразовать его в [f64], но не смог найти другого простого способа, кроме l oop. Есть ли другой способ?

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 ]

2 голосов
/ 07 мая 2020

y в вашем примере не является Vec; Вы, наверное, забыли vec! впереди. Кроме того, числа с плавающей запятой должны быть 1.0 не 1.

Я не знаю, почему вы считаете это для l oop непростым, но если вам нужны другие способы:

Использование шаблон итератора

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

Использование unsafe

Поскольку [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())
};

Это более сложно, но при этом будет повторно использоваться одна и та же память без копирования.

0 голосов
/ 08 мая 2020

вы можете использовать метод flatten():

let y_vec: Vec<f64> = y.iter().flatten().cloned().collect();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...