我遇到了这个潜在的错误:
#[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);
}
我在Windows 10上使用Rust v1.26.0(a77568041 2018-05-07)
当我编译并运行上述程序时,由于指定的容量为1,并且使用了3次push,但输出正确,所以我会期望出现错误:
[Int(5), Float(5.0), Word("ABC")]
Vec
可以动态增长,类似于C ++的std::vector
。您指定的事实with_capacity
只是意味着它可以容纳许多元素而无需重新分配。请参阅有关文档Vec::with_capacity
:
构造一个新的
Vec<T>
具有指定容量的空容器。该向量将能够完全保留
capacity
元素而无需重新分配。如果capacity
为0,则不会分配向量。重要的是要注意,尽管返回的向量具有指定的容量,但是向量的长度为零。有关长度和容量之间差异的说明,请参见容量和重新分配。
这是的容量和重新分配Vec
文档的摘录:
向量的容量是为将添加到向量上的任何将来元素分配的空间量。请勿将其与向量的长度混淆,后者指定了向量中实际元素的数量。如果向量的长度超过其容量,则其容量将自动增加,但必须重新分配其元素。
例如,容量为10且长度为0的向量将是一个空向量,具有10个以上元素的空间。将10个或更少的元素推到向量上不会改变其容量或引起重新分配。但是,如果向量的长度增加到11,则必须重新分配,这可能会很慢。因此,建议尽可能使用
Vec::with_capacity
指定向量的大小。
这不同于固定长度的数组,该长度不能超过指定的长度。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句