如何制作接收大小的向量?

How to make a vector of received size?

我有一个向量 data,其大小在编译时未知。我想创建一个与该尺寸完全相同的新矢量。这些变体不起作用:

let size = data.len();

let mut try1: Vec<u32> = vec![0 .. size]; //ah, you need compile-time constant
let mut try2: Vec<u32> = Vec::new(size); //ah, there is no constructors with arguments

我有点沮丧 - 在 Rust API、书籍、参考或 rustbyexample.com 中没有任何关于如何使用 vector 完成如此简单的基本任务的信息。 这个解决方案有效,但我认为这样做不好,一个一个生成元素很奇怪,我不需要元素的任何精确值:

let mut temp: Vec<u32> = range(0u32, data.len() as u32).collect();

推荐的做法实际上是形成一个迭代器并将其收集到一个向量中。但是,您想要的并不十分清楚。如果你想要 [0, 1, 2, …, size - 1],你将创建一个范围并将其收集到一个向量中:

let x = (0..size).collect::<Vec<_>>();

(range(0, size) 现在写成 (0..size) 更好;range 功能很快就会从前奏中消失。)

如果你想要一个零向量,你应该这样写:

let x = std::iter::repeat(0).take(size).collect::<Vec<_>>();

如果您只想预分配适当数量的 space 而不是将值压入向量,Vec::with_capacity(capacity) 就是您想要的。

你还应该考虑是否需要它是一个向量,或者你是否可以直接使用迭代器。

您可以使用 Vec::with_capacity() 构造函数,然后进行不安全的 set_len() 调用:

let n = 128;
let v: Vec<u32> = Vec::with_capacity(n);
unsafe { v.set_len(n); }
v[12] = 64;  // won't panic

这样向量将"extend"覆盖未初始化的内存。如果你打算将它用作缓冲区,这是一种有效的方法,只要元素的类型是 Copy(原语没问题,但如果类型有析构函数,它会严重崩溃)。