我在编译时有一个大小未知的向量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,book,reference或rustbyexample.com中没有关于如何使用vector执行此类简单基本任务的任何信息。 这个解决方案有效,但我不认为这样做很好,逐个生成元素很奇怪,我不需要任何精确的元素值:
let mut temp: Vec<u32> = range(0u32, data.len() as u32).collect();
答案 0 :(得分:14)
这样做的推荐方法实际上是形成一个迭代器并将其收集到一个向量中。然而,你想要的并不是很清楚;如果你想要[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<_>>();
如果您只想预先分配适当数量的空间而不是将值推送到矢量上,Vec::with_capacity(capacity)
就是您想要的。
您还应该考虑是否需要它作为向量,或者是否可以直接使用迭代器。
答案 1 :(得分:12)
您可以使用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
这样,矢量将“延伸”在未初始化的内存上。如果你打算将它用作缓冲区,那么它是一种有效的方法,只要元素的类型是Copy
(原语是好的,但如果类型有析构函数,它将会破坏)。