vector有一个交换整个项的方法:
my_vector.swap(i, j)
对于大结构体的向量,我只想交换每个结构体中的部分数据。
如何质朴的方式只交换结构体的一些成员?您需要使用[_]::split_at_mut
将切片分解为不相交的子集。这可以用来得到&mut _
到结构中。此时,您可以根据需要对元素进行mem::swap
。
#[derive(Debug)]
struct Big {
small: i32,
tiny: u8,
}
fn swap_smalls(bigs: &mut [Big], i: usize, j: usize) {
use std::cmp::{max, min};
use std::mem::swap;
if i == j { return; }
let (i, j) = (min(i, j), max(i, j));
let (left_slice, right_slice) = bigs.split_at_mut(j);
let left = &mut left_slice[i];
let right = &mut right_slice[0];
swap(&mut left.small, &mut right.small);
}
fn main() {
let mut bigs = vec![
Big { small: 4, tiny: 31 },
Big { small: 0, tiny: 2 },
Big { small: -7, tiny: 193 },
];
println!("before: {:?}", bigs);
swap_smalls(&mut bigs, 0, 2);
println!("after: {:?}", bigs);
}
输出:
before: [Big { small: 4, tiny: 31 }, Big { small: 0, tiny: 2 }, Big { small: -7, tiny: 193 }]
after: [Big { small: -7, tiny: 31 }, Big { small: 0, tiny: 2 }, Big { small: 4, tiny: 193 }]
"质朴"意味着有多种解决方案,但我不认为有,所以它并不真正相关。