Arrays 如何在不同大小的阵列之间进行复制?
如果我有两个不同大小的阵列:Arrays 如何在不同大小的阵列之间进行复制?,arrays,rust,Arrays,Rust,如果我有两个不同大小的阵列: let mut array1 = [0; 8]; let array2 = [1, 2, 3, 4]; 如何将array2复制到array1的前4个字节中?我可以获取数组1的可变4字节片,但我不确定如何或是否可以分配给它。最灵活的方法是使用迭代器依次处理每个元素: for (place, data) in array1.iter_mut().zip(array2.iter()) { *place = *data } 创建指向切片/数组的可变引用。做同样的
let mut array1 = [0; 8];
let array2 = [1, 2, 3, 4];
如何将
array2
复制到array1
的前4个字节中?我可以获取数组1的可变4字节片,但我不确定如何或是否可以分配给它。最灵活的方法是使用迭代器依次处理每个元素:
for (place, data) in array1.iter_mut().zip(array2.iter()) {
*place = *data
}
创建指向切片/数组的可变引用。做同样的事,但要有耐心。采用两个迭代器并在锁步中对其进行遍历,以元组的形式生成这两个迭代器中的元素(并在其中一个迭代器停止时立即停止)
如果您需要/想要在写入place
之前对数据进行任何“花式”处理,这就是使用的方法
但是,普通复制功能也作为单一方法提供
- ,类似于
复制array1。从(array2)
- ,尽管您需要修剪这两个阵列,因为
要求它们的长度相同:copy\u memory
(如果您知道use std::cmp; use std::slice::bytes; let len = cmp::min(array1.len(), array2.len()); bytes::copy_memory(array1.mut_slice_to(len), array2.slice_to(len));
总是比array1
长,那么array2
也应该可以工作。)bytes::copy_memory(array1.mut_slice_to(array2.len()),array2)
bytes
版本优化效果最好,只需调用memcpy
,但希望rustc
/LLVM的改进最终能够实现这一点。可以手动完成
for (dst, src) in array1.iter_mut().zip(&array2) {
*dst = *src
}
对于一个典型的切片。然而,在从\u切片克隆\u方面可能有更快的专门化:
dst[..4].clone_from_slice(&src)
一种稍旧的方法是使用std::io::Write
,它是为和mut[u8]
实现的
use std::io::Write;
let _ = dst.write(&src)
这将写入到dst
的末尾,并返回结果中写入的值的数量。如果您使用write\u all
,如果不是所有字节都可以写入,这将返回一个Err
。您可以简单地使用:
fn main(){
让mut dest=[0;8];
设src=[1,2,3,4];
dest[…4]。从片复制片(&src);
断言(dest[1,2,3,4,0,0,0,0]);
}
相反情况:
fn main() {
let src = [1, 2, 3, 4, 5, 6, 7, 8];
let mut dest = [0; 4];
dest.copy_from_slice(&src[2..6]);
assert_eq!(dest, [3, 4 ,5, 6]);
}
合并案例:
fn main(){
设src=[1,2,3,4,5,6,7,8];
让mut dest=[0;4];
dest[1..3]。从_切片复制_(&src[3..5]);
断言(dest[0,4,5,0]);
}
请注意,mut_iter
已被重命名为iter_mut
,至少从1.0.0(可能更早?)开始可以确认,WiSaGaN。编辑答案以添加更正。