我想创建一个 Vec<T>
并为它腾出一些空间,但我不知道该怎么做,而且令我惊讶的是,官方文档中几乎没有关于这种基本类型的内容。
let mut v: Vec<i32> = Vec<i32>(SIZE); // How do I do this ?
for i in 0..SIZE {
v[i] = i;
}
我知道我可以创建一个空的 Vec<T>
并填写 push
es,但我不想这样做,因为我并不总是知道,在索引 i
处写入值时,如果一个值已经插入那里。出于明显的性能原因,我不想写像这样的东西:
if i >= len(v) {
v.push(x);
} else {
v[i] = x;
}
当然,我不能使用 vec!
语法。
最佳答案
虽然 vec![elem; count]
从已接受的答案中足以创建一个所有元素都等于相同值的向量,还有其他方便的函数。
Vec::with_capacity()
创建一个具有给定容量但长度为零的向量。这意味着在达到此容量之前,push()
调用不会重新分配向量,从而使 push()
基本上是免费的:
fn main() {
let mut v = Vec::with_capacity(10);
for i in 0..10 {
v.push(i);
}
println!("{:?}", v);
}
您也可以轻松地collect()
来自迭代器的向量。示例:
fn main() {
let v: Vec<_> = (1..10).collect();
println!("{:?}", v);
}
最后,有时您的 vector 包含原始类型的值并且应该用作缓冲区(例如在网络通信中)。在这种情况下,您可以使用 Vec::with_capacity()
+ set_len()
不安全的方法:
fn main() {
let mut v = Vec::with_capacity(10);
unsafe { v.set_len(10); }
for i in 0..10 {
v[i] = i;
}
println!("{:?}", v);
}
请注意,如果您的 vector 包含带有析构函数或引用的值,您必须格外小心 - 很容易让析构函数运行在未初始化的内存片上或以这种方式获得无效引用。如果您只使用矢量的初始化部分,它也能正常工作(您现在必须自己跟踪它)。要了解未初始化内存的所有可能危险,您可以阅读 mem::uninitialized()
的文档。 .
关于vector - 如何在 Rust 中为 Vec<T> 分配空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27175685/