矢量有一种交换整个项目的方法:
my_vector.swap(i, j)
对于大型结构的向量,我想只交换每个结构中的一些数据。
只交换某些结构成员的质朴方法是什么?
答案 0 :(得分:3)
您需要使用[_]::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 }]
“质朴”意味着有多种解决方案,但我认为不是,所以它并不真正相关。