如何制作接收大小的向量?
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
(原语没问题,但如果类型有析构函数,它会严重崩溃)。
我有一个向量 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
(原语没问题,但如果类型有析构函数,它会严重崩溃)。