作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我打算在 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
最佳答案
使用 rotate_left
或 rotate_right
,其中 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
:
x.rotate_right(mid);
assert_eq!(&x, &[4, 5, 6, 1, 2, 3]);
相同的方法可用于普通可变切片。如果要交换的两个分区大小相同但不连续,可以创建两个可变元素的迭代器并交换它们,使用 swap_with_slice
...
let (left, right) = x.split_at_mut(mid);
left.swap_with_slice(right);
... 或者通过一个一个地交换每个元素。
let (left, right) = x.split_at_mut(mid);
for (l, r) in Iterator::zip(left.iter_mut(), right.iter_mut()) {
std::mem::swap(l, r);
}
assert_eq!(&x, &[4, 5, 6, 1, 2, 3]);
另见:
关于rust - 如何在不冲突借用的情况下切换向量的两个部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56700889/
我是一名优秀的程序员,十分优秀!