在Rust中,我有Vec
的{{1}}。我想将一个子Vec
的内容与另一个子内容合并。
这是我的代码:
Vec
问题在于,我不能两次借用let mut a = vec![vec![1, 2, 3], vec![3, 4, 5, 6], vec![8, 9]];
a[0].append(&mut a[1]);
assert_eq!(&a, &[vec![1, 2, 3, 3, 4, 5, 6], vec![], vec![8, 9]])
都是可变的。
解决问题的最有效,最惯用的方法是什么?
答案 0 :(得分:2)
您可以使用fold在一个循环中实现它
fn main() {
let mut a = vec![vec![1, 2, 3], vec![3, 4, 5, 6], vec![8, 9]];
a.iter_mut()
.fold(&mut Vec::new(), |previous_vec, current_vec| {
if previous_vec.len() > 0
&& current_vec.len() > 0
&& previous_vec.last() == current_vec.first()
{
previous_vec.append(current_vec);
return previous_vec;
}
current_vec
});
assert_eq!(a, vec![vec![1, 2, 3, 3, 4, 5, 6], vec![], vec![8, 9]]);
}
您可以在Playground
中对其进行测试答案 1 :(得分:0)
我认为将extend
与iter
或drain
迭代器一起使用的最佳解决方案
let mut v1 = vec![1,2,3];
let mut v2 = vec![3,4,5];
if v1[v1.len()-1] == v2[0] {
v1.extend(v2[1..].iter()); // clones elemts
println!("{:?}", v1);
v1.extend(v2.drain(1..)); // drained from second vector this time
println!("{:?}", v2);
}
您将切片传递到extend
,如果要移动切片,请使用drain
或iter
进行克隆。未耗尽的元素将留在第二个向量中。
更新:对问题进行更改后,您可能应该在检查后将内部vec移至某个临时vec,然后将其与extend合并