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

4
当我创建一个向量时,长度和容量相同。这些方法之间有什么区别?
fn main() {
    let vec = vec![1, 2, 3, 4, 5];
    println!("Length: {}", vec.len()); // Length: 5
    println!("Capacity: {}", vec.capacity()); // Capacity: 5
}

8
在提问之前,始终查看标准文档。 - Denys Séguret
2
可能是 size vs capacity of a vector? 的重复问题。 - hellow
2个回答

9

可增长向量 为未来的添加预留了空间,因此分配的空间(容量)和实际使用的空间(长度)之间存在差异。

这在标准库文档中关于Vec的说明中有解释:

一个向量的容量是为未来添加到向量中的任何元素分配的空间量。这与向量的长度不同,向量的长度指定向量中实际元素的数量。如果向量的长度超过其容量,则其容量将自动增加,但其元素必须重新分配。
例如,具有容量为10且长度为0的向量是具有10个更多元素空间的空向量。将10个或更少的元素推入向量不会改变其容量或导致重新分配发生。但是,如果向量的长度增加到11,则必须重新分配,这可能很慢。因此,建议尽可能使用`Vec::with_capacity`来指定向量预期的大小。

2

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

capacity()函数返回向量可以容纳的元素数量(不需要重新分配内存)。在下面的例子中,vec可以容纳105个元素,因为我们使用reserve()来至少分配100个插槽以及原始的5个插槽(可能会分配更多的插槽以最小化分配次数)。

Translated:
`len()` 函数返回向量中元素的数量(即向量的长度)。在下面的例子中,`vec` 包含 5 个元素,所以 `len()` 返回 `5`。
`capacity()` 函数返回向量 **可容纳** 的元素数量(无需重新分配内存)。在下面的例子中,`vec` 可以容纳 `105` 个元素,因为我们使用 `reserve()` 来至少分配 100 个插槽以及原始的 5 个插槽(可能会分配更多的插槽以最小化分配次数)。
fn main() {
    let mut vec = vec![1, 2, 3, 4, 5];
    vec.reserve(100);
    assert!(vec.len() == 5);
    assert!(vec.capacity() >= 105);
}

2
顺便提一下,使用 assert_eq!(vec.len(), 5); 更为常规。 - Shepmaster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接