如何在不改变借位的情况下切换向量的两个部分?

时间:2019-06-21 09:45:26

标签: rust borrow-checker

我要在Vec中切换元素,但是我的解决方案存在所有权问题,我的代码完全错误吗?

给出[1, 2, 3, 4, 5, 6],预期输出为[4, 5, 6, 1, 2, 3]

fn switch(nums: &mut Vec<i32>, k: i32) {

    let t = k as usize;
    let v1 = &nums[..t];
    nums.drain(t..);
    nums.extend_from_slice(v1);

}
error[E0502]: cannot borrow `*nums` as mutable because it is also borrowed as immutable
 --> src/main.rs:7:5
  |
6 |     let v1 = &nums[..t];
  |               ---- immutable borrow occurs here
7 |     nums.extend_from_slice(v1);
  |     ^^^^^-----------------^^^^
  |     |    |
  |     |    immutable borrow later used by call
  |     mutable borrow occurs here

1 个答案:

答案 0 :(得分:2)

使用rotate_leftrotate_right,其中jupyter-notebook.exe是向量的中间。这将有效地执行预期的切换。

mid

使用let x = vec![1, 2, 3, 4, 5, 6]; let mid = x.len() / 2;

rotate_left

使用x.rotate_left(mid); assert_eq!(&x, &[4, 5, 6, 1, 2, 3]);

rotate_right

相同的方法可用于普通可变切片。如果要交换的两个分区具有相同的大小但不连续,则可以使用swap_with_slice ...

创建两个可变元素的迭代器并进行交换。
x.rotate_right(mid);
assert_eq!(&x, &[4, 5, 6, 1, 2, 3]);

...或将每个元素一一交换。

let (left, right) = x.split_at_mut(mid);
left.swap_with_slice(right);

另请参阅: