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)
没有办法重用内存,因为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)