Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 为什么我推送的元素多于一个Vec';s容量?_Rust - Fatal编程技术网

Rust 为什么我推送的元素多于一个Vec';s容量?

Rust 为什么我推送的元素多于一个Vec';s容量?,rust,Rust,我遇到了一个潜在的bug: #[derive(Debug)] enum StackType { Int(i64), Float(f64), Word(String), } fn main() { let mut stack: Vec<StackType> = Vec::with_capacity(1); stack.push(StackType::Int(5)); stack.push(StackType::Float(5_f64))

我遇到了一个潜在的bug:

#[derive(Debug)]
enum StackType {
    Int(i64),
    Float(f64),
    Word(String),
}

fn main() {
    let mut stack: Vec<StackType> = Vec::with_capacity(1);
    stack.push(StackType::Int(5));
    stack.push(StackType::Float(5_f64));
    stack.push(StackType::Word(String::from("ABC")));
    println!("{:?}", stack);
}

Vec
可以动态增长,它类似于C++的
std::vector
。您使用_capacity指定
,这一事实仅仅意味着它可以容纳那么多元素,而无需重新分配。见:

构造具有指定容量的新空
Vec

矢量将能够准确地容纳
容量
元素,而无需重新分配。如果
容量
为0,向量将不分配

需要注意的是,尽管返回的向量具有指定的容量,但向量的长度为零。有关长度和容量之间差异的说明,请参见

以下是
Vec
的文档节选:

向量的容量是为将来添加到向量上的任何元素分配的空间量。这不能与向量的长度混淆,后者指定向量中实际元素的数量。如果向量的长度超过其容量,其容量将自动增加,但其元素必须重新分配

例如,容量为10且长度为0的向量将是一个空向量,其空间可容纳10个以上的元素。将10个或更少的元素推到向量上不会改变其容量或导致重新分配。然而,如果向量的长度增加到11,它将不得不重新分配,这可能会很慢。出于这个原因,建议尽可能使用它来指定向量的预期大小


这与不超过指定长度的不同。

如果需要,它将重新分配。一些重要的阅读。具体来说:“如果报告的容量足够,推送和插入将永远不会(重新)分配。如果len==容量,推送和插入将(重新)分配。”