Rust 为什么我推送的元素多于一个Vec';s容量?
我遇到了一个潜在的bug: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))
#[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==容量,推送和插入将(重新)分配。”