我要在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
答案 0 :(得分:2)
使用rotate_left
或rotate_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);
另请参阅: