len()和capacity()有什么区别?

时间:2019-02-26 15:59:08

标签: rust

创建矢量时,长度和容量是相同的。这两种方法有什么区别?

fn main() {
    let vec = vec![1, 2, 3, 4, 5];
    println!("Length: {}", vec.len()); // Length: 5
    println!("Capacity: {}", vec.capacity()); // Capacity: 5
}

2 个答案:

答案 0 :(得分:3)

Growable vectors为将来的添加保留空间,因此分配的空间(容量)与实际使用的空间( length )之间的差异。

这在standard library's documentation for Vec中有解释:

  

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

     

例如,容量为10且长度为0的向量将是一个空向量,其空间可容纳10个以上元素。将10个或更少的元素推到向量上不会改变其容量或导致重新分配。但是,如果向量的长度增加到11,则必须重新分配,这可能会很慢。因此,建议尽可能使用Vec::with_capacity来指定期望矢量的大小。

答案 1 :(得分:1)

len()返回向量中元素的数量(即向量的长度)。在下面的示例中,vec包含5个元素,因此len()返回5

capacity()返回向量可以容纳的元素数量(不重新分配内存)。在下面的示例中,vec可以容纳105个元素,因为我们使用reserve()分配了除原始5个插槽之外的至少100个插槽(可能会分配更多插槽,以最大程度地减少数量分配)。

fn main() {
    let mut vec = vec![1, 2, 3, 4, 5];
    vec.reserve(100);
    assert!(vec.len() == 5);
    assert!(vec.capacity() >= 105);
}