在Rust中有效地复制相同向量的非重叠切片

时间:2017-07-13 13:16:14

标签: rust

我有一个Vec<T> T: Copy + Clone,我想有效地将​​一个矢量切片复制到同一个矢量的另一个切片,其中切片具有相同的长度并且不重叠。在C ++中,我会将std::memcpy用于同一目的。

我想:

我尝试过:

#[test]
fn copy_within_a_vector() {
    let mut data = vec![1, 2, 0, 0];
    let src = &data[0..2];
    let mut dst = &mut data[3..4];
    dst.copy_from_slice(src);
}

此代码甚至没有被编译,因为借用检查器抱怨同时借用data可变和不可变(并且它是正确的)。

是否可以重写代码以在稳定的Rust上编译?

相关问题:

1 个答案:

答案 0 :(得分:0)

如评论中所述,请使用here。然后,您可以使用split_at_mut

实施示例:

// split the slice in two mutable slices
// then copy one subslice to other
fn copy_within_a_slice<T: Clone>(v: &mut [T], from: usize, to: usize, len: usize) {
    if from > to {
        let (dst, src) = v.split_at_mut(from);
        dst[to..to + len].clone_from_slice(&src[..len]);
    } else {
        let (src, dst) = v.split_at_mut(to);
        dst[..len].clone_from_slice(&src[from..from + len]);
    }
}

fn main() {
    let mut v = (0..10).collect::<Vec<_>>();
    println!("{:?}", v);
    copy_within_a_slice(&mut v, 6, 1, 3);
    println!("{:?}", v);
}

<强>输出继电器:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 6, 7, 8, 4, 5, 6, 7, 8, 9]

不要忘记注意这些值,因为如果您不在界限内,代码会出现恐慌。