std::vector
是 C++ 标准模板库(STL)中最常用的动态数组容器。它的核心特点是支持动态扩容和高效的随机访问。理解 std::vector
的原理以及 resize
、reserve
、size
和 capacity
的区别是面试中的常见问题。
1. std::vector
的原理
- 底层实现:
std::vector
基于动态数组实现,元素存储在连续的内存空间中。 - 动态扩容:
- 当元素数量超过当前容量时,
std::vector
会分配一块更大的内存(通常是当前容量的 2 倍或 1.5 倍)。 - 将原有元素拷贝到新内存中,然后释放旧内存。
- 当元素数量超过当前容量时,
- 随机访问:由于元素存储在连续内存中,可以通过下标直接访问元素,时间复杂度为 O(1)。
2. resize
和 reserve
的区别
(1)resize
- 功能:调整
std::vector
的大小(即元素数量)。 - 行为:
- 如果新的大小大于当前大小,则会在尾部添加默认初始化的元素。
- 如果新的大小小于当前大小,则会删除尾部的元素。
- 影响:
- 可能改变
size()
的值。 - 如果新的大小超过当前容量,会触发内存重新分配。
- 可能改变
(2)reserve
- 功能:调整
std::vector
的容量(即内存空间),但不改变元素数量。 - 行为:
- 如果新容量大于当前容量,则分配更大的内存空间。
- 如果新容量小于或等于当前容量,则不做任何操作。
- 影响:
- 改变
capacity()
的值。 - 不改变
size()
的值。
- 改变
3. size
和 capacity
的区别
(1)size
- 含义:当前
std::vector
中实际存储的元素数量。 - 返回值:
size()
返回std::vector
中元素的数量。
(2)capacity
- 含义:当前
std::vector
分配的内存空间可以容纳的元素数量。 - 返回值:
capacity()
返回std::vector
的容量。
4. size
和 capacity
的关系
size
:表示实际存储的元素数量。capacity
:表示当前分配的内存空间可以容纳的元素数量。- 关系:
size() <= capacity()
。
5. 动态扩容的示例
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec;
for (int i = 0; i < 10; ++i) {
vec.push_back(i);
std::cout << "Size: " << vec.size() << ", Capacity: " << vec.capacity() << std::endl;
}
return 0;
}
输出:
Size: 1, Capacity: 1
Size: 2, Capacity: 2
Size: 3, Capacity: 4
Size: 4, Capacity: 4
Size: 5, Capacity: 8
Size: 6, Capacity: 8
Size: 7, Capacity: 8
Size: 8, Capacity: 8
Size: 9, Capacity: 16
Size: 10, Capacity: 16
6. 总结
resize
:调整元素数量,可能改变size()
和capacity()
。reserve
:调整容量,只改变capacity()
,不改变size()
。size
:当前元素数量。capacity
:当前分配的内存空间可以容纳的元素数量。
在面试中,理解 std::vector
的动态扩容机制以及 resize
、reserve
、size
和 capacity
的区别是非常重要的。
THE END
暂无评论内容