将 HashMap 转换为 Vector

Mar*_*yan 0 optimization memory-management rust

有没有办法在 Rust 中将 HashMap 转换为 Vector,无需复制元素,即将数据从哈希映射移动到向量?通过使用 iter+map+collect 需要复制哈希映射的所有元素,这不是最佳的,因为哈希映射不被假定进一步使用。在 Option 的情况下,它工作得很好,因为数据会自动移动,我们可以使用 as_ref 来阻止它。

我必须复制所有元素的代码示例

use std::collections::HashMap;

#[derive(Clone, Hash, PartialEq, Eq, Debug)]
struct base1 {
    x: i32,
}

#[derive(Clone, Debug)]
struct base2 {
    x: i32,
}

#[derive(Debug)]
struct ss {
    x: base1,
    y: base2,
}

fn main() {
    let mut map = HashMap::new();
    map.insert(base1 { x: 13 }, base2 { x: 13 });

    let vec: Vec<ss> = map
        .iter()
        .map(|x| ss {
            x: x.0.clone(),
            y: x.1.clone(),
        })
        .collect();
    println!("Ma13: {:?}", vec);
}
Run Code Online (Sandbox Code Playgroud)

Cha*_*man 6

没有办法重用内存,因为HashMap内存中的布局与Vec. 但是,如果您不再需要地图,则无需克隆,您可以使用into_iter()

let vec: Vec<ss> = map.into_iter().map(|x| ss { x: x.0, y: x.1 }).collect();
Run Code Online (Sandbox Code Playgroud)

与您的示例没有什么区别,因为i32克隆成本为零,但例如String它会有所作为。

您还可以进一步缩短它:

let vec: Vec<ss> = map.into_iter().map(|(x, y)| ss { x, y }).collect();
Run Code Online (Sandbox Code Playgroud)