vector - 如何在 Rust 中为 Vec<T> 分配空间?

标签 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 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/

相关文章:

matlab - 在 MATLAB 中使用 If 语句进行可能的向量化

c++ - 用 vector 编写算法的问题

c++ - 自定义对象的vector如何设置大小?

rust - 如何在不阻塞父任务的情况下在另一个任务中生成长时间运行的 Tokio 任务?

tcp - 如何使用 Tokio 的 TcpStream 发送数据流?

asynchronous - 包装 AsyncRead `self` 具有匿名生命周期 `' _` but it needs to satisfy a ` 'static` 生命周期要求

vector - scheme中n皇后的解法

c++ - 如何插入嵌套 vector 而不使迭代器无效

traits - Option<T> 其中 T 可以是两个不同的特征?

rust - 为什么堆栈上的项目必须具有在编译时已知的大小?