Как мне переключить две секции вектора без конфликтующих заимствований? - PullRequest
0 голосов
/ 21 июня 2019

Я собираюсь переключать элементы в 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 Ответ

2 голосов
/ 21 июня 2019

Используйте либо 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]);

См. Также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...