我有一个Vec<T>
T: Copy + Clone
,我想有效地将一个矢量切片复制到同一个矢量的另一个切片,其中切片具有相同的长度并且不重叠。在C ++中,我会将std::memcpy
用于同一目的。
我想:
std::ptr::copy_nonoverlapping
我尝试过:
#[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上编译?
相关问题:
答案 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]
不要忘记注意这些值,因为如果您不在界限内,代码会出现恐慌。