Используйте либо 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]);
См. Также: