交换切片的元素(就地) [英] Swapping Elements of a Slice (in-place)
问题描述
问题不会更新更多代码,以免进一步增加混乱.
The question will not be updated with even more code to not further increase clutter.
我正在尝试顺时针旋转 Vec
中的所有元素.向量保证是方形的,如 v.len() == v[0].len()
.
I'm trying to rotate all elements in a Vec<Vec<T>>
clockwise.
The vector is guaranteed to be square, as in v.len() == v[0].len()
.
这个想法是
- 找到所有在旋转对称下等价的元素
v
的中心 - 使用 std::mem::swap 就地交换这些元素
我当前的代码不会改变 vec 的状态.我该如何解决这个问题?
My current code does not change the state of the vec. How do I fix this?
fn rotate<T>(v: &mut Vec<Vec<T>>) {
// swap elements equivalent to position i on each ring r
// limit l = side length of current ring
//
// + 0 - - - - + r = 0 -> l = 6
// | + 1 - - + | r = 1 -> l = 4
// | | + 2 + | | r = 2 -> l = 2
// | | | | | |
// | | + - + | | swap:
// | + - - - + | a b c d
// + - - - - - + > b a c d
// > c a b d
// > d a b c
for r in 0..((v.len() + 1) / 2 {
let l = v.len() - 1 - r;
for i in r..l {
let mut a = & pieces[ r ][ r+i ];
let mut b = & pieces[ r+i ][ l-r ];
let mut c = & pieces[ l-r ][l-r-i];
let mut d = & pieces[l-r-i][ r ];
_rot_cw(&mut a, &mut b, &mut c, &mut d)},
}
}
fn _rot_cw<T>(a: &mut T, b: &mut T, c: &mut T, d: &mut T) {
//rotates a->b, b->c, c->d, d->a
std::mem::swap(a, b);
std::mem::swap(a, c);
std::mem::swap(a, d);
}
}
感谢@Jmb,修复了上面原始代码中的小问题.这是我当前的代码,再次遇到借用问题:
Fixed minor issues in the original code above, thanks to @Jmb.
Here's my current code, again running into borrowing issues:
fn rotate_square_slice<T>(slice: &mut Vec<T>, rows: usize) {
for r in 0..(slice.len()+1)/2 {
let l = slice.len() -1 - r;
for i in r..l {
let a = &mut slice.get_mut(rows * r + r+i ).unwrap();
let b = &mut slice.get_mut(rows * (r+i) + l-r ).unwrap();
let c = &mut slice.get_mut(rows * (l-r) + l-r-i).unwrap();
let d = &mut slice.get_mut(rows * (l-r-i) + r ).unwrap();
std::mem::swap(a, b);
std::mem::swap(a, c);
std::mem::swap(a, d);
}
}
}
推荐答案
可以使用 切片的swap()
方法.
解决那个问题,代码现在看起来像这样:
Swapping elements in a slice can be done by using the slice's swap()
method.
Solving that problem, the code now looks like this:
fn rotate_square_slice<T>(slice: &mut [T], size: usize) {
for r in 0..(size + 1) / 2 {
let l = size - 1 - r;
for i in r..l {
// b, c & d are the indices with rotational symmetry to a,
// shifted by 90°, 180° & 270° respectively
let a = size * r + r+i ;
let b = size * (r+i) + l-r ;
let c = size * (l-r) + l-r-i;
let d = size * (l-r-i) + r ;
slice.swap(a, b);
slice.swap(a, c);
slice.swap(a, d);
}
}
}
但是,我遇到了正确索引切片的问题.问题可以在这里找到:
I have, however, run into an issue with correctly indexing the slice. The question can be found here:
这篇关于交换切片的元素(就地)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!