如何只交换向量中某个结构的某些成员?

时间:2016-08-12 04:42:33

标签: vector rust

矢量有一种交换整个项目的方法:

my_vector.swap(i, j)

对于大型结构的向量,我想只交换每个结构中的一些数据。

只交换某些结构成员的质朴方法是什么?

1 个答案:

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

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