我有下面的一段代码,它工作得很好,但我对 for 循环中需要
clone
感到有点困扰。原则上,调用 a.clear()
后不再需要该向量,因此可以在该循环内使用它,但如果没有 clone
,代码将无法编译。有没有一种聪明的方法可以解决这个问题,将 self.a[i].v
移动到新的 AStruct
而不是克隆它?
use std::collections::HashMap;
#[derive(Debug)]
struct AStruct {
v: Vec<i32>,
w: i32,
}
struct TestStruct {
a: Vec<AStruct>,
}
impl TestStruct {
fn test(&mut self) {
let mut h: HashMap<Vec<i32>, i32> = HashMap::new();
for x in &self.a {
let key = x.v.clone();
let entry = h.entry(key).or_insert(0);
*entry += x.w;
}
self.a.clear();
for (key, value) in h {
self.a.push( AStruct {
v: key,
w: value,
} );
}
}
}
fn main() {
let a = AStruct {
v: vec![1, 2, 3],
w: 4,
};
let mut t = TestStruct { a: vec![a] };
t.test();
println!("{:?}", t.a);
}
感谢评论,我最终找到了解决方案
impl TestStruct {
fn test(&mut self) {
let mut h: HashMap<Vec<i32>, i32> = HashMap::new();
let y: Vec<AStruct> = self.a.drain(..).collect();
for mut x in y {
let key = x.v.drain(..).collect();
let entry = h.entry(key).or_insert(0);
*entry += x.w;
}
for (key, value) in h {
self.a.push( AStruct {
v: key,
w: value,
} );
}
}
}