我正在尝试将一个Vec的内容复制到一个已存在的Vec中,以替换目标Vec的内容。
以下是我所期望的:
1. 不需要分配新内存(除非目标Vec太短),因为目标Vec已经被分配了。 2. 不应使用迭代器,因为memcopy足以完成工作。 3. 源Vec不应更改。 4. 最好使用安全方法。
以下是我尝试过的方法:
1. vec.clone():提供正确的内容,但会分配新内存,这对于将内容复制到已经存在且足够大的Vec中是不必要的。 2. vec.clear(); vec.extend():原地复制,但似乎在每个元素上使用了迭代器,这是不必要的,我只想要一个memcopy。 3. vec.copy_from_slice():正是我要找的,但需要完全相同大小的缓冲区,出于某种原因,我似乎无法获得相同大小的缓冲区。
以下是不起作用的内容。
以下是我所期望的:
1. 不需要分配新内存(除非目标Vec太短),因为目标Vec已经被分配了。 2. 不应使用迭代器,因为memcopy足以完成工作。 3. 源Vec不应更改。 4. 最好使用安全方法。
以下是我尝试过的方法:
1. vec.clone():提供正确的内容,但会分配新内存,这对于将内容复制到已经存在且足够大的Vec中是不必要的。 2. vec.clear(); vec.extend():原地复制,但似乎在每个元素上使用了迭代器,这是不必要的,我只想要一个memcopy。 3. vec.copy_from_slice():正是我要找的,但需要完全相同大小的缓冲区,出于某种原因,我似乎无法获得相同大小的缓冲区。
以下是不起作用的内容。
#![feature(shrink_to)]
fn vec_copy(src: &Vec<i32>, dst: &mut Vec<i32>) {
// Try to adjust dst buffer size... there should be a better way
if src.len() > dst.len() {
let addon = src.len() - dst.len();
dst.reserve_exact(addon);
} else {
dst.shrink_to(src.len());
}
// Do the copy
// panics! :
// thread 'main' panicked at libcore/slice/mod.rs:1645:9
// 'destination and source slices have different lengths'
//
dst.copy_from_slice(src.as_slice()); // <--- panics here
}
fn main() {
// Copy from a shorter Vec
let mut container = vec![1, 2];
let test1 = vec![3]; // shorter vec
println!("{:p} = {:?}", &container[0], container); // output: 0x7f00bda20008 = [1, 2]
vec_copy(&test1, &mut container); // panics inside function
println!("{:p} = {:?}", &container[0], container); // expected: 0x7f00bda20008 = [3]
// Copy from a longer Vec
container = vec![1, 2];
let test2 = vec![4, 5, 6]; // longer Vec
println!("{:p} = {:?}", &container[0], container); // output: 0x7fef5b820018 = [1, 2]
vec_copy(&test2, &mut container); // panics inside function
println!("{:p} = {:?}", &container[0], container); // expected: 0x7fef5b820018 = [4, 5, 6]
}
错误引发的紧急情况:
thread 'main' panicked at libcore/slice/mod.rs:1645:9,
'destination and source slices have different lengths'
问题
使用 vec.copy_from_slice()
似乎是将一个 Vec
的内容原地 memcopy 到另一个 Vec
中,而不需要进行不必要的内存分配和使用迭代器的方法。
如何设置目标 Vec
的大小,以便 vec.copy_from_slice()
不会引发 panic?