如何为Rust中的Vec <t>分配空间?</t>

时间:2014-11-27 16:56:09

标签: vector rust

我想创建一个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填充它,但我不想这样做,因为我不总是知道,当在index {上写一个值时{1}},如果已经插入了一个值。出于明显的性能原因,我不想写出类似的内容:

i

当然,我也不能使用if i >= len(v) { v.push(x); } else { v[i] = x; } 语法。

2 个答案:

答案 0 :(得分:17)

虽然接受的答案中的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);
}

最后,有时您的向量包含基本类型的值,并且应该用作缓冲区(例如,在网络通信中)。在这种情况下,您可以使用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);
}

请注意,如果向量包含带有析构函数或引用的值,则必须格外小心 - 它很容易让析构函数在未初始化的内存块上运行或以这种方式获得无效引用。如果你只使用向量的初始化部分(你现在必须自己跟踪它),它也会正常工作。要了解未初始化内存的所有可能危险,您可以阅读mem::uninitialized()的文档。

答案 1 :(得分:8)

您可以使用the vec! macro的第一种语法,特别是vec![elem; count]。例如:

vec![1; 10]

将创建一个包含10个Vec<_>的{​​{1}}(类型1将在稍后确定,或默认为_)。提供给宏的i32必须实现elemClone也可以是变量。