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

问题描述 投票:0回答:2

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

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

Growable vectors为未来的增加预留空间,因此分配的空间(容量)与实际使用的空间(长度)之间存在差异。

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

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

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


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);
}
© www.soinside.com 2019 - 2024. All rights reserved.