如何在vector中交换结构体的部分成员



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 }]

"质朴"意味着有多种解决方案,但我不认为有,所以它并不真正相关。

最新更新