Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何在不同大小的阵列之间进行复制?_Arrays_Rust - Fatal编程技术网

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。编辑答案以添加更正。