我可以把一个向量中的一个子向量的项加到同一向量中的另一个子向量上吗

  • 本文关键字:向量 一个 另一个 我可以 rust
  • 更新时间 :
  • 英文 :


我正在编写代码,我的意思是将向量保存在一个更大的向量中。稍后,我想将其中一个向量的值附加到另一个向量,并移除我传递了值的向量。

我已经做了两次尝试,但都失败了,如果有人能帮我,我将不胜感激!

我使用的代码如下:

fn my_func(distribution: (u16, u8, u8, u8, u8, u8)) {
let mut covered: Vec<(Vec<usize>, u16)> = vec![
(vec![0], distribution.1.into()),
(vec![1], distribution.2.into()),
(vec![2], distribution.3.into()),
(vec![3], distribution.4.into()),
(vec![4], distribution.5.into()),
];
// Attempt 1 - Error: borrowed as mutable more than once
&covered[0].0.append(&mut covered[1].0);
// Attempt 2 - Error: borrowed as mutable and immutable
for i in &covered[1].0 {
&covered[0].0.push(*i);
}
}

我对Rust还比较陌生,所以我仍在学习借贷的复杂性。有人能帮我理解我该如何完成我想完成的事情吗?关于我的编码风格或我犯的其他错误的任何其他评论也非常受欢迎。

假设我正确理解你要做的事情。那么你就试图在两个不同的索引上可变地借用covered。您的方法不起作用,因为covered[0]会导致整个Vec被可变地借用。您只能获得1个可变引用,这就是为什么后续的covered[1]会导致错误的原因。

实现您正在尝试的内容的一个解决方案是使用split_at_mut()。然后,您可以从covered中获得2个可变切片,然后可以对每个切片进行索引。

这与所谓的";拆分借款";。

fn func(distribution: (u16, u8, u8, u8, u8, u8)) {
let mut covered: Vec<(Vec<usize>, u16)> = vec![
(vec![0], distribution.1.into()),
(vec![1], distribution.2.into()),
(vec![2], distribution.3.into()),
(vec![3], distribution.4.into()),
(vec![4], distribution.5.into()),
];
let (left, right) = covered.split_at_mut(1);
let v0 = &mut left[0];
let v1 = &mut right[0];
// Now both this
v0.0.append(&mut v1.0);
// and this works
for i in &v1.0 {
v0.0.push(*i);
}
}

注意,正如Aplet123在评论中提到的,append()otherVec移动所有元素,使其为空。如果不希望清除otherVec,请改用extend()extend_from_slice()


如果您事先知道可以从Vec中移除项目。那么在这种情况下就不需要使用split_at_mut()了。然后你可以按照雷德博格提到的那样做,只需remove()物品,然后像其他情况一样借用。

fn my_func(distribution: (u16, u8, u8, u8, u8, u8)) {
let mut covered: Vec<(Vec<usize>, u16)> = vec![
(vec![0], distribution.1.into()),
(vec![1], distribution.2.into()),
(vec![2], distribution.3.into()),
(vec![3], distribution.4.into()),
(vec![4], distribution.5.into()),
];
let mut v1 = covered.remove(1);
let v0 = &mut covered[0];
// Now both this
v0.0.append(&mut v1.0);
// and this works
for i in &v1.0 {
v0.0.push(*i);
}
}

最新更新